1 簡介
DBUtils是一套Python數據庫連接池包,並允許對非線程安全的數據庫接口進行線程安全包裝。DBUtils來自Webware for Python。
DBUtils提供兩種外部接口:
- * PersistentDB :提供線程專用的數據庫連接,並自動管理連接。
- * PooledDB :提供線程間可共享的數據庫連接,並自動管理連接。
實測證明 PersistentDB 的速度是最高的,但是在某些特殊情況下,數據庫的連接過程可能異常緩慢,而此時的PooledDB則可以提供相對來說平均連接時間比較短的管理方式。
另外,實際使用的數據庫驅動也有所依賴,比如SQLite數據庫只能使用PersistentDB作連接池。 下載地址:http://www.webwareforpython.org/downloads/DBUtils/
2 使用方法
連接池對象只初始化一次,一般可以作為模塊級代碼來確保。 PersistentDB的連接例子:
import DBUtils.PersistentDB
persist=DBUtils.PersistentDB.PersistentDB(dbpai=MySQLdb,maxusage=1000,**kwargs)
這里的參數dbpai指使用的底層數據庫模塊,兼容DB-API的。maxusage則為一個連接最大使用次數,參考了官方例子。后面的**kwargs則為實際傳遞給MySQLdb的參數。
獲取連接: conn=persist.connection() 實際編程中用過的連接直接關閉 conn.close() 即可將連接交還給連接池。
PooledDB使用方法同PersistentDB,只是參數有所不同。
- * dbapi :數據庫接口
- * mincached :啟動時開啟的空連接數量
- * maxcached :連接池最大可用連接數量
- * maxshared :連接池最大可共享連接數量
- * maxconnections :最大允許連接數量
- * blocking :達到最大數量時是否阻塞
- * maxusage :單個連接最大復用次數
- * setsession :用於傳遞到數據庫的准備會話,如 [”set name UTF-8″] 。
一個使用過程:
db=pooled.connection()
cur=db.cursor()
cur.execute(sql)
res=cur.fetchone()
cur.close() # or del cur
db.close() # or del db
DBUtils功能
功能
SimplePooledDB
DBUtils.SimplePooledDB 是一個非常簡單的數據庫連接池實現。他比完善的 PooledDB 模塊缺少很多功能。 DBUtils.SimplePooledDB 本質上類似於 MiscUtils.DBPool 這個Webware的組成部分。你可以把它看作一種演示程序。
SteadyDB
DBUtils.SteadyDB 是一個模塊實現了”強硬”的數據庫連接,基於DB-API 2建立的原始連接。一個”強硬”的連接意味着在連接關閉之后,或者使用次數操作限制時會重新連接。
一個典型的例子是數據庫重啟時,而你的程序仍然在運行並需要訪問數據庫,或者當你的程序連接了一個防火牆后面的遠程數據庫,而防火牆重啟時丟失了狀態時。
一般來說你不需要直接使用 SteadyDB 它只是給接下來的兩個模塊提供基本服務, PersistentDB 和 PooledDB 。
PersistentDB
DBUtils.PersistentDB 實現了強硬的、線程安全的、頑固的數據庫連接,使用DB-API 2模塊。如下圖展示了使用 PersistentDB 時的連接層步驟:
persist.gif當一個線程首次打開一個數據庫連接時,一個連接會打開並僅供這個線程使用。當線程關閉連接時,連接仍然持續打開供這個線程下次請求時使用這個已經打開的連接。連接在線程死亡時自動關閉。
簡單的來說 PersistentDB 嘗試重用數據庫連接來提高線程化程序的數據庫訪問性能,並且他確保連接不會被線程之間共享。
因此, PersistentDB 可以在底層DB-API模塊並非線程安全的時候同樣工作的很好,並且他會在其他線程改變數據庫會話或者使用多語句事務時同樣避免問題的發生。
PooledDB
DBUtils.PooledDB 實現了一個強硬的、線程安全的、有緩存的、可復用的數據庫連接,使用任何DB-API 2模塊。如下圖展示了使用 PooledDB 時的工作流程:
pool.gif如圖所示 PooledDB 可以在不同線程之間共享打開的數據庫連接。這在你連接並指定 maxshared 參數,並且底層的DB-API 2接口是線程安全才可以,但是你仍然可以使用專用數據庫連接而不在線程之間共享連接。除了共享連接以外,還可以設立一個至少 mincached 的連接池,並且最多允許使用 maxcached 個連接,這可以同時用於專用和共享連接池。當一個線程關閉了一個非共享連接,則會返還到空閑連接池中等待下次使用。
如果底層DB-API模塊是非線程安全的,線程鎖會確保使用 PooledDB 是線程安全的。所以你並不需要為此擔心,但是你在使用專用連接來改變數據庫會話或執行多命令事務時必須小心。
該選擇哪一個?
PersistentDB 和 PooledDB 都是為了重用數據庫連接來提高性能,並保持數據庫的穩定性。
所以選擇何種模塊,可以參考上面的解釋。 PersistentDB 將會保持一定數量的連接供頻繁使用。在這種情況下你總是保持固定數量的連接。如果你的程序頻繁的啟動和關閉線程,最好使用 PooledDB 。后面將會提到更好的調整,尤其在使用線程安全的DB-API 2模塊時。
當然,這兩個模塊的接口是很相似的,你可以方便的在他們之間轉換,並查看哪個更好一些。