Я использую JPA для загрузки и сохранения сущностей в моем веб-приложении на основе Java EE. Hibernate используется в качестве реализации JPA, но я не использую специфичные для Hibernate функции и работаю только с чистым JPA.
Вот некоторый класс DAO, обратите внимание, getOrders
метод:
class OrderDao {
EntityManager em;
List getOrders(Long customerId) {
Query q = em.createQuery(
"<i>SELECT o FROM Order o WHERE o.customerId = :customerId</i>");
q.setParameter("<i>customerId</i>", customerId);
<b>return</b> q.getResultList();
}
}
Метод довольно прост, но имеет большой недостаток. Каждый раз, когда метод вызывается, в рамках реализации JPA выполняются следующие действия:
- JPQL-выражение анализируется и компилируется в SQL.
- Создается и инициализируется экземпляр Statement или PreparedStatement.
- Экземпляр оператора заполнен параметрами и выполнен.
Я считаю, что шаги 1 и 2 выше должны быть реализованы один раз за время жизни приложения. Но как это сделать? Другими словами, мне нужно, чтобы экземпляры Query были кэшированы.
Конечно, я могу реализовать такой кеш на своей стороне. Но подождите, я использую современные мощные ORM! Разве они уже не сделали это для меня?
Обратите внимание, что я не упоминаю нечто вроде кэша запросов Hibernate, который кэширует результаты запросов. Здесь я бы хотел выполнить свои запросы немного быстрее.