本文和大家分享的主要是Python MySQL
數(shù)據(jù)庫連接池組件相關(guān)內(nèi)容,一起來看看吧,希望對大家
學習python有所幫助。
pymysqlpool
是數(shù)據(jù)庫工具包中新成員,目的是能提供一個實用的數(shù)據(jù)庫連接池中間件,從而避免在應用中頻繁地創(chuàng)建和釋放數(shù)據(jù)庫連接資源。
pymysqlpool
功能
1.
連接池本身是線程安全的,可在多線程環(huán)境下使用,不必擔心連接資源被多個線程共享的問題;
2.
提供盡可能緊湊的接口用于數(shù)據(jù)庫操作;
3.
連接池的管理位于包內(nèi)完成,客戶端可以通過接口獲取池中的連接資源(返回
pymysql.Connection
);
4.
將最大程度地與
dataobj
等兼容,便于使用;
5.
連接池本身具備動態(tài)增加連接數(shù)的功能,即
max_pool_size
和
step_size
會用于控制每次增加的連接數(shù)和最大連接數(shù);
6.
連接池最大連接數(shù)亦動態(tài)增加,需要開啟
enable_auto_resize
開關(guān),此后當任何一次連接獲取超時發(fā)生,均記為一次懲罰,并且將
max_pool_size
擴大一定倍數(shù)。
基本工作流程
注意,當多線程同時請求時,若池中沒有可用的連接對象,則需要排隊等待
1.
初始化后優(yōu)先創(chuàng)建
step_size
個連接對象,放在連接池中;
2.
客戶端請求連接對象,連接池會從中挑選最近沒使用的連接對象返回(同時會檢查連接是否正常);
3.
客戶端使用連接對象,執(zhí)行相應操作后,調(diào)用接口返回連接對象;
4.
連接池回收連接對象,并將其加入池中的隊列,供其它請求使用。
參數(shù)配置
· pool_name:
連接池的名稱,多種連接參數(shù)對應多個不同的連接池對象,多單例模式;
· host:
數(shù)據(jù)庫地址
· user:
數(shù)據(jù)庫服務器用戶名
· password:
用戶密碼
· database:
默認選擇的數(shù)據(jù)庫
· port:
數(shù)據(jù)庫服務器的端口
· charset:
字符集,默認為
'utf8'
· use_dict_cursor:
使用字典格式或者元組返回數(shù)據(jù);
· max_pool_size:
連接池優(yōu)先最大連接數(shù);
· step_size:
連接池動態(tài)增加連接數(shù)大?。?/span>
· enable_auto_resize:
是否動態(tài)擴展連接池,即當超過
max_pool_size
時,自動擴展
max_pool_size
;
· pool_resize_boundary:
該配置為連接池最終可以增加的上上限大小,即時擴展也不可超過該值;
· auto_resize_scale:
自動擴展
max_pool_size
的增益,默認為 1.5
倍擴展;
· wait_timeout:
在排隊等候連接對象時,最多等待多久,當超時時連接池嘗試自動擴展當前連接數(shù);
· kwargs:
其他配置參數(shù)將會在創(chuàng)建連接對象時傳遞給
pymysql.Connection
使用示例
1.
使用
cursor
上下文管理器(快捷方式,但每次獲取都會申請連接對象,多次調(diào)用效率不高):
from pymysqlpool
import ConnectionPool
config = {
'pool_name': 'test',
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': 'root',
'database': 'test'
}
def
connection_pool():
# Return a connection pool instance
pool = ConnectionPool(**config)
pool.connect()
return pool
#
直接訪問并獲取一個
cursor
對象,自動
commit
模式會在這種方式下啟用
with connection_pool().cursor()
as cursor:
print('Truncate table user')
cursor.execute('TRUNCATE user')
print('Insert one record')
result = cursor.execute('INSERT INTO user (name, age) VALUES (%s, %s)', ('Jerry', 20))
print(result, cursor.lastrowid)
print('Insert multiple records')
users = [(name, age)
for name
in ['Jacky', 'Mary', 'Micheal']
for age
in range(10, 15)]
result = cursor.executemany('INSERT INTO user (name, age) VALUES (%s, %s)', users)
print(result)
print('View items in table user')
cursor.execute('SELECT * FROM user')
for user
in cursor:
print(user)
print('Update the name of one user in the table')
cursor.execute('UPDATE user SET name="Chris", age=29 WHERE id = 16')
cursor.execute('SELECT * FROM user ORDER BY id DESC LIMIT 1')
print(cursor.fetchone())
print('Delete the last record')
cursor.execute('DELETE FROM user WHERE id = 16')
2.
使用
connection
上下文管理器:
import pandas
as pd
from pymysqlpool
import ConnectionPool
config = {
'pool_name': 'test',
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': 'root',
'database': 'test'
}
def
connection_pool():
# Return a connection pool instance
pool = ConnectionPool(**config)
pool.connect()
return pool
with connection_pool().connection()
as conn:
pd.read_sql('SELECT * FROM user', conn)
#
或者
connection = connection_pool().borrow_connection()
pd.read_sql('SELECT * FROM user', conn)
connection_pool().return_connection(connection)
依賴
1.
pymysql
:將依賴該工具包完成數(shù)據(jù)庫的連接等操作;
2.
pandas
:測試時使用了 pandas
。
來源:
簡書