【问题标题】:Reusing the database connection used by the doctrine entity manager重用理论实体管理器使用的数据库连接
【发布时间】:2014-11-09 06:58:39
【问题描述】:

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

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

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

【问题讨论】:

  • 学说旨在抽象底层数据库连接。你为什么要使用它?只需创建一个原始连接
  • @Aris 你读过帖子的最后一部分吗?我解释了原因。

标签: php mysql doctrine-orm


【解决方案1】:

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

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

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

附:我相信重用现有连接而不是创建新连接是完全正常的。我在一个有 Doctrine1 和 Doctrine2 的项目中这样做。

【讨论】:

  • 我会接受这个答案,不是因为它直接回答了我的问题,而是因为公共方法getWrappedConnection() 在实践中返回的实现或多或少直接使用了真实的连接资源不检查连接/事务状态。这对我来说,这表明开发人员不觉得这样的事情是必要的。因此,重用原始连接似乎是安全的。
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 2016-02-25
  • 2010-09-25
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多