提问人:Xavi Montero 提问时间:6/26/2023 更新时间:6/28/2023 访问量:129
如何在长时间运行的进程上保持 Doctrine DBAL 连接处于活动状态,该进程闲置数小时等待输入?
How to keep-alive a Doctrine DBAL connection on a long-running process that is idle for hours awaiting input?
问:
我有一个长时间运行的进程,一个在后面使用 ReactPhp 并持续运行数小时的 symfony 命令。
如果未使用 DBAL $connection,则会中断,并且下次进入并处理请求时,将引发异常。
我想知道这是否是不可恢复的,或者学说提供了一种“刷新”连接的机制(某种保持活力)。
我都跑过了
php bin/console debug:config doctrine
php bin/console config:dump-reference doctrine
我没有运气。
问题
我可以添加某种“keep-alive”指令,每 5 分钟发送一次某种虚拟指令以避免连接中断吗?SELECT 1
答:
0赞
Rufinus
6/28/2023
#1
您只需要测试并重新打开您的连接。
use Doctrine\Persistence\ManagerRegistry;
class MyService
{
public function __construct(protected ManagerRegistry $managerRegistry)
{}
public function getWhatever(): Collection|array
{
$qb = $this->getEntityManagerFor(MyEntity::class)->createQueryBuilder('myentity');
$qb->andWhere('myentity.whatever = :whatever')
->setParameter('whatever', 'what?');
return $qb->getQuery()->getResult();
}
protected function getEntityManagerFor(string $entityClass): EntityManager
{
if (!$this->managerRegistry->getManagerForClass($entityClass)->isOpen()) {
$this->managerRegistry->resetManager();
}
return $this->managerRegistry->getManagerForClass($entityClass);
}
}
如果您有关闭管理器的 SQL 错误,这也是有用的。
评论