첫째, 미심쩍어합니다. 명백한 질문이 있거나 질문 인 경우 근본적으로 바보입니다.JPA는 한 번만 쿼리를 생성합니다.
더 많은 학문적 질문은 EntityManager
에 걸쳐 있거나 독립적 인 JPA 쿼리 (이름이 뭐든간에)를 만들 수 있는지 알아야합니다. 기본적으로 번은 항상 한 번만 실행하십시오. 나는 Enitity manager 객체의 createXXXQuery
메쏘드에서만 Query 인스턴스를 얻을 수 있다는 것을 이해합니다. 그러나 여전히 다른 방법이 있습니까?
이가 시도하고있는 것이다,
public class MyRepo {
@PersistenceContext
private EntityManager em;
private Query aQueryIntentedtoBePreparedOnlyOnce;
@PostConstruct
public void prepareMyQuery(){
aQueryIntentedtoBePreparedOnlyOnce = em.createQuery("...."); // Query with positional params
}
public void executeMyQuery(){
aQueryIntentedtoBePreparedOnlyOnce.getResultList();
}
}
이 완벽하게 처음 실행합니다. 그러나 두 번째로 "Entity Manager Closed"라고 말합니다. EM이 거래 범위가 원인이라고 생각합니다.
이 EM은 컨테이너 관리 (JTA - Spring)이므로 트랜잭션간에 확장 할 수 없습니다. 그리고 Session Bean을 사용하는 것은 옵션이 아닙니다. 그래서이 쿼리를 한 번만 생성하는 방법이 있습니까?
추신 : 여기에 명명 된 쿼리와 쿼리 캐싱은 어디에서 오는가? 명명 된 쿼리를 사용하면 매번 createNamedQuery
을 수행하는 것처럼 보입니다. 그리고 쿼리 캐시 계획은 무엇입니까 거기에 좋은 워드 프로세서 무엇입니까?
다른 질문 중 하나는 EM 또는 연결 (JDBC)에서만 쿼리가 작성되는 이유는 무엇입니까? 쿼리를 준비하기 위해 어느 DB를 사용해야하는지 알 필요가 없습니까? 적절한 연결없이 하나를 실행할 수 없도록하는 것이 무엇입니까?
수 없습니다. 평범한 최대 절전 모드로 당신은'DetachedCriteria'를 사용할 수 있습니다 만, 결국은 실행을위한'Criteria' 인스턴스가되어야하고'Session' (JPA 용어로는'EntityManager')이 필요합니다. 그런데 왜 이걸하고 싶니? 어떤/많은 성능 (더 많은 메모리 만 사용함)을 얻지 못할 것이고 실제 쿼리는 JDBC 드라이버에 의해 캐싱됩니다 (구성된 경우). –
@M. Deinum 나는 이것을하지 않아도된다. 내가 뭔가를 놓치고 있는지 궁금하다. 왜 더 많은 메모리를 소비합니까? 쿼리가 내 repo 객체의 멤버이기 때문에? SQL을 매개 변수로 변경하지 않고 JDBC 드라이브가 캐쉬 된 SQL을 사용합니까? – anchreg
아니요.'PreparedStatement'는 바운드 매개 변수가있는 쿼리가 아니라 캐시되기 때문에. 메모리에 더 많은 객체가 있으므로 더 많은 메모리가 있습니다. 이제 매우 짧은 수명의 물체가 생겨서 메모리에서 꽤 빨리 제거됩니다. –