Python实现Mysql数据库连接池实例详解


Posted in Python onApril 11, 2017

python连接Mysql数据库:

Python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接MySQL数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此,实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用的目的。
数据库连接池

Python实现Mysql数据库连接池实例详解

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连接池实现完了,下次就直接拿来用就好了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
python中实现php的var_dump函数功能
Jan 21 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
python的re正则表达式实例代码
Jan 24 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
python使用百度文字识别功能方法详解
Jul 23 Python
python pygame实现挡板弹球游戏
Nov 25 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
Python Flask请求扩展与中间件相关知识总结
Jun 11 Python
Python实现简单的猜单词
Jun 15 Python
详解Python中类的定义与使用
Apr 11 #Python
python获取指定时间差的时间实例详解
Apr 11 #Python
一个基于flask的web应用诞生 组织结构调整(7)
Apr 11 #Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 #Python
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 #Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 #Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
Apr 11 #Python
You might like
一些常用的php函数
2006/12/06 PHP
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
php中文验证码实现示例分享
2014/01/12 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
一道JS前端闭包面试题解析
2015/12/25 Javascript
基于JavaScript的操作系统你听说过吗?
2016/01/28 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
2019/09/11 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
使用PDB模式调试Python程序介绍
2015/04/05 Python
简单的Python的curses库使用教程
2015/04/11 Python
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
Anaconda2 5.2.0安装使用图文教程
2018/09/19 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
python 实现简易的记事本
2020/11/30 Python
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
机电一体化毕业生求职信
2013/11/02 职场文书
电大毕业生自我鉴定
2013/11/10 职场文书
教你打造完美的创业计划书
2014/01/06 职场文书
卫生安全检查制度
2014/02/04 职场文书
小学生秋游活动方案
2014/02/23 职场文书
家长学校实施方案
2014/03/15 职场文书
助理政工师申报材料
2014/06/03 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL