一个后台操作算得太久,然后再想跟MySQL说说话的时候,就发现那个server已经偷偷的跑掉了。
MySQL的超时可以用SQL查到:
mysql show variables;
看interactive_timeout和wait_timeout这两项。缺省是28800(秒),我们的服务器上设成了600。所以,一个长循环跑了11分钟之后,数据库连接已经被关掉了,因为中间没有和数据库打交道。
(多长的循环可以跑10分钟?我看到的大概是8000多和20000多的两个数组做了一下select…)
这些变量可以在/etc/my.cnf里面设置的。
Rails应用可以把ActiveRecord::Base.verification_timeout设为一个小于数据库连接超时的值(比如500)这样Rails就会帮你每过500秒PING一下数据库这样连接就不会断掉了。
(唔…10分钟会让很多东西超时,比如Apache…)
然则我们的操作是Rails之外的一个stand-alone进程,Rails也不管帮忙它,所以要在循环的过程中时不时的PING一下数据库:
ActiveRecord::Base.connection.verify!(0)
于是就可以了。