重用原则实体管理器使用的数据库连接


Reusing the database connection used by the doctrine entity manager

Doctrine 将特定于驱动程序的本机数据库连接资源句柄封装在其连接类中。我说的是返回的资源,例如,mysqli_connect().我没有看到任何访问原始连接资源的方法 - 我找不到任何 getter 方法。这种强大的封装可能应该是一个暗示,我不应该尝试访问它并使用它,但当然,这正是我想要做的。

如果我从同一连接发出只读选择查询,是否会导致任何问题?我不确定教义的工作流程是如何运作的。数据库连接是有状态的,我有点害怕我可能会在 doctrine 有一些多步骤事务部分正在进行时跳入并发出 sql 查询,这显然会导致问题。但是由于 php 的单线程性质,我认为在实践中很有可能是不可能的,这取决于 doctrine 的工作原理。

旁白:我想这样做的原因是为了性能。我还有其他一些代码不是用原则编写的,它想要一个原始数据库连接,因为它使用本机数据库扩展函数。我可以只打开另一个数据库连接,但在我的场景中打开第二个连接会对性能产生重大影响......这使得尝试重用教义联系非常有吸引力。

尝试getWrappedConnection它返回Doctrine'DBAL'Driver'PDOConnection的实例,该实例是'PDO的包装器:

$connection = $this->getEntityManager()
    ->getConnection()
    ->getWrappedConnection();
$stmt = $connection->prepare('SELECT * FROM `City`');
$stmt->execute();

附言我相信重用现有连接而不是创建新连接是完全正常的。我在一个具有教义 1 和教义 2 的项目中这样做。