Symfony 4 + Doctrine DBAL缓存驱动程序

时间:2018-07-10 11:42:11

标签: symfony caching dbal

我已经开始了一个非常简单的项目,只有symfony / skeleton和doctrine / doctrine-bundle。

我不使用ORM,仅使用普通DBAL。没有安装symfony / orm-pack。

我正在尝试缓存简单查询的结果,并且出现消息“试图缓存查询但未配置结果驱动程序”的异常。

示例代码:

$query = $connection->createQueryBuilder()
    ->select('*')
    ->from('common.Language')
    ->getSQL();
$qcp = new QueryCacheProfile(0, "languages");
$stmt = $connection->executeCacheQuery($query, [], [], $qcp);
$rows = $stmt->fetchAll();
$stmt->closeCursor();

我读到我可以通过实现一个小捆绑包来在容器编译阶段here上修改DBAL连接配置来启用缓存。 但是我无法正常工作。我猜是因为它试图将ORM使用的相同的缓存驱动程序分配给DBAL,但我没有安装ORM。

我该怎么做?我创建了一个简单的类,该类注入DBAL连接并在运行时配置缓存,然后我的所有存储库/ dao都注入该类。但是我不认为这是实现此目标的正确方法...

public function __construct(Connection $connection, ContainerInterface $container)
{
    /** @var Kernel $kernel */
    $kernel = $container->get('kernel');

    $cacheProviders = [];

    if ($kernel->isDebug()) {
        $cacheProviders[] = new ArrayCache();
    } else {
        $cacheProviders[] = new PhpFileCache($kernel->getCacheDir().'/dbal');
    }

    $connection->getConfiguration()->setResultCacheImpl(new ChainCache($cacheProviders));
}

PD:在DBAL 2.7.1中使用symfony 4.1

1 个答案:

答案 0 :(得分:0)

根据您的帖子https://github.com/doctrine/DoctrineBundle/issues/833

并引用仍打开的https://github.com/doctrine/DoctrineBundle/issues/114,因此此功能无法解决!

对于临时解决问题,我建议您将executeCacheQuery替换为executeQuery + test:

    $qcp = new QueryCacheProfile('3600', "someKey");
    $qcp = empty($qcp->getResultCacheDriver()) ? null : $qcp;//test for existing 


    $conn = $this->getEntityManager()->getConnection();
    $stmt = $conn->executeQuery(
        $query,
        [],
        [],
        $qcp

在阅读DOCs后,发现配置未设置 UPDATED:

    $conn = $this->getEntityManager()->getConnection();
    $cache = new \Doctrine\Common\Cache\ArrayCache();
    $config = $conn->getConfiguration();
    $config->setResultCacheImpl($cache);

    $qcp = new QueryCacheProfile('3600', "someKey", $cache);
    $qcp = empty($qcp->getResultCacheDriver()) ? null : $qcp;//cache driver exist?

    $stmt = $conn->executeQuery(
        $query,
        [],
        [],
        $qcp
    );