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 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧