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个回答

楼上的原因在于,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()

CaiNiaoWuZui
CaiNiaoWuZui 回复beishanfengyun: 个人用的是pymysql,没有使用sql_thread.join()。至于cdbcon.close个人是在所有execute完成之后再commit的
接近 3 年之前 回复
beishanfengyun
beishanfengyun 回复beishanfengyun: 楼主的方法有用,还有一点就是要加一句sql_thread.join(),不然dbcon.close()会影响报错
接近 3 年之前 回复
beishanfengyun
beishanfengyun 楼主的方法有用,还有一点就是要加一句sql_thread,不然dbcon.close()会影响报错
接近 3 年之前 回复

代码复制过来的时候,空格被网页去掉了。语法里面应该有空格缩进。

MySQL连接有问题,没有连接成功

MySQL Connection not available.

连接有问题,你先用工具试试能不能连接到MySQL.

将dbcon作为参数传到线程里或者定义成global的来使用。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问