【问题标题】:Keeping connection alive - mysql保持连接 - mysql
【发布时间】:2016-11-15 17:15:58
【问题描述】:

我已经设置了我使用名为Connect 的按钮创建的delphi 应用程序。 一旦我点击它,它就会执行以下代码:

begin
    someConnection.Connected:=true;
    somecomenziDataSet.Active:=true;
end;

同样,我有一个用于Disconnect 目的的按钮,它做同样的事情,但使用 =false;

我的问题是我要连接的数据库托管在共享主机帐户上,并且 mysql 服务器将 wait_timeout 变量设置为 60 秒,interactive_timeout 设置为 30 秒。 如果我 60 秒不使用我的应用程序,这自然会断开我的连接。

有什么办法可以保持这种联系吗?

托管公司不会更改设置,所以我坚持使用它。

我正在使用 RAD Studio 10 Seattle,dbexpress components,TSQLConnection,我的数据库是 mysql

如果我遗漏了任何必要的信息,请在评论中告诉我,谢谢!

【问题讨论】:

  • 每隔 10 秒左右“ping”一次数据库。
  • @kobik 你能为此提供一个代码示例吗?我确实在谷歌搜索时遇到了 mysql_ping 并且我考虑将其添加到 TTimer 但尚未找到有关如何执行此操作的代码示例,如果您愿意,可以将其作为答案,以便我可以接受,我将不胜感激,谢谢!
  • 也许@Kobik 正在考虑执行“SELECT 1”(这涉及很少的服务器活动或网络流量)。
  • 您可以有多个查询共享同一个连接。只需为定期活动创建另一个查询。
  • 我认为计时器中的TSQLConnection.Exceute('DO 0', nil) 可以完成这项工作。

标签: mysql sql delphi dbexpress


【解决方案1】:

您可以使用TTimer 定期“ping”数据库(例如,在 60 秒超时的情况下,间隔 10-20 秒):

procedure TMyDataModule.ConnectionPingTimer(Sender: TObject);
begin
  if not MySQLConnection.InTransaction then
    MySQLConnection.Execute('DO 0', nil); // or "SELECT 1" or whatever is cheapest
end;

【讨论】:

  • 谢谢,它有效 - 刚刚测试过。 DO 1 和 DO 0 之间有什么区别吗?我发现了一个很好的讨论,它以 DO 1 为例,并认为它比 select 1 或 mysql_ping 更好(稍微快一点)——有什么想法吗?
  • DO 0DO 1 之间没有区别,DO 1 计算表达式而不返回值,而 SELECT 0SELECT 1 返回结果集。然而,网络流量的差异可以忽略不计。另见:stackoverflow.com/q/2546868/937125
  • 我明白了,是的,这就是我正在阅读的内容,好的 .. 感谢您的回答:)
  • Exceute中的错字
猜你喜欢
  • 2020-12-06
  • 1970-01-01
  • 2018-06-06
  • 2023-03-16
  • 1970-01-01
  • 2011-01-16
  • 2017-07-27
  • 2011-03-14
  • 2013-06-15
相关资源
最近更新 更多