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