Catalyst+FastCGIで「MySQL server has gone away」→mysql_auto_reconnect[DBIC]
[error] DBIx::Class::ResultSet::pager(): DBI Exception: DBD::mysql::st execute failed: MySQL server has gone away
なんていうエラーが出てたのですが、
FastCGI(Catalystの方?)では$ENV{GATEWAY_INTERFACE}も$ENV{MOD_PERL}もないので、どうもmysql_auto_reconnectを自分でOnにしないとだめなようです。
とのことです。非常に助かります。
Model::MyModel: schema_class: MySchema connect_info: - [dns, user, pass] - AutoCommit: 0 mysql_auto_reconnect: 1$c->model('MyModel')->storage->dbh->{mysql_auto_reconnect}が1になってることを確認しました。 明日の朝、例のエラーが出なくなってるかどうかを確認。
This attribute is ignored when AutoCommit is turned off, and when AutoCommit is turned off, DBD::mysql will not automatically reconnect to the server.とか書いてあるよ!Σ(゚Д゚なんてこった! とりあえず、connect_infoの属性のAutoCommitを1にしてみた。
Model::MyModel: schema_class: MySchema connect_info: - [dns, user, pass] - AutoCommit: 1 mysql_auto_reconnect: 1明日の朝、例のエラーが出なくなってるかどうかをもう一度確認。。。 これAutoCommitにしたくないときは、AutoReconnectを使わずに自前で「一定時間毎にSELECT 1を実行する」みたいにしなきゃいけないのかな?
mysql_auto_reconnectに言及している人、少ないなあ。
今更追記しますが、少ないのは当たり前かも。DBICを使うとき普通AutoCommitをオフにしません。参考:DBIx::Classで手動コミット - Lyo.blog