pymysql.err.InterfaceError: (0, ‘’)

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版权协议,转载请附上原文出处链接和本声明。