python - MySQL服务器消失问题

标签 python mysql

我是 python 新手,所以,它看起来像是我在该语言上的第一个项目。 每次当我尝试运行我的脚本时 - 我从 mysql 服务器得到不同的答案。
最常见的答案是OperationalError: (2006, 'MySQL server has gone gone') 有时我会得到输出 Thread: 11 commited (参见下面的代码)。
有时紧急停止(翻译过来,我在控制台中有俄语输出)。
无论输出是否充满commited - 表中的记录仍然相同。

import MySQLdb
import pyping
import socket, struct
from threading import Thread

def ip2int(addr):
    """Convert ip to integer"""
    return struct.unpack("!I", socket.inet_aton(addr))[0]

def int2ip(addr):
    """Convert integer to ip"""
    return socket.inet_ntoa(struct.pack("!I", addr))

def ping(ip):
    """Pinging client"""
    request = pyping.ping(ip, timeout=100, count=1)
    return int(request.max_rtt)

class UpdateThread(Thread):
    def __init__(self, records, name):
        Thread.__init__(self)
        self.database = MySQLdb.connect(host="***", port=3306, user="root", passwd="***", db="dns")
        self.cursor = database.cursor()
        self.name = name
        self.records = records
    def run(self):
        print(self.name)
        for r in self.records:
            #latency = ping(int2ip(r[1])) what the hell :x
            #ip = str(int2ip(r[1]))
            id = str(r[0])
            self.cursor.execute("""update clients set has_subn=%s where id=%s""" % (id, id))
        self.database.commit()
        print(self.name + " commited")

#start
database = MySQLdb.connect(host="***", port=3306, user="root", passwd="***", db="dns")
cursor = database.cursor()
cursor.execute("""select * from clients""")
data = cursor.fetchall() #All records from DataBase
count = len(data) 
threads_counter = 10 #We are creating 10 threads for all records
th_count = count / threads_counter #Count of records for each thread
last_thread = count % threads_counter #Last records
threads = []

i = 0
while i < (count - last_thread):
    temp_list = data[i:(i+th_count)]
    #print(temp_list)
    threads.append(UpdateThread(records = temp_list, name = "Thread: " + str((i/3) + 1)).start())
    i += th_count

threads.append(UpdateThread(records = data[i: count], name = "Thread: 11").start())

附注
我在这里找到的另一个答案对我没有帮助。

更新:
我发现一些(每次)线程打印
OperationalError: (2013, '在查询期间失去与 MySQL 服务器的连接') 并且所有接下来的线程打印 OperationalError: (2013, '在查询期间失去与 MySQL 服务器的连接')

最佳答案

使用完数据库连接后,您需要关闭它们,否则数据库服务器将不堪重负,并使您的连接过期。对于您的程序,我会更改您的代码,以便您只有一个数据库连接。您可以将对它的引用传递给 UpdateThread 实例,并在完成后关闭它。

database.close()

关于python - MySQL服务器消失问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29744708/

相关文章:

python - 使用 countvectorizer() 和 tfidfvectorizer() 向量化列表列表

python - 如何在 Django Web 上使用 POST Rest API?想在 django 中使用用户注册的 API,这是我完成的代码

php - Doctrine2,ManyToMany 关系 => SQLSTATE[42000] : Syntax error or access violation

php - 从一对多关系中的第二个表中获取记录会在 laravel 5.2 中产生错误

php - 如何更改从 PHP 中的 MySQL 查询返回的数据格式

jquery:来自服务器的实时消息传递?

python - 定位列表中重复项的位置及其位置

python - imp.find_module() 支持压缩鸡蛋

mysql - 如何在 MySQL 中选择每组多行?

mysql - 根据特定关联从表中删除一行