成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

python數(shù)據(jù)庫(kù)連接工具DBUtils

xingqiba / 2034人閱讀

摘要:是一個(gè)允許在多線(xiàn)程應(yīng)用和數(shù)據(jù)庫(kù)之間安全及高效連接的模塊套件。實(shí)現(xiàn)了穩(wěn)定,線(xiàn)程仿射,持久化的數(shù)據(jù)庫(kù)連接。線(xiàn)程結(jié)束時(shí)該連接會(huì)自動(dòng)關(guān)閉。但仍可以請(qǐng)求非線(xiàn)程共享的專(zhuān)用數(shù)據(jù)庫(kù)連接。

DBUtils是一個(gè)允許在多線(xiàn)程python應(yīng)用和數(shù)據(jù)庫(kù)之間安全及高效連接的python模塊套件。

模塊

DBUtils套件包含兩個(gè)模塊子集,一個(gè)適用于兼容DB-API 2接口的模塊,一個(gè)適用于PyGreSQL的模塊。

Universal DB-API 2 variant

該子集下的模塊依賴(lài)關(guān)系如圖:

Classic PyGreSQL variant

該子集下的模塊依賴(lài)關(guān)系如圖:

SimplePooledDB

DBUtils.SimplePooledDB是池化數(shù)據(jù)庫(kù)連接中非?;A(chǔ)的一種實(shí)現(xiàn)。相較于PooledDB,它并不那么復(fù)雜,且缺少failover機(jī)制。SimplePooledDB應(yīng)視為一種概念演示,不要直接在生產(chǎn)環(huán)境使用。

SteadyDB

DBUtils.SteadyDB基于兼容DB-API 2接口的數(shù)據(jù)庫(kù)模塊創(chuàng)建的普通連接,實(shí)現(xiàn)了"加強(qiáng)"連接。具體指當(dāng)數(shù)據(jù)庫(kù)連接關(guān)閉、丟失或使用頻率超出限制時(shí),將自動(dòng)重新獲取連接。

典型的應(yīng)用場(chǎng)景如下:在某個(gè)維持了某些數(shù)據(jù)庫(kù)連接的程序運(yùn)行時(shí)重啟了數(shù)據(jù)庫(kù),或在某個(gè)防火墻隔離的網(wǎng)絡(luò)中訪(fǎng)問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)時(shí)重啟了防火墻。

PersistentDB

DBUtils.PersistentDB實(shí)現(xiàn)了穩(wěn)定,線(xiàn)程仿射(thread-affine),持久化的數(shù)據(jù)庫(kù)連接。下圖顯式了使用PersistentDB進(jìn)行連接時(shí)涉及的連接層:

某個(gè)線(xiàn)程第一次開(kāi)啟一個(gè)數(shù)據(jù)庫(kù)連接時(shí),該連接將用于此特定線(xiàn)程。即使在線(xiàn)程中關(guān)閉連接,連接也會(huì)保持打開(kāi)狀態(tài),以便同一個(gè)線(xiàn)程的下一次連接請(qǐng)求直接使用。線(xiàn)程結(jié)束時(shí)該連接會(huì)自動(dòng)關(guān)閉。

簡(jiǎn)而言之:PersistentDB會(huì)回收數(shù)據(jù)庫(kù)連接從而在整體上增加多線(xiàn)程應(yīng)用的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)性能,它確保線(xiàn)程之間永遠(yuǎn)不會(huì)共享連接。

因此即使底層的DB-API模塊不是connection級(jí)別的線(xiàn)程安全,PersistentDB也可以完美實(shí)現(xiàn)線(xiàn)程安全,避免在其他線(xiàn)程更改數(shù)據(jù)庫(kù)會(huì)話(huà)或執(zhí)行跨多個(gè)SQL指令的事務(wù)時(shí)出現(xiàn)問(wèn)題。


要使用PersistentDB模塊,首先傳遞以下參數(shù)創(chuàng)建PersistentDB實(shí)例:

creator:兼容DB-API 2的數(shù)據(jù)庫(kù)模塊或返回DB-API 2連接的任意函數(shù)

maxusage:?jiǎn)蝹€(gè)連接的最大重用次數(shù)(0或None表示無(wú)重用次數(shù)限制),達(dá)到該限制后自動(dòng)關(guān)閉并重新打開(kāi)連接

setsession:設(shè)置連接會(huì)話(huà)的sql指令列表,比如["set wait_timeout = 100", ...]

failures:異常類(lèi)或異常類(lèi)元組。在默認(rèn)的(OperationalError, InternalError)不能處理連接failover機(jī)制時(shí)使用

ping:如果ping()方法可用,該值表示何時(shí)使用ping()方法檢查連接(0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always, and all other bit combinations of these values)

closeable:如果設(shè)置為T(mén)rue,將允許手動(dòng)close()連接,默認(rèn)為False,忽略關(guān)閉連接的操作,只在線(xiàn)程終止時(shí)自動(dòng)關(guān)閉

threadlocal:表示thread-local數(shù)據(jù)的類(lèi)。設(shè)置值為threading.local可能獲取連接的速度更快,但不一定適用于所有情況(例如,mod_wsgi會(huì)清空requests之間的threading.local數(shù)據(jù))

傳遞給creator參數(shù)值創(chuàng)建connection對(duì)象的參數(shù),如host, database等

import pymysql
from DBUtils.PersistentDB import PersistentDB

persist = PersistentDB(creator=pymysql, user="root", passwd="123456", db="test")
# conn的使用和常規(guī)DB-API 2接口類(lèi)似
conn = persist.connection()

NOTE:需要在連接上調(diào)用begin()方法明確開(kāi)啟事務(wù)。這可以確保a.只在事務(wù)完成時(shí)才重新打開(kāi)連接b.連接被同一個(gè)線(xiàn)程重用時(shí)回滾。

PooledDB

DBUtils.PooledDB實(shí)現(xiàn)了穩(wěn)定、線(xiàn)程安全的緩存連接池。下圖顯式了使用PooledDB進(jìn)行連接時(shí)涉及的連接層:

使用正整數(shù)的maxshared參數(shù)和connection級(jí)別的線(xiàn)程安全的creator參數(shù)創(chuàng)建連接池時(shí),連接池中的連接默認(rèn)是線(xiàn)程間共享的。但仍可以請(qǐng)求非線(xiàn)程共享的專(zhuān)用數(shù)據(jù)庫(kù)連接。

除了共享連接池外,還可以創(chuàng)建至少mincached個(gè),至多maxcached個(gè)連接的空閑連接池,在共享連接池未滿(mǎn)(不太理解)或線(xiàn)程請(qǐng)求專(zhuān)用數(shù)據(jù)庫(kù)連接時(shí)使用。當(dāng)某個(gè)線(xiàn)程關(guān)閉不再共享的連接時(shí),該連接將回收到空閑連接池以便再次使用。

如果底層的DB-API 2模塊非線(xiàn)程安全,將使用線(xiàn)程鎖確保PooledDB連接是線(xiàn)程安全的。但對(duì)于線(xiàn)程專(zhuān)用的連接,要小心更改數(shù)據(jù)庫(kù)會(huì)話(huà)或執(zhí)行跨多個(gè)SQL指令的事務(wù)帶來(lái)的不良影響。


要使用PoolDB模塊,首先傳遞以下參數(shù)創(chuàng)建PoolDB實(shí)例:

creator:同PersistentDB

mincached:連接池中空閑連接的初始數(shù)量(0表示不創(chuàng)建初始空閑連接)

maxcached:連接池中允許的最大空閑連接數(shù)(0或None表示無(wú)限制)

maxshared:允許的最大共享連接數(shù)(0或None表示所有連接都是專(zhuān)用的),When this maximum number is reached, connections are shared if they have been requested as shareable

maxconnections:允許的最大連接數(shù)(0或None表示無(wú)限制)

blocking:查過(guò)最大值是否阻塞。True表示將阻塞直到釋放新的連接,默認(rèn)False表示拋出異常

maxusage:同PersistentDB

setsession:同PersistentDB

reset:返回連接池時(shí)應(yīng)該怎樣重置連接(False或None將只回滾明確調(diào)用了begin()開(kāi)啟的事務(wù),默認(rèn)值為T(mén)rue,出于安全考慮總是會(huì)回滾)

failures:同PersistentDB

ping:同PersistentDB

傳遞給creator參數(shù)值創(chuàng)建connection對(duì)象的參數(shù),如host, database等

import pymysql
from DBUtils.PooledDB import PooledDB

pool = PooledDB(creator=pymysql, 5, user="root", passwd="123456", db="test")
# conn的使用和常規(guī)DB-API 2接口類(lèi)似
conn = pool.connection()

對(duì)于線(xiàn)程共享的連接池,可以用以下方式獲取線(xiàn)程專(zhuān)用連接:

conn = pool.connection(shareable=False)
# 或者
conn = pool.dedicated_connection()

對(duì)于不再使用的連接,調(diào)用close()方法回收到連接池。

在多線(xiàn)程環(huán)境中,不要寫(xiě)以下代碼,這會(huì)導(dǎo)致連接過(guò)早釋放并被其他線(xiàn)程重用,如果連接非線(xiàn)程安全可能導(dǎo)致程序出現(xiàn)嚴(yán)重錯(cuò)誤:

pool.connection().cursor().execute(...)

NOTE:需要在連接上調(diào)用begin()方法明確開(kāi)啟事務(wù)。這可以確保a.只在事務(wù)完成時(shí)才重新打開(kāi)連接b.連接在返回連接池之前執(zhí)行回滾c.連接不會(huì)被其他線(xiàn)程共享

如何選擇

PooledDB和PersistentDB都通過(guò)回收數(shù)據(jù)庫(kù)連接,且即使數(shù)據(jù)庫(kù)連接中斷也能保持穩(wěn)定性的方式從而達(dá)到提升數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)性能的目的。在現(xiàn)實(shí)場(chǎng)景中應(yīng)該如何選擇呢?對(duì)于保持常量線(xiàn)程數(shù)且頻繁使用數(shù)據(jù)庫(kù)的應(yīng)用,使用PersistentDB;對(duì)于頻繁開(kāi)啟、結(jié)束線(xiàn)程的應(yīng)用,使用PooledDB。

其他

如果程序中使用了ORM框架,如SQLObjectSQLAlchemy,不需要使用DBUtils,因?yàn)檫@些框架自身維護(hù)了連接池。

數(shù)據(jù)庫(kù)線(xiàn)程安全級(jí)別:

比如pymysql就是可以共享模塊但不能共享連接,查看方式pymysql.threadsafety

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43033.html

相關(guān)文章

  • python數(shù)據(jù)庫(kù)連接工具DBUtils

    摘要:是一個(gè)允許在多線(xiàn)程應(yīng)用和數(shù)據(jù)庫(kù)之間安全及高效連接的模塊套件。實(shí)現(xiàn)了穩(wěn)定,線(xiàn)程仿射,持久化的數(shù)據(jù)庫(kù)連接。線(xiàn)程結(jié)束時(shí)該連接會(huì)自動(dòng)關(guān)閉。但仍可以請(qǐng)求非線(xiàn)程共享的專(zhuān)用數(shù)據(jù)庫(kù)連接。 DBUtils是一個(gè)允許在多線(xiàn)程python應(yīng)用和數(shù)據(jù)庫(kù)之間安全及高效連接的python模塊套件。 模塊 DBUtils套件包含兩個(gè)模塊子集,一個(gè)適用于兼容DB-API 2接口的模塊,一個(gè)適用于PyGreSQL的模塊...

    wh469012917 評(píng)論0 收藏0
  • 1、DBUtils 2、連接

    摘要:不用自己來(lái)創(chuàng)建,而是通過(guò)池來(lái)獲取對(duì)象使用完后,調(diào)用的方法也不會(huì)真的關(guān)閉,而是把歸還給池連接池技術(shù)可以完成對(duì)象的再次利用接口為數(shù)據(jù)庫(kù)連接池提供了公共的接口各個(gè)廠(chǎng)商需要讓自己的連接池實(shí)現(xiàn)這個(gè)接口。 01DButils工具類(lèi)的介紹個(gè)三個(gè)核心類(lèi) * A: DButils工具類(lèi)的介紹個(gè)三個(gè)核心類(lèi) * a: 概述 * DBUtils是java編程中的數(shù)據(jù)庫(kù)操作實(shí)用工具,小巧...

    chuyao 評(píng)論0 收藏0
  • Java編程基礎(chǔ)34——JDBC&DBUtil

    摘要:不用自己來(lái)創(chuàng)建,而是通過(guò)池來(lái)獲取對(duì)象使用完后,調(diào)用的方法也不會(huì)真的關(guān)閉,而是把歸還給池連接池技術(shù)可以完成對(duì)象的再次利用接口為數(shù)據(jù)庫(kù)連接池提供了公共的接口各個(gè)廠(chǎng)商需要讓自己的連接池實(shí)現(xiàn)這個(gè)接口。 1.DButils工具類(lèi)的介紹個(gè)三個(gè)核心類(lèi) A: 概述 DBUtils是java編程中的數(shù)據(jù)庫(kù)操作實(shí)用工具,小巧簡(jiǎn)單實(shí)用。 DBUtils封裝了對(duì)JDBC的操作,簡(jiǎn)化了JDBC操作,可以少...

    svtter 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<