完善功能:数据库超时等待

This commit is contained in:
Qiea
2024-12-22 12:31:29 +08:00
parent 1d534be4c1
commit ec4054189f
5 changed files with 102 additions and 40 deletions

View File

@@ -1,20 +1,60 @@
import pymysql, threading
import pymysql, threading, time
from queue import Queue
from Tools import config, download_image, Hash, remove_image, compare, Image, imagehash, os, logging, clean_image
Myconn = pymysql.connect(
host=str(config['mysql']['host']),
user=str(config['mysql']['user']),
password=str(config['mysql']['password']),
database=str(config['mysql']['database'])
)
class MySQLConnectionPool:
def __init__(self):
self.pool_size = int(config['mysql']['pool_size'])
self.pool = Queue(maxsize=self.pool_size)
self.host = str(config['mysql']['host'])
self.user = str(config['mysql']['user'])
self.password = str(config['mysql']['password'])
self.database = str(config['mysql']['database'])
# 初始化连接池
for _ in range(self.pool_size):
conn = pymysql.connect(
host=self.host,
user=self.user,
password=self.password,
database=self.database,
cursorclass=pymysql.cursors.DictCursor
)
self.pool.put(conn)
import time
def get_connection(self, max_retries=5, wait_time=1):
"""获取一个数据库连接,如果连接池为空,继续尝试直到能够获取连接"""
retries = 0
while retries < max_retries:
if not self.pool.empty():
return self.pool.get()
else:
retries += 1
print(f"连接池中没有可用连接,正在尝试第 {retries} 次连接...")
time.sleep(wait_time) # 等待指定时间再尝试
raise Exception("连接池中没有可用连接,已尝试多次连接")
def release_connection(self, conn):
"""释放数据库连接"""
if conn:
self.pool.put(conn)
def close_all(self):
"""关闭所有连接"""
while not self.pool.empty():
conn = self.pool.get()
conn.close()
exit_flag = False
class UploadThread(threading.Thread):
def __init__(self, uploadqqnumber):
def __init__(self, uploadqqnumber, pool):
super().__init__()
self.uploadqqnumber = uploadqqnumber
self.conn = Myconn
self.pool = pool
self.conn = pool.get_connection()
def run(self):
@@ -23,24 +63,23 @@ class UploadThread(threading.Thread):
Hash(self.conn).tomysql(self.uploadqqnumber)
logging.info(f'上传成功: {self.uploadqqnumber}')
remove_image(self.uploadqqnumber)
self.conn.close()
self.pool.release_connection(self.conn)
class FindThread(threading.Thread):
def __init__(self, TargetImageHash):
def __init__(self, TargetImageHash, pool):
super().__init__()
self.TargetImageHash = TargetImageHash
self.conn = Myconn
self.pool = pool
self.conn = pool.get_connection()
def run(self):
global exit_flag
logging.debug(f'我是查询线程{self.TargetImageHash}')
res = Hash(self.conn).getqq(self.TargetImageHash)
if res != 'error':
logging.info(f'查询成功QQ号是: {res}')
exit_flag = True
self.conn.close()
self.pool.release_connection(self.conn)