2 回答

TA貢獻1845條經(jīng)驗 獲得超8個贊
只需在任何插入操作之前斷開連接:
public function handle(…)
{
// your time-consuming business logic
// disconnect if needed
if (!$this->entityManager->getConnection()->ping()) {
$this->entityManager->getConnection()->close();
}
// save your work
$this->entityManager->flush();
}

TA貢獻2037條經(jīng)驗 獲得超6個贊
在閱讀了我的中間件的代碼后,尤其是這個塊
https://github.com/symfony/symfony/blob/4.4/src/Symfony/Bridge/Doctrine/Messenger/DoctrinePingConnectionMiddleware.php
class DoctrinePingConnectionMiddleware extends AbstractDoctrineMiddleware
{
protected function handleForManager(EntityManagerInterface $entityManager, Envelope $envelope, StackInterface $stack): Envelope
{
$connection = $entityManager->getConnection();
if (!$connection->ping()) {
$connection->close();
$connection->connect();
}
if (!$entityManager->isOpen()) {
$this->managerRegistry->resetManager($this->entityManagerName);
}
return $stack->next()->handle($envelope, $stack);
}
}
我們可以看到我的處理程序在連接打開后立即被調(diào)用。這種行為應該可以工作,我認為是這樣,但是 FFMPEG 可以在很長一段時間內(nèi)使用相同的 RabbitMQ 消息工作。因此,將某些內(nèi)容插入數(shù)據(jù)庫的處理程序的最后一步可能會提供 mySQL 已消失錯誤或連接超時。
這就是為什么,我把這個片段放到一個方法中,沒有調(diào)用處理程序,只包含與學說連接相關的代碼,然后我在任何插入到我的數(shù)據(jù)庫之前調(diào)用它,如下所示:
public function __invoke(AMQPvideoFFMPEG $message)
{
// reset connection if not found
$this->processService->testConnection();
$process = $this->processService->find($message->getProcess());
$this->renderServcie->updateQueue($process->getQueue(), "processing");
// some other stuff
}
testConnection() 方法在哪里
/**
* Reconnect if connection is aborted for some reason
*/
public function testConnection()
{
$connection = $this->entityManager->getConnection();
if (!$connection->ping()) {
$connection->close();
$connection->connect();
}
}
但在那之后我又嘗試了另一個問題
不支持重置非惰性管理器服務。將“doctrine.orm.default_entity_manager”服務設置為惰性服務,并在您的 composer.json 文件中要求“symfony/proxy-manager-bridge”。
安裝“symfony/proxy-manager-bridge”后,錯誤消失了。
到目前為止,還沒有遇到連接超時。等著瞧。
- 2 回答
- 0 關注
- 196 瀏覽
添加回答
舉報