beishanfengyun 2017-11-08 11:46 采纳率: 42.9%
浏览 5744
已采纳

Python 使用多线程写入数据库,报错

#问题描述,定义了一个函数,用于数据库写入表,直接使用函数是可以运行,但我创建了一个
多线程,在多线程里面使用运行函数,然后后错
import mysql.connector
from mysql.connector import errorcode
import threading,time

#数据库连接参数

def sqlconn():
dbconfig={'user': 'qrcodeadmin','password': 'careyes!@#','host': '119.23.8.62','port':3308,'database': 'qrcodes','raise_on_warnings': True}
try:
cnx = mysql.connector.connect(**dbconfig)
print('数据库连接成功')
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("Something is wrong with your user name or password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("Database does not exist")
else:
print(err.encode)
return cnx

def handle():
while(True):
global UID,ID
for i in range(50):
print(i)
sqlinsert="INSERT INTO qrcode (URL,QrID) VALUES (%s,%s)",(UID,ID)
cur.execute(sqlinsert[0],sqlinsert[1])
cur.execute(sqlinsert[0],sqlinsert[1])
dbcon.commit()

if name=='__main__':
global cur
dbcon=sqlconn()
cur=dbcon.cursor()
UID=' MjAxNzEwMTExMjQyNDQ'
ID='201710111242420111'
#直接使用handle可以运行
handle()
#-------------
sql_thread=threading.Thread(target=handle)
#如果使用线程就会报错
sql_thread.start()
dbcon.close()
print(dbcon)

    #报错内容
    Exception in thread Thread-1:

Traceback (most recent call last):
File "C:\Python\lib\site-packages\mysql\connector\connection.py", line 280, in
_send_cmd
self._socket.send(
AttributeError: 'NoneType' object has no attribute 'send'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Python\lib\threading.py", line 914, in _bootstrap_inner
self.run()
File "C:\Python\lib\threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "sqltestV0.2_Thread.py", line 34, in handle
cur.execute(sqlinsert[0],sqlinsert[1])
File "C:\Python\lib\site-packages\mysql\connector\cursor.py", line 561, in exe
cute
self._handle_result(self._connection.cmd_query(stmt))
File "C:\Python\lib\site-packages\mysql\connector\connection.py", line 514, in
cmd_query
result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
File "C:\Python\lib\site-packages\mysql\connector\connection.py", line 284, in
_send_cmd
raise errors.OperationalError("MySQL Connection not available.")
mysql.connector.errors.OperationalError: MySQL Connection not available.

  • 写回答

5条回答 默认 最新

  • CaiNiaoWuZui 2017-11-08 19:37
    关注

    楼上的原因在于,commit是独占式的,因此在某个线程commit的时候,其它线程执行execute,就会出现楼主的错误。因为对这个线程来说,conn是 not available的,因此
    1:建议先生成一个.sql文件,再导入。
    2:多线程使用同一个链接时,在所有的execute完成之后再统一commi;
    3:多线程使用同一个链接时,如果不想使用第二个方式,请使用lock避免踩空
    在import下面加上
    mutex = threading.Lock()

    if mutex.acquire():

    cur.execute(sqlinsert[0],sqlinsert[1])
    dbcon.commit()
    mutex.release()

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)