pymysql 非執行緒安全導致的故障.

babyyellow發表於2020-04-07

mysqldb   這個python 驅動只支援到 python 2 . 

轉到python 3 後.   無法使用了.  
啟用  pymysql 這個驅動. 
在投入生產後, 發現了一些問題. 
在使用較大規模的 for id  in  [list]:
   db.query (xxxxxxxxx)   
查詢資料庫的時候,  出現了一些比較奇怪的網路連線層面的報錯. 
資料包 的 頭位元組 格式錯誤. 
如果只是執行單個查詢則是不會報錯. 
經過排查,  發現這是pymysql 的bug 或者缺陷. 
即 PYmysql 不是執行緒安全的.   由於我們自己的元件  dba模組. 
對資料庫查詢做了包裝.  
導致 在某些情況情況下.   python 的程式碼最佳化模組. 
對程式碼的最佳化, 出現了並行的情況. 
即前一個sql 查詢沒有返回的情況下,  另一個執行緒啟動了並從同一個資料庫控制程式碼讀取資料. 
導致了 資料包的格式錯誤. 
改進方案: 
1.  對資料庫的連線 增加執行緒鎖.  
     每一次查詢 都加鎖.   在異常處理中也要同時加上解鎖程式碼. 
2. 更換為mysql.com 提供的 官方的  mysql-connector-python  驅動.  目前沒有發現問題. 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-2684692/,如需轉載,請註明出處,否則將追究法律責任。

相關文章