超时重新连接MySQL

2023-11-23

我有一个 Python 程序,它在后台运行数周,并且每隔一段时间就会进行数据库查询。为此,我使用 ORMpeewee(版本 2.2.1)。我在用MySQL作为后端。

最近,我在访问数据库时经常遇到问题,通常是在运行程序几天后。引发的错误peewee is

peewee.OperationalError: (2006, 'MySQL server has gone away')

回溯很深peewee。我将其发布在这里,但作为我的virtualenv使文件名太长,我正在缩短它们:

  File ".../local/lib/python2.7/site-packages/peewee.py", line 2910, in save
    ret_pk = self.insert(**field_dict).execute()
  File ".../local/lib/python2.7/site-packages/peewee.py", line 2068, in execute
    return self.database.last_insert_id(self._execute(), self.model_class)
  File ".../local/lib/python2.7/site-packages/peewee.py", line 1698, in _execute
    return self.database.execute_sql(sql, params, self.require_commit)
  File ".../local/lib/python2.7/site-packages/peewee.py", line 2232, in execute_sql
    self.commit()
  File ".../local/lib/python2.7/site-packages/peewee.py", line 2104, in __exit__
    reraise(new_type, new_type(*exc_value.args), traceback)
  File ".../local/lib/python2.7/site-packages/peewee.py", line 2223, in execute_sql
    res = cursor.execute(sql, params or ())
  File ".../local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
    self.errorhandler(self, exc, value)
  File ".../local/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
peewee.OperationalError: (2006, 'MySQL server has gone away')

我发现的可能的解决方案尝试:

  • In 这个问题,其中一条评论建议 pingMySQL服务器每隔一段时间就保持它(连接?)活动。不过,我不确定如何通过 ORM 来做到这一点。 (我应该简单地SELECT 1每小时一次,是吗?)
  • In 这个 github peewee 问题,这是 4 个月前打开的,虽然提到了同样的错误,但据称它已解决(并且我正在使用较新的版本)。
  • In a 7年前的问题 of trac,一个建议是增加超时时间MySQL3天。
  • In this 论坛讨论,增加的选项MySQL建议设置超时,但提供了“使用 MySQL JDBC 连接器的 autoReconnect 选项”的替代方案。我试图弄清楚Python是否存在这样的选项MySQLdb模块,但找不到。
  • 我找到了这个MySQL 参考页面关于重新连接行为,但对于我的理解来说有点复杂MySQL(通常我只使用 ORM),并且我不知道如何应用其中的任何一个peewee.

即使我能够 ping 数据库以使连接保持活动状态更长时间,我认为在不需要连接时保持连接活动状态被认为是一种不好的做法。有没有办法通过 ORM 重新打开连接?我考虑 ping 和增加超时MySQL作为解决方法,而真正的解决方案是在需要时重新连接(真正的解决方案就是我所要求的)。


我遇到了同样的问题,对于使用 MySQLdb 的 peewee,我在初始化 MySQL 数据库实例时得到了以下解决方案:

db = MySQLDatabase(db_name, user=db_username, passwd=db_password, host=db_host, port=db_port)
db.get_conn().ping(True)

其中 ping 函数有:

检查与服务器的连接是否正常。如果它 已关闭,将尝试自动重新连接。

此功能适合长时间闲置的客户端使用 while,检查服务器是否已关闭连接 并在必要时重新连接。

1.2.2 中的新增功能:接受可选的重新连接参数。如果为真,那么 客户端将尝试重新连接。注意这个设置是 执着的。默认情况下,此功能在 MySQL

非标准。您应该假设 ping() 执行隐式 回滚;仅在开始新事务时使用。你已经 警告。

in the db.get_conn().ping.__doc__。请注意db.get_conn().ping(True)如果您再次创建另一个连接,则必须使用该连接。因此,如果您重新连接(通过db.connect()例如)您必须重复 ping。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超时重新连接MySQL 的相关文章

随机推荐

  • Linux 中对 pthread_create 的未定义引用

    我从网上获取了以下演示https computing llnl gov tutorials pthreads include
  • C++14 中不指定对象的左值

    我在这里使用 N3936 作为参考 如果 C 14 文本有任何不同 请更正此问题 3 10以下左值和右值我们有 每个表达式都属于该分类中的基本分类之一 左值 x值或纯右值 然而 定义lvalue reads An lvalue 指定一个函数
  • C 中的按位连接

    我正在尝试在 C 中连接两个二进制数 所以如果我有1010 and 0011我希望我的结果是10100011 我写了一个我认为可以完成这项工作的简短例程 include
  • Eclipse 优化导入以包括静态导入

    有没有办法让 Eclipse 自动查找静态导入 例如 现在我终于升级到了 Junit 4 我希望能够编写 assertEquals expectedValue actualValue hit Ctrl Shift O and have Ec
  • 重置 svg 填充 css

    我想让所有 svgs 都具有相同的纯色 所以我用 svg fill ccc 但我想在 hover 上获得默认填充 如何禁用填充并恢复默认值 您可以使用以下方法执行此操作 not 并有效地设置 不悬停 的样式 svg not hover fi
  • Jupyter:安装后没有名为“imblearn”的模块

    我在 ANACONDA Navigator 上安装了 imbalanced learn 版本 0 3 1 当我使用 Jupyter Python 3 运行不平衡学习网站上的示例时 from imblearn datasets import
  • Git版本兼容性

    使用 Git 进行版本控制 与不同版本的 Git 协同工作的效果如何 有关的体验 好还是坏 是什么 长话短说 我正在考虑将 Git 用于一些计划的家庭项目 但由于我使用存储库中的默认包进行的大杂烩设置将意味着完全不同的版本 我计划在运行 U
  • 关于 C# 变量作用域与其他语言的问题

    首先声明一下 我以前没用过C 对它了解不多 我正在学习 Sebesta 的 编程语言概念第 9 版 一书 准备 编程语言 考试 当我读到以下摘录自 范围声明顺序 第246页 时 我有点困惑 例如 在 C99 C Java 中 所有局部变量的
  • 没有RTTI的shared_ptr?

    我正在尝试使用shared ptr在使用 xc32 1 34 gcc 4 5 2 的衍生版本 构建的嵌入式项目中 该项目已禁用 RTTI fno rtti include
  • 如何在 MVC3 中从 javascript 调用控制器方法?

    我使用 MVC3 架构 c net 当焦点更改到下一个字段 即密码字段 时 我需要立即将文本框内容 用户 ID 与数据库进行比较 所以我想对 User Id 字段使用 onblur 事件 然后调用 Controller 方法 谁能告诉我如何
  • 通过套接字发送和接收数组

    是否可以使用Python通过UDP套接字发送数组 我正在使用 Python 2 5 并尝试发送一个简单的数组 但它不起作用 它可以成功发送数组 但是当我尝试使用数组的一项来打印它时 程序崩溃了 我不确定错误是什么 因为我采取了预防措施将数据
  • 使用 psycopg2 将 PostgreSQL UUID 数组作为列表返回

    我有一个 SQL 语句 其中包含嵌入在ARRAY 像这样 SELECT foo ARRAY SELECT x from y AS bar 查询工作正常 但是在 psycopg2 结果游标中 数组作为字符串返回 如 1 2 3 而不是列表 我
  • CQL SELECT 大于索引非键列上的查询

    EDIT1 在原始问题之后添加了一个案例来描述问题 我希望查询不属于我的键的列 如果我理解正确的话 我需要在该列上定义一个二级索引 但是 我希望使用大于条件 不仅仅是相等条件 但这似乎仍然不受支持 我错过了什么吗 您将如何解决这个问题 我想
  • 使数组严格递增所需的最少更改

    我遇到一个问题 我们有一个正数数组 我们必须通过对数组元素进行零次或多次更改来使其严格增加 我们被问到使数组严格递增所需的最少更改次数 Example 如果数组是 1 2 9 10 3 15 因此 如果将 3 更改为 12 到 14 之间的
  • 打字稿中的 lodash _.get 函数

    经过一番谷歌搜索后 我感觉很多 lodash 的功能都可以使用本机打字稿来实现 但我找不到 get 函数的直接答案 在lodash中 使用 get函数警告1 let obj a b 1 let a get obj a b alert a 有
  • 权威 C++ 书籍指南和列表

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 这个问题试图从每年出版的数十本糟糕的 C 书籍中收集少数珍珠 与许多其他编程语言 通常是从 Internet 上的教程中学习 不同 很少有人能够在不学习一本写得
  • Javascript数字连接而不是相加,但typeof是数字而不是字符串

    我是 JavaScript 新手 我正在构建一个计算器here 我已将输入值存储在变量中 以便最终可以操纵结果以根据输入执行计算 现在我只想将所有值加在一起 然而 它们不是相加 而是连接 我使用 parseInt 来防止 javascrip
  • 我可以监控线程消息队列的大小吗?

    我们的应用程序从 DCOM 收到系统调用失败 RPC 错误 0x80010100 我们怀疑目标线程的消息队列已满 尽管我不相信这是真的 我知道队列是仅限于10 000消息我想看看在常见情况下我们是否接近这个数字 有没有办法监控线程消息队列的
  • Google Play - 未发布应用程序的下载链接?

    是否可以提供 Google Play 中未发布的应用程序的下载链接 我想在发布之前将其发送给一些人 我知道我可以只发送 APK 但我想先上演它 Thanks 是的 可以直接从 URL 下载应用程序 亚马逊应用程序商店就是以这种方式分发的 唯
  • 超时重新连接MySQL

    我有一个 Python 程序 它在后台运行数周 并且每隔一段时间就会进行数据库查询 为此 我使用 ORMpeewee 版本 2 2 1 我在用MySQL作为后端 最近 我在访问数据库时经常遇到问题 通常是在运行程序几天后 引发的错误peew