亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python實現Mysql數據庫連接池實例詳解

系統 1582 0

python連接Mysql數據庫:

Python編程中可以使用MySQLdb進行數據庫的連接及諸如查詢/插入/更新等操作,但是每次連接MySQL數據庫請求時,都是獨立的去請求訪問,相當浪費資源,而且訪問數量達到一定數量時,對mysql的性能會產生較大的影響。因此,實際使用中,通常會使用數據庫的連接池技術,來訪問數據庫達到資源復用的目的。
數據庫連接池

Python實現Mysql數據庫連接池實例詳解_第1張圖片

python的數據庫連接池包 DBUtils:

DBUtils是一套Python數據庫連接池包,并允許對非線程安全的數據庫接口進行線程安全包裝。DBUtils來自Webware for Python。

DBUtils提供兩種外部接口:

* PersistentDB :提供線程專用的數據庫連接,并自動管理連接。
* PooledDB :提供線程間可共享的數據庫連接,并自動管理連接。

下載地址:DBUtils?? 下載解壓后,使用python setup.py install 命令進行安裝

下面利用MySQLdb和DBUtils建立自己的mysql數據庫連接池工具包

在工程目錄下新建package命名為:dbConnecttion,并新建module命名為MySqlConn,下面是MySqlConn.py,該模塊創建Mysql的連接池對象,并創建了如查詢/插入等通用的操作方法。該部分代碼實現如下:

            
# -*- coding: UTF-8 -*- 
""" 
Created on 2016年5月7日 
 
@author: baocheng 
1、執行帶參數的SQL時,請先用sql語句指定需要輸入的條件列表,然后再用tuple/list進行條件批配 
2、在格式SQL中不需要使用引號指定數據類型,系統會根據輸入參數自動識別 
3、在輸入的值中不需要使用轉意函數,系統會自動處理 
""" 
 
import MySQLdb 
from MySQLdb.cursors import DictCursor 
from DBUtils.PooledDB import PooledDB 
#from PooledDB import PooledDB 
import Config 
 
""" 
Config是一些數據庫的配置文件 
""" 
 
class Mysql(object): 
 """ 
 MYSQL數據庫對象,負責產生數據庫連接 , 此類中的連接采用連接池實現獲取連接對象:conn = Mysql.getConn() 
   釋放連接對象;conn.close()或del conn 
 """ 
 #連接池對象 
 __pool = None 
 def __init__(self): 
  #數據庫構造函數,從連接池中取出連接,并生成操作游標 
  self._conn = Mysql.__getConn() 
  self._cursor = self._conn.cursor() 
 
 @staticmethod 
 def __getConn(): 
  """ 
  @summary: 靜態方法,從連接池中取出連接 
  @return MySQLdb.connection 
  """ 
  if Mysql.__pool is None: 
   __pool = PooledDB(creator=MySQLdb, mincached=1 , maxcached=20 , 
        host=Config.DBHOST , port=Config.DBPORT , user=Config.DBUSER , passwd=Config.DBPWD , 
        db=Config.DBNAME,use_unicode=False,charset=Config.DBCHAR,cursorclass=DictCursor) 
  return __pool.connection() 
 
 def getAll(self,sql,param=None): 
  """ 
  @summary: 執行查詢,并取出所有結果集 
  @param sql:查詢SQL,如果有查詢條件,請只指定條件列表,并將條件值使用參數[param]傳遞進來 
  @param param: 可選參數,條件列表值(元組/列表) 
  @return: result list(字典對象)/boolean 查詢到的結果集 
  """ 
  if param is None: 
   count = self._cursor.execute(sql) 
  else: 
   count = self._cursor.execute(sql,param) 
  if count>0: 
   result = self._cursor.fetchall() 
  else: 
   result = False 
  return result 
 
 def getOne(self,sql,param=None): 
  """ 
  @summary: 執行查詢,并取出第一條 
  @param sql:查詢SQL,如果有查詢條件,請只指定條件列表,并將條件值使用參數[param]傳遞進來 
  @param param: 可選參數,條件列表值(元組/列表) 
  @return: result list/boolean 查詢到的結果集 
  """ 
  if param is None: 
   count = self._cursor.execute(sql) 
  else: 
   count = self._cursor.execute(sql,param) 
  if count>0: 
   result = self._cursor.fetchone() 
  else: 
   result = False 
  return result 
 
 def getMany(self,sql,num,param=None): 
  """ 
  @summary: 執行查詢,并取出num條結果 
  @param sql:查詢SQL,如果有查詢條件,請只指定條件列表,并將條件值使用參數[param]傳遞進來 
  @param num:取得的結果條數 
  @param param: 可選參數,條件列表值(元組/列表) 
  @return: result list/boolean 查詢到的結果集 
  """ 
  if param is None: 
   count = self._cursor.execute(sql) 
  else: 
   count = self._cursor.execute(sql,param) 
  if count>0: 
   result = self._cursor.fetchmany(num) 
  else: 
   result = False 
  return result 
 
 def insertOne(self,sql,value): 
  """ 
  @summary: 向數據表插入一條記錄 
  @param sql:要插入的SQL格式 
  @param value:要插入的記錄數據tuple/list 
  @return: insertId 受影響的行數 
  """ 
  self._cursor.execute(sql,value) 
  return self.__getInsertId() 
 
 def insertMany(self,sql,values): 
  """ 
  @summary: 向數據表插入多條記錄 
  @param sql:要插入的SQL格式 
  @param values:要插入的記錄數據tuple(tuple)/list[list] 
  @return: count 受影響的行數 
  """ 
  count = self._cursor.executemany(sql,values) 
  return count 
 
 def __getInsertId(self): 
  """ 
  獲取當前連接最后一次插入操作生成的id,如果沒有則為0 
  """ 
  self._cursor.execute("SELECT @@IDENTITY AS id") 
  result = self._cursor.fetchall() 
  return result[0]['id'] 
 
 def __query(self,sql,param=None): 
  if param is None: 
   count = self._cursor.execute(sql) 
  else: 
   count = self._cursor.execute(sql,param) 
  return count 
 
 def update(self,sql,param=None): 
  """ 
  @summary: 更新數據表記錄 
  @param sql: SQL格式及條件,使用(%s,%s) 
  @param param: 要更新的 值 tuple/list 
  @return: count 受影響的行數 
  """ 
  return self.__query(sql,param) 
 
 def delete(self,sql,param=None): 
  """ 
  @summary: 刪除數據表記錄 
  @param sql: SQL格式及條件,使用(%s,%s) 
  @param param: 要刪除的條件 值 tuple/list 
  @return: count 受影響的行數 
  """ 
  return self.__query(sql,param) 
 
 def begin(self): 
  """ 
  @summary: 開啟事務 
  """ 
  self._conn.autocommit(0) 
 
 def end(self,option='commit'): 
  """ 
  @summary: 結束事務 
  """ 
  if option=='commit': 
   self._conn.commit() 
  else: 
   self._conn.rollback() 
 
 def dispose(self,isEnd=1): 
  """ 
  @summary: 釋放連接池資源 
  """ 
  if isEnd==1: 
   self.end('commit') 
  else: 
   self.end('rollback'); 
  self._cursor.close() 
  self._conn.close() 
          

配置文件模塊Cnofig,包括數據庫的連接信息/用戶名密碼等:

            
#coding:utf-8 
''''' 
Created on 2016年5月7日 
 
@author: baocheng 
''' 
DBHOST = "localhost" 
DBPORT = 33606 
DBUSER = "zbc" 
DBPWD = "123456" 
DBNAME = "test" 
DBCHAR = "utf8" 

          

創建test模塊,測試一下使用連接池進行mysql訪問:

            
#coding:utf-8 
''''' 
 
@author: baocheng 
''' 
from MySqlConn import Mysql 
from _sqlite3 import Row 
 
#申請資源 
mysql = Mysql() 
 
sqlAll = "SELECT tb.uid as uid, group_concat(tb.goodsname) as goodsname FROM ( SELECT goods.uid AS uid, IF ( ISNULL(goodsrelation.goodsname), goods.goodsID, goodsrelation.goodsname ) AS goodsname FROM goods LEFT JOIN goodsrelation ON goods.goodsID = goodsrelation.goodsId ) tb GROUP BY tb.uid" 
result = mysql.getAll(sqlAll) 
if result : 
 print "get all" 
 for row in result : 
  print "%s\t%s"%(row["uid"],row["goodsname"]) 
sqlAll = "SELECT tb.uid as uid, group_concat(tb.goodsname) as goodsname FROM ( SELECT goods.uid AS uid, IF ( ISNULL(goodsrelation.goodsname), goods.goodsID, goodsrelation.goodsname ) AS goodsname FROM goods LEFT JOIN goodsrelation ON goods.goodsID = goodsrelation.goodsId ) tb GROUP BY tb.uid" 
result = mysql.getMany(sqlAll,2) 
if result : 
 print "get many" 
 for row in result : 
  print "%s\t%s"%(row["uid"],row["goodsname"])   
   
   
result = mysql.getOne(sqlAll) 
print "get one" 
print "%s\t%s"%(result["uid"],result["goodsname"]) 
 
#釋放資源 
mysql.dispose() 

          

當然,還有很多其他參數可以配置:

  • dbapi :數據庫接口
  • mincached :啟動時開啟的空連接數量
  • maxcached :連接池最大可用連接數量
  • maxshared :連接池最大可共享連接數量
  • maxconnections :最大允許連接數量
  • blocking :達到最大數量時是否阻塞
  • maxusage :單個連接最大復用次數

根據自己的需要合理配置上述的資源參數,以滿足自己的實際需要。

至此,python中的mysql連接池實現完了,下次就直接拿來用就好了。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久亚洲精品中文字幕亚瑟 | 亚洲无总热门 | 最近中文2019视频在线 | 国产另类图片 | 日韩毛片免费 | 欧美三级做爰视频 | 三中文乱码视频 | 免费超爽大片黄网站 | 在线视频免费观看a毛片 | 欧美一级毛片免费大片 | 外国成人网在线观看免费视频 | 国产香蕉尹人综合在线 | 日本高清视频一区二区三区 | 久久久麻豆 | 久久精品www | 精品午夜国产在线观看不卡 | 日韩免费中文字幕 | 国产一级大片免费看 | 999精品在线 | 九九九九热精品免费视频 | 免费毛片一级 | 久久国产一区二区 | 久久最新视频 | 美女操穴视频 | 国产一区 在线视频 | 国产精品久久久久精 | 免费一级毛片 | 精品玖玖玖视频在线观看 | 国产精品久久在线观看 | 91精品推荐 | 久久国产一区二区 | 在线亚洲精品国产波多野结衣 | 小说区图片区综合久久亚洲 | 久久一本 | 四虎最新紧急更新地址 | 另类亚洲视频 | 四虎在线最新永久免费 | 蕾丝视频在线看片国产 | 中国性猛交xxxx乱大交 | 国产精品第六页 | 欧美性理论片在线观看片免费 |