我已经开始了一个非常简单的项目,只有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
答案 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
);