2012-01-08 3 views
3

JPA의 작동 방식을 이해하려고합니다. 내가 아는 바로는 Entity를 지속하면 해당 객체는 애플리케이션이 닫힐 때까지 메모리에 남아있게됩니다. 즉, 이전에 유지 된 엔티티를 찾으면 데이터베이스에 대한 쿼리가 생성되지 않습니다. 삽입, 갱신 또는 삭제가 없다고 가정하면, 애플리케이션이 충분히 오랫동안 실행되면 그 안에있는 모든 정보가 지속될 수 있습니다. 이것은 어느 시점에서 더 이상 데이터베이스가 필요 없다는 것을 의미합니까?엔티티는 얼마나 오랫동안 방문 했습니까?

편집

내 문제는 데이터베이스와이 아니다. 나는 응용 프로그램 외부에서 데이터베이스를 수정할 수 없다고 확신합니다. 나는 스스로 트랜잭션을 관리하므로 커밋하는 즉시 데이터가 데이터베이스에 저장됩니다. 제 질문은 : 커밋을 한 후에 엔티티는 어떻게됩니까? 그들은 기억 속에 보관되고 캐시처럼 행동합니까? 그렇다면 얼마나 오래 거기에 보관됩니까? persist을 커밋 한 후 select 쿼리를 만듭니다. 이 select는 이전에 유지 한 객체를 반환해야합니다. 해당 객체가 메모리에서 가져 오게 될 것입니까, 아니면 응용 프로그램이 데이터베이스에 쿼리합니까?

답변

3

JPA는 지속성 컨텍스트 (L1 캐시) 또는 명시 적 캐시 (L2 캐시)에서만 작동 할 수 없습니다. 항상 데이터 소스와 결합해야하며,이 데이터 소스는 일반적으로 안정적인 저장 공간을 유지하는 데이터베이스를 가리 킵니다.

따라서 엔티티는 트랜잭션 (JPA 지속 조작에 필요함)이 확약되지 않은 경우에만 메모리에 있습니다. 그 후 데이터 소스로 보냅니다.

트랜잭션 관리자가 트랜잭션 범위 ('일반'경우) 인 경우 L1 캐시 (지속성 컨텍스트)가 닫히고 엔티티가 더 이상 존재하지 않습니다.L1 캐쉬가 어떻게 든 당신을 괴롭 히면, 당신은 그것을 조금 명백하게 관리 할 수 ​​있습니다. 이를 지우는 작업이 있으며 읽기 조작 (트랜잭션이 필요하지 않음)과 쓰기 조작을 구분할 수 있습니다. 읽을 때 트랜잭션이 활성화되어 있지 않으면 지속성 컨텍스트가없고 엔티티가 연결되지 않으므로이 L1 캐시에 절대 들어 가지 않습니다.

그러나 L2 캐시는 트랜잭션이 커밋되고 내부의 엔티티가 전체 애플리케이션에서 사용 가능할 때 지워지지 않습니다. 이 L2 캐시는 명시 적으로 구성해야하며 응용 프로그램 개발자는 캐시 할 엔티티를 지정해야합니다. 벤더 고유의 메커니즘 (예 : JBoss Cache, Infinispan)을 통해 캐시되는 엔티티 수를 최대화하고 소위 퇴거 정책을 설정/정의 할 수 있습니다.

물론, 데이터 소스가 내장 된 내장 DB에 가리키는 것을 막을 수는 없지만 이것은 JPA에 대한 지식이 아닙니다.

+0

나는 데이터베이스를 지우려고하지 않았다. _after_가 모든 엔티티를 캐시에 남겨두고 캐시처럼 작동하는지 이해하려고 노력하고 있습니다. 나는 아주 약간의 정보가 필요하다. 그래서 매번 데이터베이스에 쿼리하는 것을 원하지 않습니다. List가 응용 프로그램 자체에 중복을 만들까요? – Dragos

+1

매번 쿼리하지 않으려는 경우 L2 캐시 및 선택적으로 쿼리 캐시를 구성 할 수 있습니다. 드문 경우지만 응용 프로그램이 지정한 기간 동안 L1 캐시를 열어 두는 확장 된 지속성 컨텍스트를 활용하도록 선택할 수도 있지만 이는 까다 롭기 때문에 먼저 L2를 시도하십시오.) –

5

아니요. 그것에 대해 생각해보십시오.

응용 프로그램이 데이터베이스를 사용하는 유일한 방법은 아닙니다. 엔티티가 한 번 지속되어 메모리에 저장되어 있다면, 한 시간 후에 어떤 다른 방법으로 변경되지 않는다고 어떻게 확신 할 수 있습니까? 이런 일이 발생하면 응용 프로그램의 논리에 해를 끼칠 수있는 오래된 데이터가 생깁니다.

메모리에 데이터를 저장하고 모든 것이 올바르게 수행되기를 기대한다고해서 어떤 이점도 생기지 않습니다. 따라서 데이터베이스에 저장된 데이터가 주요 정보 소스이므로 데이터의 하위 집합이 변경되지 않는다는 것을 절대적으로 확신하지 않는 한 매번 쿼리해야합니다.

+0

내가 편집 한 것을보세요. – Dragos

3

지속성이란 간단히 말하면 앱을 종료 할 수 있으며 데이터는 손실되지 않습니다.

데이터를 저장하려면 앱을 종료 할 때 데이터가 손실되지 않는 방식으로 저장해야합니다.

4

엔티티 엔티티를 유지하면이 엔티티가 엔티티를 첫 번째 레벨 캐시 (메모리에 있음)처럼 작동하는 지속성 컨텍스트에 추가됩니다. 실제 지속되는 작업이 컨테이너 관리 트랜잭션을 사용하는지 트랜잭션을 직접 처리하는지에 따라 다릅니다. 엔티티 인스턴스는 트랜잭션이 커밋되지 않는 한 메모리에 저장되며, 트랜잭션이 커밋되지 않은 경우 데이터베이스 또는 XML 등에 유지됩니다.

+1

그래서 트랜잭션이 끝나면 모든 객체가 삭제되고 데이터베이스의 데이터 만 남아있게됩니까? – Dragos

+2

네, 맞습니다. 그러나 여전히 entitymanager를 통해 유지했던 엔티티 객체에 대한 참조가 있다면 여전히 메모리에 유지됩니다. 그러나 트랜잭션이 끝나면 더 이상 상태의 동기화가 데이터베이스에 반영되지 않습니다. – Andreas

3

"유지"하려면 엔티티를 실제로 데이터베이스에 저장하는 것을 의미합니다 . JPA는 영속 컨텍스트에서 메모리에 일부 엔티티 정보를 유지합니다 (구성 및 프로그래밍 방식에 크게 의존합니다). 그러나 특정 시점 정보는 데이터베이스에 저장됩니다 (예 : 트랜잭션이 커밋되거나 가능성이있는 경우 (반드시 그런 것은 아님) flush() 또는 merge() 작업 이후.

3

커밋 후 선택한 쿼리에 대해 엔티티를 유지하려면 쿼리 캐시를 사용해야합니다. 그 기간에 구글 만 있으면 당신에게 분명해야한다.

관련 문제