2011-10-07 124 views
3

我使用AnyEvent :: DBI在一个单封装,当有数据库中没有活动/查询等几个小时后,我得到这个错误,而试图发出一个查询: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实例(新的)。

任何建议将是伟大的!

回答

1

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

对于长时间运行的连接,你可以尝试改变这个值(默认值= 28800),到更合适的一个。

wait_timeout值可以用一个简单的查询

mysql> SET SESSION wait_timeout = 50000; 

进行更新,并与另一个

mysql> SHOW VARIABLES LIKE 'wait_timeout'; 
+0

因为我不知道该数据库将有多少时间是处于非活动状态,我真的不能知道多少秒设置WAIT_TIMEOUT,所以我想,连接和重新连接到数据库是一个解决方案更好 – snoofkin

+1

@ soulSurfer2010数据库连接价格昂贵;你是否已经尝试将'execute()'代码包装在'eval {}'块中(带有选项'RaiseError => 1')?在execute()之后检查'$ @'可能会提供重新连接的机会。 –

+0

问题是,我不知道如何在AnyEvent :: DBI中重新连接。如果我直接使用DBI,那么现在我可能已经想出了一个。 – snoofkin