重用学说实体管理器使用的数据库连接

goa*_*oat 6 php mysql doctrine-orm

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

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

旁白:我想这样做的原因是为了性能。我还有一些不是用学说编写的代码,它需要原始数据库连接,因为它使用本机 db 扩展函数。我可以只打开另一个 db 连接,但打开第二个连接在我的场景中具有显着的性能影响......这使得尝试重用学说连接非常有吸引力。

b.b*_*4rd 3

尝试getWrappedConnection返回Doctrine\DBAL\Driver\PDOConnection一个包装器的实例\PDO

$connection = $this->getEntityManager()
    ->getConnection()
    ->getWrappedConnection();

$stmt = $connection->prepare('SELECT * FROM `City`');
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

PS 我相信重用现有连接而不是创建新连接是完全正常的。我正在一个具有 Doctrine1 和 Doctrine2 的项目中执行此操作。