问题遇到的现象和发生背景
我在使用python脚本处理一些计算需要操作MySQL数据库,使用了pymysql包封装了一个MySQL增改查删的类方法。定时执行脚本,但是有时会造成任务假死导致始终无法结束,第二次任务唤起时遭遇堵塞导致任务失败。经过添加日志查到是pymysql模块的connect()方法获取连接时卡死,即无法获取连接,也没有报错,一直停留在这一步。
这种问题是随机发生的,任务部署在服务器上。一般本地复现不了
用代码块功能插入代码,请勿粘贴截图
#mysql封装的类
class db_sdpku():
instance = None
def __new__(cls, *args, **kwargs):
# 判断类属性是否已经被赋值
if cls.instance is None:
cls.instance = super().__new__(cls)
# 返回类属性中单例的引用
return cls.instance
def __init__(self):
self.__db_host = parse.get('db_sdpku','host')
self.__db_port = int(parse.get('db_sdpku','port'))
self.__db_user = parse.get('db_sdpku','user')
self.__db_password = parse.get('db_sdpku','password')
self.__db_database = parse.get('db_sdpku','database')
# 连接数据库
def connect(self):
conn = pymysql.connect(
host=self.__db_host,
port=self.__db_port,
user=self.__db_user,
password=self.__db_password,
database=self.__db_database,
connect_timeout=10,
charset='utf8'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
return conn,cursor
def close(self,conn,cursor):
cursor.close() # 关闭游标
conn.close() # 关闭数据库
def select(self,sql):
logger.info(f'开始查询-{sql[0:100]}')
conn,cursor = self.connect()
logger.info(f'链接成功-{sql[0:100]}')
cursor.execute(sql)
data = cursor.fetchall()
logger.info(f'查询结束-{sql[0:100]}')
self.close(conn,cursor)
return data
######以下是日志结果
INFO 2022-11-18 19:36:55 config 开始查询-select a.account_id,a.access_token,'2022-11-18' date
from advertisers a,cost_daily_reports c where c.date='2022-11-18' and c.cost>0
and c.advertiser_id=a.id AND a.wechat_account_id<>'';
这一句开始查询有打印,之后就没有的结果,所以问题基本就处在了conn,cursor = self.connect()。我设置了链接超时时间是10s,如果是因为超时程序一直在尝试去连接数据库,超过10s应该报错结束,但显然是没有的,一直持续在这一环节,最终整个任务的堵塞。像问问这是什么原因导致,还是我方法有用的不对