【问题标题】:How to Prevent "MySql has gone away" when using TIdHTTPServer使用 TIdHTTPServer 时如何防止“MySql 已消失”
【发布时间】:2014-10-06 13:33:31
【问题描述】:

我使用 Delphi 和 Indy TIdHttpServer 组件编写了一个 Web 服务器。我正在管理一个与 MySql 数据库的 TAdoConnection 连接池。当一个请求进来时,我会在我的池中查询可用的数据库连接。如果一个不可用,则创建一个新的 TAdoConnection 并将其添加到池中。

当连接变得“陈旧”(即它已经有一段时间没有被使用)时,就会出现问题。我认为在这种情况下,查询会导致“MySql has gone away”错误。

有没有人有办法解决这个问题?或者我会自己通过以下方式之一来管理它:

  1. 编写将定期“刷新”所有连接的线程。
  2. 跟踪最后一个活动查询,如果太旧,请放弃使用连接并释放它。

【问题讨论】:

  • 连接数据库时在池对象中添加时间戳,当池对象“旧”(即 x 分钟)时丢弃池对象并创建新连接...跨度>

标签: mysql delphi indy


【解决方案1】:

两个建议:

  • 为每个池连接存储一个“上次使用”时间戳,如果请求连接,请检查连接是否太旧 - 在这种情况下,创建一个新连接

  • 添加一个 validateObject() 方法,该方法发出一个无操作 SQL 查询来检测连接是否仍然健康

  • 定期清理池的后台线程:删除空闲连接允许在高峰使用后将池大小降至最低

有关一些建议,请参阅这篇关于 Apache Commons Pool 框架的文章:http://www.javaworld.com/article/2071834/build-ci-sdlc/pool-resources-using-apache-s-commons-pool-framework.html

【讨论】:

  • 想了这么多......我认为我需要比较的阈值是“等待超时”??
  • @MSchenkel 查看我的更新...等待超时可能是 mysql 客户端放弃等待服务器响应的时间。链接的文章提到了一个配置选项 minEvictableIdleTimeMillis。我会保持这个设置独立于 mysql 等待超时,以允许更小或更大的值。
猜你喜欢
  • 2017-03-20
  • 2020-07-07
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多