Я не знаю о API Win32, чтобы сделать это: вместо этого, Вы (или один из инструментов, упомянутых в других сообщениях), делаете это путем знания двоичного формата файла PE и чтения файла: см. http://msdn.microsoft.com/en-us/magazine/cc301808.aspx (и та статья упомянула утилиту "PEDUMP").
Кэширование запросов нельзя применить к кешу сеанса. Это имеет смысл, поскольку обычно все операции с сеансом выполняются одним фрагментом кода, который должен просто запоминать результаты.
Вы говорите, что не хотите включать кэширование запросов 2-го уровня, но что будет ли в этом вред? Вы получите желаемый результат.
Итог: вы можете либо вручную кэшировать результаты запроса, либо попросить Hibernate сделать это. Хотя обычно не имеет смысла ограничивать время жизни кэша запросов временем сеанса, это можно сделать, используя следующий подход:
2) Выделить конкретную область для рассматриваемого запроса и отметьте его как кэшируемый:
Query query = ...;
query.setCacheable(true).setCacheRegion("MY_SPECIAL_QUERY");
3) Удалите свой запрос из кеша в конце сеанса (если вы ДЕЙСТВИТЕЛЬНО уверены, что это то, что вы хотите сделать):
SessionFactory sessionFactory = ...;
sessionFactory.evictQueries("MY_SPECIAL_QUERY");
Я не знаю ни одной такой функции для Hibernate.
Но это, похоже, очень ограниченный и управляемый контекст. Я бы попробовал сделать вот такой код. На первый взгляд возможны различные способы:
Предположим противное, что ваш код - настоящий беспорядок, и вы не можете передавать контекст. У вас может быть переменная ThreadLocal, содержащая результат . Если не установлен внутри текущего потока, вызовите его и сохраните. В противном случае просто получите его.
Обратите внимание, что, во втором случае вам придется очистить ThreadLocal при выходе.
Между этими противоположностями возможны решения, одно из них, вероятно, лучше других ...