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清除字符串里非数字字符的方法
Jul 02 Python
Python如何通过subprocess调用adb命令详解
Aug 27 Python
vscode 远程调试python的方法
Dec 01 Python
详解python OpenCV学习笔记之直方图均衡化
Feb 08 Python
python书籍信息爬虫实例
Mar 19 Python
Python不使用int()函数把字符串转换为数字的方法
Jul 09 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
Feb 26 Python
tensorflow指定GPU与动态分配GPU memory设置
Feb 03 Python
Scrapy框架实现的登录网站操作示例
Feb 06 Python
在Sublime Editor中配置Python环境的详细教程
May 03 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
 Python 中 logging 模块使用详情
Mar 03 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 fsockopen伪造post与get方法的详解
2013/06/14 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
javascript 正则替换 replace(regExp, function)用法
2010/05/22 Javascript
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
基于jQuery实现动态搜索显示功能
2016/05/05 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
Python实现学生成绩管理系统
2020/04/05 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Python实现图片添加文字
2019/11/26 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
英文自荐信
2013/12/19 职场文书
写给老师的表扬信
2014/01/21 职场文书
称象教学反思
2014/02/03 职场文书
2015新年寄语大全
2014/12/08 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
负责培养人意见
2015/06/05 职场文书
行政处罚决定书
2015/06/24 职场文书
导游词之塘栖古镇
2019/12/04 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python
Win11开始菜单添加休眠选项
2022/04/19 数码科技