【问题标题】:AnyEvent::DBI and database reconnectionAnyEvent::DBI 和数据库重连
【发布时间】:2014-04-06 22:08:43
【问题描述】:

我在单例程序包中使用 AnyEvent::DBI,当数小时后数据库/查询等中没有任何活动时,我在尝试发出查询时收到此错误:

DBD::mysql::st execute failed: MySQL server has gone away at /usr/local/share/perl/5.10.1/AnyEvent/DBI.pm line 98.

一个简单的方法是:连接到数据库 ==> 发出查询 ==> 关闭连接。 这种方式是我在使用 DBI 时通常使用的方式。

我的问题是我找不到使用 AnyEvent::DBI 重新连接到数据库的方法,除非创建一个新的 AnyEvent::DBI 实例(新)。

任何建议都会很棒!

【问题讨论】:

    标签: mysql perl event-handling database-connection dbi


    【解决方案1】:

    根据 CPAN 上的 DBD::mysql 文档,您要使用:

    $dbh->{mysql_auto_reconnect} = 1;
    

    这里是参考链接:

    http://metacpan.org/pod/DBD::mysql

    【讨论】:

      【解决方案2】:

      在 MySQL 中有一个 wait_timeout 变量设置非交互式连接的持续时间。

      对于长时间运行的连接,您可以尝试将该值(默认值 = 28800)更改为更合适的值。

      wait_timeout 的值可以通过简单的查询来更新

      mysql> SET SESSION wait_timeout = 50000;
      

      并与另一个人一起检索

      mysql> SHOW VARIABLES LIKE 'wait_timeout';
      

      【讨论】:

      • 由于我不知道数据库将处于非活动状态的时间,我真的不知道设置wait_timeout需要多少秒,所以我猜,连接和重新连接到数据库是更好的解决方案?
      • @soulSurfer2010 数据库连接很昂贵;您是否已经尝试将 execute() 代码包装在 eval {} 块内(带有选项 RaiseError => 1 )?在execute() 之后检查$@ 可以提供重新连接的机会。
      • 问题是,我不知道如何在 AnyEvent::DBI 中重新连接。如果我直接使用 DBI,我现在可能已经想通了。
      • 您需要使用 on_error 构造回调设置错误处理来处理数据库断开连接错误。只需重新连接并重新创建您的手柄。您可以通过每隔一段时间针对数据库生成一个 SELECT 1 的计时器来解决它,但如果 sql server 重新启动、网络问题等,则另一种方式也将处理重新连接。
      • @MarcoDeLellis 与 MySQL 数据库连接真的很便宜。它不像 Oracle 和 MS SQL 那样昂贵。
      猜你喜欢
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      相关资源
      最近更新 更多