• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > Python实现Mysql数据库连接池实例详解

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

作者:lqh 字体:[增加 减小] 来源:互联网

lqh 通过本文主要向大家介绍了python 数据库连接池,mysql数据库连接池,数据库连接池,数据库连接池配置,java数据库连接池等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

python连接Mysql数据库:

Python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接MySQL数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对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() 
</div>

配置文件模块Cnofig,包括数据库的连接信息/用户名密码等:

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

创建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() 
</div>

当然,还有很多其他参数可以配置:

  • dbapi :数据库接口
  • mincached :启动时开启的空连接数量
  • maxcached :连接池最大可用连接数量
  • maxshared :连接池最大可共享连接数量
  • maxconnections :最

您可能想查找下面的文章:

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

相关文章

  • 详解在Python程序中解析并修改XML内容的方法
  • python里将list中元素依次向前移动一位
  • Python自动化测试工具Splinter简介和使用实例
  • Python二分法搜索算法实例分析
  • python encode和decode的妙用
  • Python入门教程之if语句的用法
  • python中lambda与def用法对比实例分析
  • Python入门篇之编程习惯与特点
  • Python编程中字符串和列表的基本知识讲解
  • Python3实现并发检验代理池地址的方法

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • python解析xml文件实例分享
    • python Django批量导入数据
    • 简单谈谈python中的Queue与多进程
    • python同义词替换的实现(jieba分词)
    • python 类详解及简单实例
    • Python基类函数的重载与调用实例分析
    • 使用Python的PIL模块来进行图片对比
    • Python中subprocess模块用法实例详解
    • Python Socket编程入门教程
    • 利用numpy+matplotlib绘图的基本操作教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有