Toggle navigation
IT人
IT人
python資料庫連線池的正確用法
wenpingblog
發表於
2022-07-03
資料庫
Python
現狀 在工作中難免會使用資料庫,為了能夠高效併發訪問資料庫,資料庫連線池必不可少,由於本站copy模式盛行,導致資料庫連線池被錯誤使用,遇到錯誤甚至追求能跑通就行。 本文就資料庫連結池的實際使用場景來說明如何應用資料庫連線池。 業務場景 在部署機器學習模型時採用的是flask框架,模型預測本身是一個很快的事情,無奈有太多的特徵需要通過介面(或者是ots,mysql等)獲取,導致響應時效性降低。 為了能很好的實現併發性,提升QPS,採用gunicorn進行多程式,非同步處理方案。 此時單個程式只有一個資料庫連結,就會導致非同步執行的執行緒共用同一個連線,從而導致報錯,引入資料庫連線池是必須的。 資料庫連線池原理 通過預先建立連結,放到然後list中,使用的時候,從list中取出一個連結,使用使用完成後歸還連線。當執行緒太多,連結池中沒有連結的時候,可以選擇block,等到有連結可用的時候返回,或者是直接返回錯誤。 dbutils已經實現了兩種pooldb: PooledDB :可以被多執行緒共享的連結,適用於非同步場景,不斷有新執行緒進來獲取連線池,本文使用該方案。 PersistentDB:下面這句話表示,對執行緒的要求是持續穩定的,不能產生新的執行緒。 Measures are taken to make the database connections thread-affine. This means the same thread always uses the same cached connection, and no other thread will use it. So even if the underlying DB-API module is not thread-safe at the connection level this will be no problem here. For best performance, the application server should keep threads persistent. dbutils結構如下 db結尾的是mysql等資料庫專用。 pg結尾的是PostgreSQL專用。 如上交代完之後,相信你對資料庫連結池有較為全面的認知了,好了具體實現程式碼如下: 主要程式碼框架邏輯: 1、初始化連線池 2、獲取連結 3、查詢資料庫 4、close連結(返回給連線池,並不是真正的關閉連線池) 5、具體資料查詢&解析邏輯根據業務修改,此處提供了sql_fetch_json函式,返回json格式資料。 6、test1為多執行緒測試,此處自己多執行體會查詢結果。 常見錯誤使用方法1: def getConn(self): self.conn = self.__pool.connection() self.cursor = self.conn.cursor() 此處不應該共享連結,和cursor,會導致報錯: AttributeError: 'NoneType' object has no attribute 'read' 或者: AttributeError: 'NoneType' object has no attribute ‘settimeout‘ 常見錯誤使用方法2: 獲取連結以及查詢的時候加鎖 lock.acquire() pool.getConn() pool.getOne(strsql) lock.release() time.sleep(1) 因為pooldb本身就會加鎖,參見如下原始碼中,自己在從連結池獲取連結,到cursor獲取資料的時候加鎖,會導致鎖冗餘,此時連線池會退化成單個資料庫連結。 self.__pool.connection() 邏輯 https://ds.163.com/feed/62be1c9eb4e5c000016ebbf0/ https://ds.163.com/feed/62be1cebb4e5c000016ebc0f/ https://ds.163.com/feed/62be1ce1c5e2010001dd4232/ https://ds.163.com/feed/62be1cd7c4707400012fbcce/ https://ds.163.com/feed/62be1d25c4707400012fbce6/ https://ds.163.com/feed/62be1d300b83600001166640/ https://ds.163.com/feed/62be1d3b85eece0001b7620c/ https://ds.163.com/feed/62be1d73d3fdd00001b6b532/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22363020/viewspace-2903998/,如需轉載,請註明出處,否則將追究法律責任。
最新文章
Brand Finance:2023年中國醫藥榜單
libwebp影像庫漏洞已在攻擊中被利用,CVSS評級滿分
Mac系統監視器:iStat Menus for Mac中文版
如何遠端獲取汙水處理裝置資料並進行遠端程式設計除錯
啟用 Office LTSC 2021 for Mac v16.78 下載安裝
Flink提交Job的方式以及引數設定
一種透過延遲事務提升資料庫效能的方法
一種提升SQL改寫效率的方法
直播商城原始碼,android執行緒的介紹及兩種啟動方式
線上直播系統原始碼,簡單實現Android應用的啟動頁
中國銀行電子支付平臺建設探索與實踐
直播平臺開發,純時間比較(時分),不含日期,js前端比較