2013-04-26 189 views
9

我有一個Symfony命令行任務,該任務有刪除mysql連接的習慣。如果連接丟失或超時,刷新數據庫連接

其數據導入任務。它從多個連接中提取數據。它不是一個大問題,而是一些小問題。

它似乎在首次運行時斷開連接。大約通過腳本的一半。然而,它的第二次運行(從一開始)它總是完成任務。

它不會在查詢上超時,因爲我得到的錯誤響應是連接已被丟棄,並且它自己運行正常。所以即時通訊認爲它的某種超時問題在第二次由於查詢緩存而加速腳本運行時可以避免。

所以我的問題是如何刷新數據庫連接?

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

+0

您能向我們展示查詢嗎?你在使用教義嗎?我們在談論多少行(導入)? – 2013-05-04 00:25:41

+0

MySQL日誌在嘗試失敗後是否有任何條目? – likeitlikeit 2013-05-04 19:10:45

回答

8

我想你的意思是連接到數據庫,如果由於某種原因連接丟失。鑑於一個EntityManager,你可以做以下的方法:

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

隨着getConnection,您檢索的連接對象學說用途(Doctrine\DBAL\Connection),其公開connect方法。

隨時檢查連接是否已建立,您可隨時撥打connect。如果是這種情況,則返回false。

還有一個isConnected方法來檢查連接是否建立。您可以使用它來查看連接正在丟失的位置,以更清楚地瞭解發生的情況。

+1

它不起作用。當連接丟失實體管理器已連接的事物時,導致沒有聽衆。工作解決方案是http://stackoverflow.com/questions/15362070/zf2-doctrine2-server-has-gone-away-how-to-jog-an-old-connection – 2014-03-08 13:15:08

6

另一種方法是通過連接中的ping()方法來檢查doctrine是否仍然連接到mysql服務器。如果連接丟失,請關閉活動連接,因爲它尚未關閉,並啓動一個新連接。

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

這是正確的答案! – Sliq 2017-04-21 13:42:47