若水至上 2022-11-18 20:19 采纳率: 33.3%
浏览 18
已结题

pymysql获取链接卡死

问题遇到的现象和发生背景

我在使用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应该报错结束,但显然是没有的,一直持续在这一环节,最终整个任务的堵塞。像问问这是什么原因导致,还是我方法有用的不对

  • 写回答

9条回答 默认 最新

  • chuifengde 2022-11-18 22:05
    关注

    两点考虑
    1.数据量的大小
    2.不要频繁用类实例去连接数据库,可以考虑数据池。如:https://blog.csdn.net/moli_Y/article/details/127923274

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 12月2日
  • 已采纳回答 11月24日
  • 赞助了问题酬金15元 11月18日
  • 修改了问题 11月18日
  • 展开全部

悬赏问题

  • ¥40 求一款能支持ios15以上的屏蔽越狱插件。比较好用的
  • ¥15 C++ QT对比内存字符(形式不定)
  • ¥30 C++第三方库libiconv 远程安装协助
  • ¥15 https://github.com/youlaitech/vue3-element-admin/blob/master/src/store/modules/user.ts 这2句代码如何理解
  • ¥15 duilib开发文本字串超过长度显示
  • ¥20 mysql的.ibd文件为啥那么多
  • ¥15 C++中采用栈和BFS算法求解迷宫问题
  • ¥15 关于#java#的问题:这是跳转失败出现的界面这是哪个出现问题的servlet(开发工具-ide)
  • ¥15 EBS R12费用采购跨月冲销
  • ¥15 python中用mplfinance如何做到多股同列?