9

假设我有一个名为的实体Product,并且每次用户点击产品信息页面时都会加载该实体。通常我会将对象保存在 Zend_Cache (memcache) 中一个小时,以避免每个请求都命中数据库,但据我所知,由于 Proxy 对象,Doctrine2 实体无法做到这一点。

所以我的问题是,如何避免从数据库中为每个请求加载相同的实体?

[编辑]

我尝试像这样使用 Doctrine Cache

    $categoryService = App_Service_Container::getService('\App\Service\Category');
    $cache = $categoryService->getEm()->getConfiguration()->getResultCacheImpl();
    $apple = $cache->fetch('apple');

但我收到以下错误

警告:require(App/Entity/Proxy/ _ CG _ /App/Entity/Category.php) [function.require]:无法打开流:/opt/vhosts/app/price/library/ 中没有这样的文件或目录Doctrine/Common/ClassLoader.php 第 163 行

Zend Cache 也是如此,并且由于 Proxy 类,您无法序列化实体

4

5 回答 5

3

你有几个选择:

  1. 使用 Doctrine 的内置结果缓存
  2. 尝试通过 Zend_Cache 将实体粘贴到内存缓存中。当您将其拉出时,您可能需要将 Product 重新合并()到 EM 中,以便可以取消引用代理。如果您获取并加入任何需要显示产品信息的关联,并且您只是在进行读取,那么这应该可以正常工作。
  3. 根本不缓存实体。缓存您生成的任何输出。

编辑:如果您不关心水合开销,您使用的是 mysql,并且您的 Products 和关联的表不会经常更改,您可能更喜欢只依赖 mySQL 查询缓存。这是一个相当生硬的对象,但足以提及。

于 2012-05-29T20:29:19.913 回答
1

您可能想尝试为您的实体类实现__sleep__wakeup方法,因为 Doctrine 2 对实体的序列化/反序列化有特殊要求和限制(这是将它们存储在 Zend_Cache 中时发生的情况)。

于 2012-09-10T14:43:59.617 回答
0

在我看来更像是一个配置错误。代理尚未生成,或者代理目录和命名空间有问题。

根据您的配置,代理可以自动或手动生成。您的代理确实是在 下生成的App/Entity/Proxy吗?这确实是正确的目录吗?

FYI 代理可以通过执行手动生成doctrine orm:generate-proxies <dest-dir>

于 2012-08-04T16:38:44.980 回答
0

支持 timdev 所说的:Doctrine 有内置的缓存,你想使用它。

我还想知道您是否遇到任何性能问题,或者您是否是过度渴望优化的受害者。

于 2012-09-13T07:04:23.887 回答
0

我觉得这非常奇怪,因为我自己只是搞砸了,并且代理对象存储在数据库中没有任何问题。所以我猜你的配置不是 100% 设置的?

如果你发现你的配置有问题,那么要非常清楚 timdev 所说的你必须将对象合并回 EntityManager,否则你会遇到奇怪的错误。

第四种可用的解决方案是将数据作为数组而不是对象来检索,但是当然你会失去连接到模块的所有功能,这可能不是你想要的。

于 2012-08-03T08:38:11.013 回答