Как мне настроить результаты кеша запросов для встроенных функций репозитория доктрины 2?

У меня есть сайт для видеоигры, в которую я играю, и я работаю над улучшением производительности сайта за счет дополнительного кэширования. Мне уже удалось реализовать кеширование результатов запросов в пользовательских функциях репозитория, но я не смог найти нигде, где бы объяснялось, как я могу включить кэширование результатов запросов во встроенные функции (findOneById и т. д.). Я заинтересован в этом, потому что многие из моих запросов к базе данных выполняются из этих «родных» функций репозитория.

Итак, в качестве примера у меня есть объект сущности персонажа со следующими свойствами: идентификатор, имя, раса, класс и т. д.

Раса и класс в этом объекте являются ссылками на другие объекты сущностей для расы и класса. Когда я загружаю персонажа для отображения, я получаю его по имени (findOneByName), а затем в своем шаблоне я отображаю расу/класс персонажа по $characterObject->getRace()->getName(). Эти вызовы методов в шаблоне приводят к выполнению запроса к таблицам сущностей расы/класса, извлекающего сущность по идентификатору (я полагаю, findOneById).

Я попытался создать свою собственную функцию findOneById в репозитории, но в этих обстоятельствах она не вызывается.

Как я могу настроить доктрину/symfony так, чтобы эти результаты запросов можно было кэшировать?

Я использую Symfony 2.1.3 и доктрину 2.3.x.


person Chris    schedule 10.10.2012    source источник


Ответы (2)


Я обнаружил, что невозможно включить кеширование запросов в функциях построения доктрины. Я опубликую ссылку, которая объяснит, почему позже, когда я снова найду ее.

person Chris    schedule 09.12.2012

Ваши объекты, вероятно, выглядят примерно так:

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

Если это так, то измените сопоставление сущности вашего персонажа, чтобы оно также с готовностью загружало сущность расы:

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

Документация Doctrine по опции fetch: @ManyToOne

person Thomas Kelley    schedule 11.10.2012
comment
Eager fetch не помогает мне с кэшированием. При включенном желании он не изменяет количество выполненных запросов и не кэширует результаты. Часть моей проблемы заключается в том, что существует 6 или около того рас, которые меняются раз в год или около того, я хотел бы кэшировать информацию о расе, чтобы ее можно было повторно использовать для любого персонажа независимо от контекста (профиль персонажа, список членов гильдии и т. д. ). Я пытаюсь избежать написания DQL, специфичного для данных каждой страницы... что, я уверен, является наиболее эффективным решением, но я пытаюсь добиться простоты. - person Chris; 11.10.2012