Как включить, в спящем режиме кэш запроса на сеансовом уровне только?

Я не знаю о API Win32, чтобы сделать это: вместо этого, Вы (или один из инструментов, упомянутых в других сообщениях), делаете это путем знания двоичного формата файла PE и чтения файла: см. http://msdn.microsoft.com/en-us/magazine/cc301808.aspx (и та статья упомянула утилиту "PEDUMP").

6
задан Răzvan Flavius Panda 11 March 2013 в 13:40
поделиться

3 ответа

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

Вы говорите, что не хотите включать кэширование запросов 2-го уровня, но что будет ли в этом вред? Вы получите желаемый результат.

2
ответ дан 11 December 2019 в 00:40
поделиться

Итог: вы можете либо вручную кэшировать результаты запроса, либо попросить Hibernate сделать это. Хотя обычно не имеет смысла ограничивать время жизни кэша запросов временем сеанса, это можно сделать, используя следующий подход:

1) Включить кеш запросов

2) Выделить конкретную область для рассматриваемого запроса и отметьте его как кэшируемый:

Query query = ...;
query.setCacheable(true).setCacheRegion("MY_SPECIAL_QUERY");

3) Удалите свой запрос из кеша в конце сеанса (если вы ДЕЙСТВИТЕЛЬНО уверены, что это то, что вы хотите сделать):

SessionFactory sessionFactory = ...;
sessionFactory.evictQueries("MY_SPECIAL_QUERY");
5
ответ дан 11 December 2019 в 00:40
поделиться

Я не знаю ни одной такой функции для Hibernate.

Но это, похоже, очень ограниченный и управляемый контекст. Я бы попробовал сделать вот такой код. На первый взгляд возможны различные способы:

  • Если ваш код хорошо известен, сложность управляема. Предположим, у вас есть код A, который вызывает коды B и C, оба из них нуждаются в запросе. Вы можете запустить запрос один раз в A, так как передаст результат B и C . Может быть, у вас уже есть объект контекста, который вы отправляете B и C? Это было бы просто, элегантно, осмысленно ...
  • Предположим противное, что ваш код - настоящий беспорядок, и вы не можете передавать контекст. У вас может быть переменная ThreadLocal, содержащая результат . Если не установлен внутри текущего потока, вызовите его и сохраните. В противном случае просто получите его.

    Обратите внимание, что, во втором случае вам придется очистить ThreadLocal при выходе.

  • Между этими противоположностями возможны решения, одно из них, вероятно, лучше других ...

0
ответ дан 11 December 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: