Python基于多线程操作数据库相关问题分析


Posted in Python onJuly 11, 2018

本文实例分析了Python多线程操作数据库相关问题。分享给大家供大家参考,具体如下:

python多线程并发操作数据库,会存在链接数据库超时、数据库连接丢失、数据库操作超时等问题。

解决方法:使用数据库连接池,并且每次操作都从数据库连接池获取数据库操作句柄,操作完关闭连接返回数据库连接池。

*连接数据库需要设置charset = 'utf8', use_unicode = True,不然会报中文乱码问题

*网上说解决python多线程并发操作数据库问题,连接时使用self.conn.ping(True)(检查并保持长连接),但是我这边亲测无法解决,建议还是使用数据库连接池

python多线程代码:

import threading
class MyThread(threading.Thread):
  def __init__(self, name, count, exec_object):
    threading.Thread.__init__(self)
    self.name = name
    self.count = count
    self.exec_object = exec_object
  def run(self):
    while self.count >= 0:
      count = count - 1
      self.exec_object.execFunc(count)
thread1 = MyThread('MyThread1', 3, ExecObject())
thread2 = MyThread('MyThread2', 5, ExecObject())
thread1.start()
thread2.start()
thread1.join() # join方法 执行完thread1的方法才继续主线程
thread2.join() # join方法 执行完thread2的方法才继续主线程
# 执行顺序 并发执行thread1 thread2,thread1和thread2执行完成才继续执行主线程
# ExecObject类是自定义数据库操作的业务逻辑类
#
########join方法详解########
thread1 = MyThread('MyThread1', 3, ExecObject())
thread2 = MyThread('MyThread2', 5, ExecObject())
thread1.start()
thread1.join() # join方法 执行完thread1的方法才继续主线程
thread2.start()
thread2.join() # join方法 执行完thread2的方法才继续主线程
# 执行顺序 先执行thread1,执行完thread1再执行thread2,执行完thread2才继续执行主线程

mysql数据库连接池代码:

import MySQLdb
from DBUtils.PooledDB import PooledDB
class MySQL:
  host = 'localhost'
  user = 'root'
  port = 3306
  pasword = ''
  db = 'testDB'
  charset = 'utf8'
  pool = None
  limit_count = 3 # 最低预启动数据库连接数量
  def __init__(self):
    self.pool = PooledDB(MySQLdb, self.limit_count, host = self.host, user = self.user, passwd = self.pasword, db = self.db,
      port = self.port, charset = self.charset, use_unicode = True)
  def select(self, sql):
    conn = self.pool.connection()
    cursor = conn.cursor()
    cursor.execute(sql)
    result = cursor.fetchall()
    cursor.close()
    conn.close()
    return result
  def insert(self, table, sql):
    conn = self.pool.connection()
    cursor = conn.cursor()
    try:
      cursor.execute(sql)
      conn.commit()
      return {'result':True, 'id':int(cursor.lastrowid)}
    except Exception as err:
      conn.rollback()
      return {'result':False, 'err':err}
    finally:
      cursor.close()
      conn.close()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python程序设计入门(3)数组的使用
Jun 16 Python
python访问系统环境变量的方法
Apr 29 Python
python中的计时器timeit的使用方法
Oct 20 Python
python-str,list,set间的转换实例
Jun 27 Python
python实现弹跳小球
May 13 Python
python画双y轴图像的示例代码
Jul 07 Python
Python 实用技巧之利用Shell通配符做字符串匹配
Aug 23 Python
python实现堆排序的实例讲解
Feb 21 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 Python
python基于pexpect库自动获取日志信息
Feb 01 Python
pandas 按照特定顺序输出的实现代码
Jul 10 #Python
Python OpenCV处理图像之图像直方图和反向投影
Jul 10 #Python
Python中 map()函数的用法详解
Jul 10 #Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 #Python
Python OpenCV处理图像之图像像素点操作
Jul 10 #Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 #Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 #Python
You might like
MySQL数据源表结构图示
2008/06/05 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
2019/04/12 PHP
不使用XMLHttpRequest实现异步加载 Iframe和script
2012/10/29 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
详解Vue爬坑之vuex初识
2017/06/14 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
python装饰器实例大详解
2017/10/25 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
Python类反射机制使用实例解析
2019/12/30 Python
python 元组的使用方法
2020/06/09 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
Linux如何命名文件--使用文件名时应注意
2014/05/29 面试题
计算机专业毕业生自我鉴定
2014/01/16 职场文书
小学生打架检讨书
2014/01/26 职场文书
汽车机修工岗位职责
2014/03/06 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
经营理念口号
2014/06/21 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
mysql数据库如何转移到oracle
2022/12/24 MySQL