【问题标题】:How do I setup query cache results for built in doctrine2 repository functions?如何为内置的学说 2 存储库函数设置查询缓存结果?
【发布时间】:2012-10-10 23:34:54
【问题描述】:

我有一个用于我玩的视频游戏的网站,我正在努力通过实施一些额外的缓存来提高网站的性能。我已经能够在自定义存储库函数上实现查询结果缓存,但无法找到任何解释我如何在内置函数(findOneById 等)中包含查询结果缓存的地方。我对此很感兴趣,因为我的许多数据库查询都是从这些“本机”存储库函数中执行的。

例如,我有一个具有以下属性的角色实体对象:id、name、race、class 等。

此对象中的种族和类是对种族和类的其他实体对象的引用。 当我加载一个字符进行显示时,我按名称 (findOneByName) 获取该字符,然后在我的模板中通过$characterObject->getRace()->getName() 显示该字符的种族/类别。模板中的这些方法调用导致在我的 Race/Class 实体表上运行查询,按 id 获取实体(我假设为 findOneById)。

我尝试在存储库中创建自己的 findOneById 函数,但在这些情况下不会调用它。

如何设置学说/symfony 以使这些查询结果可缓存?

我正在运行 Symfony 2.1.3 和教义 2.3.x

【问题讨论】:

    标签: caching symfony doctrine-orm


    【解决方案1】:

    我发现不可能在教义内置函数上启用查询缓存。我将发布一个链接,解释为什么稍后我再次找到它。

    【讨论】:

      【解决方案2】:

      您的实体可能看起来像这样:

      MyBundle\Entity\Character:
          type: entity
          table: Character
          fields:
            id:
              id: true
              type: bigint
            name:
              type: string
              length: 255
          manyToOne:
            race:
              targetEntity: Race
              joinColumns:
                raceId:
                  referencedColumnName: id
      
      MyBundle\Entity\Race:
          type: entity
          table: Race
          fields:
            id:
              id: true
              type: bigint
            name:
              type: string
              length: 255
          oneToMany:
            characters:
              targetEntity: Character
              mappedBy: race
      

      如果是这种情况,请修改您的 Character 实体映射,以便它也急切地加载 Race 实体:

      MyBundle\Entity\Character:
        ...
          manyToOne:
            race:
              targetEntity: Race
              joinColumns:
                raceId:
                  referencedColumnName: id
              fetch: EAGER
      

      关于fetch 选项的准则文档:@ManyToOne

      【讨论】:

      • Eager fetch 对缓存没有帮助。启用 eager 后,它不会更改执行的查询数量或缓存结果。我这里的部分问题是大约有 6 个种族每年左右变化一次,我想缓存种族信息,以便它可以在任何角色上重复使用,无论上下文如何(角色资料、公会成员列表等) )。我试图避免为每个页面的数据需求编写特定的 DQL……我确信这是最有效的解决方案,但我试图简化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多