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监控主机是否存活并以邮件报警
Sep 22 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
Feb 19 Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
python中requests和https使用简单示例
Jan 18 Python
Python模块搜索路径代码详解
Jan 29 Python
Python实现统计给定列表中指定数字出现次数的方法
Apr 11 Python
Python 实现两个服务器之间文件的上传方法
Feb 13 Python
Python运行异常管理解决方案
Mar 09 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
May 22 Python
python定义类的简单用法
Jul 24 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 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实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
jquery 操作DOM案例代码分享
2012/04/05 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
深入分析element ScrollBar滚动组件源码
2019/01/22 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python清除字符串里非字母字符的方法
2015/07/02 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
python3爬虫怎样构建请求header
2018/12/23 Python
python3实现字符串操作的实例代码
2019/04/16 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
html5借用repeating-linear-gradient实现一把刻度尺(ruler)
2019/09/09 HTML / CSS
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
农村党支部先进事迹
2014/01/14 职场文书
网络工程专业自荐信范文
2014/03/16 职场文书
学生操行评语大全
2014/04/24 职场文书
党小组考察意见
2015/06/02 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA