python資料庫連線工具DBUtils

2021-09-12 22:16:09 字數 2901 閱讀 4738

dbutils是乙個允許在多執行緒python應用和資料庫之間安全及高效連線的python模組套件。

dbutils套件包含兩個模組子集,乙個適用於相容db-api 2介面的模組,乙個適用於pygresql的模組。

dbutils.******pooleddb是池化資料庫連線中非常基礎的一種實現。相較於pooleddb,它並不那麼複雜,且缺少failover機制。******pooleddb應視為一種概念演示,不要直接在生產環境使用。

dbutils.steadydb基於相容db-api 2介面的資料庫模組建立的普通連線,實現了"加強"連線。具體指當資料庫連線關閉、丟失或使用頻率超出限制時,將自動重新獲取連線。

典型的應用場景如下:在某個維持了某些資料庫連線的程式執行時重啟了資料庫,或在某個防火牆隔離的網路中訪問遠端資料庫時重啟了防火牆。

dbutils.persistentdb實現了穩定,執行緒仿射(thread-affine),持久化的資料庫連線。下圖顯式了使用persistentdb進行連線時涉及的連線層:

簡而言之:persistentdb會**資料庫連線從而在整體上增加多執行緒應用的資料庫訪問效能,它確保執行緒之間永遠不會共享連線。

因此即使底層的db-api模組不是connection級別的執行緒安全,persistentdb也可以完美實現執行緒安全,避免在其他執行緒更改資料庫會話或執行跨多個sql指令的事務時出現問題。

要使用persistentdb模組,首先傳遞以下引數建立persistentdb例項:

import pymysql

from dbutils.persistentdb import persistentdb

persist = persistentdb(creator=pymysql, user="root", passwd="123456", db="test")

# conn的使用和常規db-api 2介面類似

conn = persist.connection()

note:需要在連線上呼叫begin()方法明確開啟事務。這可以確保a.只在事務完成時才重新開啟連線b.連線被同乙個執行緒重用時回滾。

dbutils.pooleddb實現了穩定、執行緒安全的快取連線池。下圖顯式了使用pooleddb進行連線時涉及的連線層:

使用正整數的maxshared引數和connection級別的執行緒安全的creator引數建立連線池時,連線池中的連線預設是執行緒間共享的。但仍可以請求非執行緒共享的專用資料庫連線。

除了共享連線池外,還可以建立至少mincached個,至多maxcached個連線的空閒連線池,在共享連線池未滿(不太理解)或執行緒請求專用資料庫連線時使用。當某個執行緒關閉不再共享的連線時,該連線將**到空閒連線池以便再次使用。

如果底層的db-api 2模組非執行緒安全,將使用執行緒鎖確保pooleddb連線是執行緒安全的。但對於執行緒專用的連線,要小心更改資料庫會話或執行跨多個sql指令的事務帶來的不良影響。

要使用pooldb模組,首先傳遞以下引數建立pooldb例項:

import pymysql

from dbutils.pooleddb import pooleddb

pool = pooleddb(creator=pymysql, 5, user="root", passwd="123456", db="test")

# conn的使用和常規db-api 2介面類似

conn = pool.connection()

對於執行緒共享的連線池,可以用以下方式獲取執行緒專用連線:

conn = pool.connection(shareable=false)

# 或者

conn = pool.dedicated_connection()

對於不再使用的連線,呼叫close()方法**到連線池。

在多執行緒環境中,不要寫以下**,這會導致連線過早釋放並被其他執行緒重用,如果連線非執行緒安全可能導致程式出現嚴重錯誤:

pool.connection().cursor().execute(...)
note:需要在連線上呼叫begin()方法明確開啟事務。這可以確保a.只在事務完成時才重新開啟連線b.連線在返回連線池之前執行回滾c.連線不會被其他執行緒共享

pooleddb和persistentdb都通過**資料庫連線,且即使資料庫連線中斷也能保持穩定性的方式從而達到提公升資料庫訪問效能的目的。在現實場景中應該如何選擇呢?對於保持常量執行緒數且頻繁使用資料庫的應用,使用persistentdb;對於頻繁開啟、結束執行緒的應用,使用pooleddb。

如果程式中使用了orm框架,如sqlobjectsqlalchemy,不需要使用dbutils,因為這些框架自身維護了連線池。

資料庫執行緒安全級別:

比如pymysql就是可以共享模組但不能共享連線,檢視方式pymysql.threadsafety

Python連線DB2資料庫基本

看 說話,這裡使用的python版本為3.5首先需要匯入的ibm的資料報 ibm db 簡單使用如下,詳細專案看另外一篇。coding import ibm db import time conn ibm db.connect database edw hostname 輸入ip port 埠 pr...

Python連線DB2資料庫基本

看 說話,這裡使用的python版本為3.5首先需要匯入的ibm的資料報 ibm db 簡單使用如下,詳細專案看另外一篇。coding import ibm db import time conn ibm db.connect database edw hostname 輸入ip port 埠 pr...

Oracle 資料庫連線工具

公司內部用著各種工具,我見到新的工具,都會去嘗試一下.主要的幾款如下 sql plus 這是oracle 資料庫的命令列工具,功能強大,但是學習成本高,要記住非常多的命令和選項.不太方便.pl sql developer 這是第三方開發的工具,用於編寫pl sql 除錯,檢視執行計畫等等功能.比較方...