2013-04-26 17 views
9

私はmysql接続を削除する傾向があるSymfonyコマンドラインタスクを持っています。接続が切断またはタイムアウトした場合にデータベース接続をリフレッシュしてください

データインポートタスクです。複数の接続からデータをフェッチします。その1つの大きなクエリではなく、いくつかの小さなクエリです。

最初に接続したときに接続が切断されたようです。スクリプトの半分程度。しかし、2度目は(最初から)実行され、常にタスクが完了します。

私が受け取るエラーレスポンスとしてクエリにタイムアウトしないのは、接続が切断され、それ自体が正常に動作することです。だから私は、スクリプトを高速化するクエリキャッシングのために2回目の実行時に回避される、何らかの種類のタイムアウト問題を考えています。

私の質問はどのようにデータベース接続を更新するのですか?

[Doctrine\DBAL\DBALException]
SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query

+0

私たちにクエリを表示できますか?教義を使っていますか?何行目(インポート)の行について話していますか? –

+0

失敗した試行後にMySQLログにエントリがありますか? – likeitlikeit

答えて

8

何らかの理由で接続が失われた場合は、データベースに接続する必要があります。 EntityManagerを考えると、あなたはそれを次のように操作を行うことができます。getConnection

$success = $_em->getConnection()->connect(); 

は、あなたがconnectメソッドを公開し、接続オブジェクトの教義の用途(Doctrine\DBAL\Connection)を、取得しています。

接続が確立されていることを確認すると、いつでもconnectに電話をかけることができます。この場合、falseを返します。

接続が確立されていることを確認する方法もあります。それを使って接続が正確にどこに落ちているのかを確認し、何が起きているのかをより明確に把握できます。

+1

動作しません。コネクションがすでに接続されているエンティティマネージャを失った場合、そのためのリスナは存在しません。作業ソリューションはhttp://stackoverflow.com/questions/15362070/zf2-doctrine2-server-has-gone-away-how-to-jog-an-old-connection –

6

異なるアプローチは、接続でping()メソッドを使用してdoctrineがmysqlサーバに接続されているかどうかを確認することです。接続が失われた場合は、まだ実際には閉じられていないので、アクティブな接続を閉じて新しい接続を開始してください。

if(FALSE == $em->getConnection()->ping()){ 
    $em->getConnection()->close(); 
    $em->getConnection()->connect(); 
} 
+0

これは正解です! – Sliq

関連する問題