设为首页 收藏本站
查看: 1345|回复: 0

[经验分享] Python实现Mysql数据库连接池

[复制链接]

尚未签到

发表于 2017-12-12 11:31:32 | 显示全部楼层 |阅读模式
python连接Mysql数据库:
  Python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接MySQL数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此,实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用的目的。
DSC0000.jpg


python的数据库连接池包 DBUtils:
  DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。DBUtils来自Webware for Python。
  

DBUtils提供两种外部接口:  


  • * PersistentDB :提供线程专用的数据库连接,并自动管理连接。
  • * PooledDB :提供线程间可共享的数据库连接,并自动管理连接。
  需要的python库:
  下载DBUtils:
  Webware 的网站下载最新版本:http://www.webwareforpython.org/downloads/DBUtils/
  或者在Python Package Index来下载:http://www.python.org/pypi/DBUtils/
  下载pymssql:
  http://code.google.com/p/pymssql/downloads/list
  (pymssql 是Python语言用来连接微软 SQL SERVER 数据库的类库)
  1.写一个创建连接池,获取连接以及重新连接数据库的模块:
  # libby_db_pool.py
  # 代码如下:
  #-*- coding:utf-8 -*-
  from DBUtils.PooledDB import PooledDB
  import pymssql #sqlserver数据库适配器
  from pymssql import OperationalError, InternalError, ProgrammingError
  HOST = "127.0.0.1"
  PORT = "1433"
  CHARSET = "utf8"
  NAME = "zkeco_oracle"
  USER = "sa"
  PASSWORK = "sa"
  conn_args = {
  'host':"%s"%HOST,
  'port':"%s"%PORT,
  'database':"%s"%NAME,
  'charset':"%s"%CHARSET,
  'user':"%s"%USER,
  'password':"%s"%PASSWORK
  }
  """
  mincached : 启动时开启的闲置连接数量(缺省值 0 以为着开始时不创建连接)
  maxcached : 连接池中允许的闲置的最多连接数量(缺省值 0 代表不闲置连接池大小)
  maxshared : 共享连接数允许的最大数量(缺省值 0 代表所有连接都是专用的)如果达到了最大数量,被请求为共享的连接将会被共享使用
  maxconnecyions : 创建连接池的最大数量(缺省值 0 代表不限制)
  blocking : 设置在连接池达到最大数量时的行为(缺省值 0 或 False 代表返回一个错误<toMany......>; 其他代表阻塞直到连接数减少,连接被分配)
  maxusage : 单个连接的最大允许复用次数(缺省值 0 或 False 代表不限制的复用).当达到最大数时,连接会自动重新连接(关闭和重新打开)
  setsession : 一个可选的SQL命令列表用于准备每个会话,如["set datestyle to german", ...]
  """
  args = (10,10,30,100,True,0,None)
  class DbManager():
  def __init__(self):
  try:
  self._pool = PooledDB(pymssql,*args,**conn_args)
  except Exception,e:
  print "The parameters for DBUtils is:",conn_args
  def _getConn(self):
  return self._pool.connection()
  _dbManager = DbManager()
  def getConn():
  """ 获取数据库连接 """
  return _dbManager._getConn()
  def _reConn():
  """ 重新连接数据库 """
  global _dbManager
  re = False
  try:
  _dbManager = DbManager()
  re = True
  except:
  import traceback
  traceback.print_exc()
  finally:
  return re
  import datetime
  def reConn():
  print "%s: now try to reconnect Database!"%(datatime.datatime.now())
  flag = _reConn()
  if flag:
  print "%s reconnect database success!"%(datatime.datatime.now())
  else:
  print "%s reconnect database failed!"%(datatime.datatime.now())
  2.写一个支持增删查改功能的连接池模块:
  #libby_sql_utils.py
  #代码如下:
  #-*- coding:utf-8 -*-
  from libby_db_pool import getConn,reConn
  from libby_db_pool import OperationalError, InternalError, ProgrammingError
  import traceback
  def test_conn():
  """
  测试连接池连接是否正常
  return:
  res:True:正常,False:不正常
  msg:如果不正常,为异常信息
  """
  test_sql = """
  select 1
  """
  conn = None
  cur = None
  res = False
  msg = ""
  try:
  conn = getConn()
  cur = conn.cursor()
  cur.execute(test_sql)
  res = cur.fetchall()
  res = True
  except Exception,e:
  trackback.print_exc()
  msg = e
  finally:
  if cur:
  cur.close()
  if conn:
  conn.close()
  return res,msg
  def call_reConn():
  """
  重新创建连接池
  """
  reConn()
  def p_query(sql):
  """
  dbutils 数据连接池
  只能执行数据查询sql语句,否则会抛错
  @parm: 要执行的sql语句
  @return:
[]:查询结果为空

  None:sql语句执行失败,出现异常
  二维list:正常结果
  """
  conn = None
  cur = None
  res = None
  try:
  conn = getConn()
  cur = conn.cursor()
  cur.execute(sql)
  res = cur.fetchall()
  except (OperationalError, InternalError):
  call_reConn()
  trackback.print_exc()
  except:
  trackback.exc()
  finally:
  if cur:
  cur.close()
  if conn:
  conn.close()
  return res
  def p_query_one(sql):
  """
  dbutils 数据连接池
  只能执行数据查询sql语句,否则会报错
  执行sql查询语句,获取第一条记录
  @parm:要执行的sql语句
  @return:
[]:查询结果为空

  None:sql语句执行失败,出现异常
  list:正常结果
  """
  conn = None
  cur = None
  res = None
  try:
  conn = getConn()
  cur = conn.cursor()
  cur.execute(sql)
  res = cur.fetchone()
  except (OperationalError,InternalError):
  call_reConn()
  except:
  traceback.print_exc()
  finally:
  if cur:
  cur.close()
  if conn:
  conn.close()
  return res
  def p_execute(sql):
  """
  dbutils 数据连接池
  执行数据操作语句,包括 update,insert,delete
  @parm:要执行的sql
  @return:
  None:sql语句执行失败,出现异常
  number:影响记录条数
  -2:数据库连接失败导致执行失败
  """
  conn = None
  cur = None
  res = None
  try:
  conn = getConn()
  cur = conn.cursor()
  cur.execute(sql)
  res = cur._cursor.rowcount
  conn.commit()
  except Exception,e:
  if conn:
  conn.rollback()
  traceback.print_exc()
  finally:
  if res == -1:#可能是数据库断开连接
  ret,msg = test_conn()
  if not ret:
  call_reConn()
  res = -2
  if cur:
  cur.close()
  if conn:
  conn.close()
  return res
  def p_mutiexec(sql_list):
  """
  dbutils 数据连接池
  执行多条数据操作语句,可以用于多条sql语句的事务性操作,包括 update,insert,delete
  @parm:要执行的sql语句[]
  @return:
  (flag,res):
  flag<Ture or False>:批次是否全部执行成功
  res<list>:每天sql语句执行影响的行数,如果执行失败,由此可以判断第几条sql语句执行失败
  如果遇到数据库断开的情况,返回[-2,]
  """
  conn = None
  cur = None
  res = []
  flag = True
  try:
  conn = getConn()
  cur = conn.cursor()
  for sql in sql_list:
  cur.execute(sql)
  num = cur._cursor.rowcount
  res.append(num)
  conn.commit()
  except Exception,e:
  if conn:
  conn.rollback()
  traceback.print_exc()
  finally:
  if -1 in res:
  ret,msg = test_conn()
  if not ret:
  call_reConn()
  flag = False
  res = [-2,]
  if cur:
  cur.close()
  if conn:
  conn.close()
  return flag,res

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423291-1-1.html 上篇帖子: 终极用户 下篇帖子: mysql循环查询树状数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表