나는이 문제로 며칠 동안 벽에 머리를 두드렸다.Hibernate Infinispan 엔티티/쿼리 캐싱
우리는 Infinispan을 사용하여 Hibernate의 2 차 수준 캐시를 구현하려고합니다. 응용 프로그램은 JBoss AS 6에서 실행되며 JTA 트랜잭션을 사용합니다. 우리의 persistence.xml에
우리는이 :
: 이것은 우리가 다음을 수행하기 위해 필요한 캐시의 종류에 대한 우리의 이해에 here:
을 정의
...
<!-- JTA configurations -->
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<property name="current_session_context_class" value="jta" />
<!-- Infinispan configurations -->
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>
<property name="hibernate.cache.infinispan.cachemanager" value="java:CacheManager/entity"/>
...
로 사용 사례 1 : 참조 데이터를 보유 할 데이터베이스에 대한 레코드가 있습니다. 이 데이터는 오랜 시간 동안 변경되지 않습니다 (우리는 희망합니다 :).
이 레코드는 많이 쿼리 될 가능성이 있으므로 캐시하고 싶습니다. 사용자가이 데이터를 쿼리 할 때 캐싱해야하므로 DB로 갈 필요가 없습니다.
이 경우 캐시 유형 쿼리 캐시 또는 엔터티 캐시입니까? 쿼리가 항상 같기 때문에 큐 쿼리는 항상 동일한 결과를 반환하기 때문에 쿼리 캐시라고 생각합니다.
내 쿼리 :
List<MyEntity> list = session.createCriteria(MyEntity.class)
.add(Restrictions.eq("id", 1))
.setCacheable(true)
.list();
사용 사례 2 : 사용자가 DB에서 특정 레코드를 가져, 그는 그것을 업데이트 할 수 있습니다. 이 엔티티 (또는 엔티티 목록)를 사용자의 세션 (로그인 세션) 캐시에 저장하여 클라이언트에서이 엔티티를 업데이트 한 경우 업데이트 전에 select를 수행 할 필요가 없습니다. 이 경우 특정 엔티티를 저장하기 때문에 엔티티 캐싱으로 간주됩니다. 맞습니까? 우리가 들어
을 저장하려면 우리가 사용하고 있습니다 :
@Cacheable (true)
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class MyEntity implements Serializable
{
...
}
오전 내가 올바르게 이러한 가정을? 그렇지 않다면, 여기에 접근은 무엇입니까? 나는이 일에서 큰 실수를하고 있다고 생각한다.
나는 아직도 모든 대답을 동화하려고합니다. 그리고 또 다른 질문이 있습니다. 첫 번째 사용 사례의 경우 다른 참조 데이터 개체 (레코드)를 DB에 추가하면 어떻게됩니까? (동일한 응용 프로그램 사용)? 캐시가 쿼리의 결과가 변경되었음을 알게되고 다음에 선택이 수행되면 DB로 이동합니까? –
유지할 때 캐시에 넣을 지 모르겠습니다. 트리거로 인해 일부 데이터가 변경 될 수 있으므로 아마 선택을 할 것입니다. 어떤 식 으로든 최대 하나를 선택하고 캐시에 넣습니다. – Kazaag
이 게시물에 대한 자세한 내용은 http://www.javalobby.org/java/forums/t48846.html에서 확인할 수 있습니다. – Kazaag