保持连接活跃 - mysql

5

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

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

同样,我有一个按钮用于“断开连接”的目的,但是使用=false;实现相同的功能。

我的问题是我连接到的数据库托管在共享托管帐户上,mysql服务器将wait_timeout变量设置为60秒,interactive_timeout设置为30秒。自然情况下,如果我在60秒内不使用我的应用程序,它会与我断开连接。

有没有办法保持连接处于活动状态?

托管公司不会更改设置,所以我被卡住了。

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

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


1
每隔大约10秒钟“ping”一次数据库。 - kobik
@kobik,你能提供一个代码示例吗?我在谷歌搜索中遇到了mysql_ping,考虑将其添加到TTimer中,但尚未找到如何实现的代码示例。如果您愿意,可以将其作为答案,这样我就可以接受了,非常感谢! - t1f
1
也许 @Kobik 正在考虑执行一个 "SELECT 1" (这个操作涉及较少的服务器活动和网络流量)。 - MartynA
1
您可以使用同一连接进行多个查询。只需创建另一个查询,用于定期活动即可。 - Jerry Dodge
1
我认为在定时器中使用 TSQLConnection.Exceute('DO 0', nil) 可以完成这项工作。 - kobik
显示剩余5条评论
1个回答

8

您可以使用 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更好(稍微快一些)-你有什么想法吗? - t1f
2
DO 0DO 1之间没有区别,它们都评估一个表达式而不返回值,而SELECT 0SELECT 1则返回结果集。然而,在网络流量方面的差异是可以忽略不计的。参见:https://dev59.com/f3E85IYBdhLWcg3w64EA - kobik
我明白了,是的,那正是我所阅读的,好的...谢谢你的回答:) - t1f
1
Exceute 中有拼写错误。 - Peter Chaula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接