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中实现从目录中过滤出指定文件类型的文件
Feb 02 Python
python循环监控远程端口的方法
Mar 14 Python
使用Python编写vim插件的简单示例
Apr 17 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
Python实现DDos攻击实例详解
Feb 02 Python
python在新的图片窗口显示图片(图像)的方法
Jul 11 Python
django写用户登录判定并跳转制定页面的实例
Aug 21 Python
关于numpy中eye和identity的区别详解
Nov 29 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
Django model class Meta原理解析
Nov 14 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
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
javascript第一课
2007/02/27 Javascript
模仿jQuery each函数的链式调用
2009/07/22 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
浅析javascript的return语句
2015/12/15 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
Python 自动补全(vim)
2014/11/30 Python
详解Django通用视图中的函数包装
2015/07/21 Python
python模块导入的细节详解
2018/12/10 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
html5 视频播放解决方案
2016/11/06 HTML / CSS
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
社团活动总结
2014/04/28 职场文书
优秀应届本科生求职信
2014/07/19 职场文书
民事诉讼代理授权委托书范本
2014/10/08 职场文书
家长评语怎么写
2014/12/30 职场文书
财务工作个人总结
2015/02/27 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang