pymysql.err.InterfaceError: (0, ‘’)解决办法
原因:
python多线程运行,使用一个mysql链接导致出现的问题
解决:
方法一:每个excuse之前加上互斥锁,样例代码如下:
每个线程都会运行这一个方法,每个线程执行这个方法的时候串行,效率不高
import pymysql
import threading
# 获取连接
conn = pymysql.connect(host="192.168.23.89",port="3306",user="root",password="root",database="syou",charset="utf8")
# 获取游标
cursor = conn.cursor
# 每次运行sql之前就ping一次,如果断开就重新连接
conn.ping(reconnect=True)
# 设置锁
thread_lock = threading.Lock()
# 开启锁
thread_lock.acquire()
# 插入语句
sql_str = "insert into table_name (name,age) values ('%s','%s')" % (name,age)
# 查询语句
sql_str = "select * from table_name where id='%d'" % (id)
# 修改语句
sqp_str = "update table set name='%s',fruit='%s'" % (name,fruit)
cursor.execute(sql_str)
#
conn.commit()
# 关闭锁
thread_lock.release()
方法二:使用线程池,每一个线程使用单独的连接,样例代码如下:
每一个线程使用一个连接,不再是多个线程使用一个连接
import pymsql
from DBUtils.PooledDB import PooledDB, SharedDBConnection
class DB:
# 构造函数
def __init__(self):
try:
self.pool = PooledDB(
creator=pymysql, # 使用连接数据库的模块
maxconnections=10, # 连接池允许的最大连接数,0 和 None表示不限制连接数
mincached=3, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
maxcached=3, # 链接池中最多闲置的链接,0和None表示不限制
maxshared=0, # 链接池中最多共享的链接数量,0和None表示全部共享, 注:因为pymysql 和 mysqldb等模块的threadsafety都为1,所以值无论设置为多少,_maxcached永远为0,所有永远是所有链接都共享
blocking=True, # 链接池中如果没有可用连接后,是否阻塞等待,True:等待 False:不等待然后报错
maxusage=None, # 一个连接最多被重复使用的次数,None表示无限制
setsession=[], # 开始会话迁执行的命令列表。如:["set datestyle to ...","set time zone ..."]
ping=1, #ping mysql服务端,检查服务是否可用 0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
host=DHOST,
port=DPORT,
user=DUSER,
password=DPWD,
database=DATABASE,
charset=CHARSET
)
except:
pass
def connect(self):
"""
获取连接和游标
:return:
"""
# 连接
conn = self.pool.connection()
# 游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
return conn,cursor
def connect_close(self,conn,cursor):
"""
关闭链接
:param conn:
:param cursor:
:return:
"""
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
#查
def select(self,sql,data=[]):
conn,cursor = self.connect()
try:
if not data:
cursor.execute(sql)
else:
cursor.execute(sql,data)
# pymysql默认不会自动提交事务,所以insert需要手动commit,而select却没有commit,
# 事实是,select的时候也需要commit,否则有可能查不到数据,返回空
conn.commit()
# 返回多个元素,字典列表
data = cursor.fetchall()
# 关闭游标和连接
self.connect_close(conn=conn,cursor=cursor)
# 返回数据
return data
except():
# 游标和连接
self.connect_close(conn=conn, cursor=cursor)
# 返回空值
return []
版权声明:本文为syousetu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。