是否可以将 Doctrine 与持久 PDO 连接一起使用?

Posted

技术标签:

【中文标题】是否可以将 Doctrine 与持久 PDO 连接一起使用?【英文标题】:Is it possible to use Doctrine with persistent PDO connections? 【发布时间】:2013-04-19 12:08:00 【问题描述】:

我正在尝试通过启用持久数据库连接来提高 volkszaehler.org 实现的性能。在将 Doctrine 的 Connection 类入侵到 PDO::ATTR_PERSISTENT => true 之后,我收到了 PDO 错误 General error: PDO::ATTR_STATEMENT_CLASS cannot be used with persistent PDO instances"

有没有办法解决这个问题?

【问题讨论】:

它坏了吗?连接池 PDO 提供的标准方式有什么问题?还是只是搔痒? 我已经看到 PDO 连接到 localhost 需要 1000 毫秒,并且正在调查持久连接是否无法解决此问题。 使用mysql原生驱动。查看统计数据。这可能会让你更好地了解在跳跃之前发生了什么。 How to know if MySQLnd is the active driver? 和 php.net/manual/it/mysqlnd.stats.php 不幸的是,Doctrine 仅适用于 PDO? 【参考方案1】:

您可以将自己的 PDO 实例传递给 Doctrine,自己设置持久连接:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));

$config = new \Doctrine\DBAL\Configuration();
$connectionParams = array(
    'dbname' => 'mydb',
    'user' => 'user',
    'password' => 'secret',
    'host' => 'localhost',
    'pdo' => $dbh,
);
$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config);

请务必了解使用 PDO 的持久连接的含义:What are the disadvantages of using persistent connection in PDO

【讨论】:

如何处理错误消息?我的问题不是我不知道如何创建持久连接??? 您真的尝试过我的解决方案吗?由于它不使用 Doctrines 自己的 PDOConnection,因此它实际上不应设置 PDO::ATTR_STATEMENT_CLASS,因此您的错误应该消失了。 对不起,我没有意识到这些联系。它确实有效,非常感谢!更新:你能更新分析器以便我投票吗? 这已经显着提高了我的开发机器的性能(每个请求 0.5 秒而不是 1.5 秒)。不幸的是,它对生产没有帮助。我怀疑 prod 机器不允许持久连接(?),但不知道如何测试/调整哪个配置。无论如何,很好的答案,谢谢!

以上是关于是否可以将 Doctrine 与持久 PDO 连接一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Prooph Eventstore (PDO) 和 Doctrine DBAL 导致多个连接

持久数据库连接 - 是或否?

PDO 持久连接缓存要求

PHP & PDO - 有啥方法可以建立“安全”的持久连接吗?

PHP PDO,连接持久时无法设置名称?

持久的数据库连接——是还是否?