2010-05-12 3 views
4

우리는 2 개의 Java 웹 응용 프로그램 모두 읽기/쓰기 및 3 개의 독립 실행 형 Java 읽기/쓰기 응용 프로그램을 제공합니다 (하나는 전자 메일을 통해 질문을로드하고 하나는 XML 피드를 처리하고 하나는 전자 메일을 구독자에게 보냅니다). 최대 절전 모드로 만들고 공통 코드 기반을 공유하십시오.여러 Java 응용 프로그램과의 Hibernate 데이터베이스 무결성

최근 발생한 문제는 이메일을 통해로드 된 질문이 웹 앱 중 하나에서 작성된 질문을 덮어 쓰는 경우가 있다는 것입니다. 여기에는 별도의 ID가 있어야하는 별도의 질문이 있습니다. 원래는 이것이 캐싱 문제라고 생각했습니다. 두 번째 수준의 캐시를 사용 중지하려고 시도했지만 차이는 없습니다.

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 
<property name="hibernate.current_session_context_class">thread</property> 
<property name="hibernate.cache.use_second_level_cache">false</property> 

질문 : 우리는 BTW MySQL을 사용하고

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "id", unique = true, nullable = false) 
@DocumentId 
public Integer getId() { 
    return this.id; 
} 

.

CREATE TABLE `question` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    ... 
    PRIMARY KEY (`id`), 
    ... 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

우리는 명시 적으로 열고 세션을 닫는 것이 아니라 Util.getSessionFactory().getCurrentSession()를 통해이를 관리 최대 절전 할 수 없습니다.

다른 단계의 복잡성이 생기기 때문에이 단계에서는 클러스터 된 2 차 수준 캐시를 설정하지 않으려 고합니다. 앱 전체에서 얻을 수있는 성능 수준에 만족하고 있습니다.

웹 응용 프로그램에서 열린 세션보기 패턴을 구현하고이를 수정하는 것처럼 독립 실행 형 응용 프로그램에서 세션을 수동으로 관리하는 것이 어떻습니까?

또는 다른 제안 사항이나 아이디어를 알려주십시오.

+0

동일한 질문에 대한 메일 및 웹 업데이트는 어떻게 확인됩니까 (기본 키가 무엇인지)? – Mark

+0

데이터베이스에서 처리하는 시퀀스를 사용하는 대신 앱에서 기본 키를 생성하는 것처럼 들립니다. – khmarbaise

+0

안녕하세요. 제 질문에 대한 업데이트가 더 필요합니다. IDENTITY 전략으로 인해 ID가 MySQL에서 생성되는 것으로 생각했습니다. – Austen

답변

0

이 문제는 최대 절전 모드와 전혀 관련이 없다고 밝혀졌습니다.

스테이징 서 v의 데이터베이스 테이블 중 하나를 지워야하는 이전 데이터로 채 웁니다. 처음에는 이드의 겉 모습을 덮어 썼습니다. 그러나 더 많은 조사가 그렇지 않으면 증명되었습니다!

우리가 dodgy 데이터를 제거하고 나면 모든 것이 잘되었습니다.

3

모든 질문에 ID가 있기 때문에 모든 질문이 MySql 데이터베이스에서 가져온 것으로 가정합니다.

질문을 메모리에 투명한 개체로 저장할 필요는 없지만 제시 할 때마다 모든 질문을 선택한다고 가정하면 간단한 제안이 하나 있습니다.

ID 생성기를 데이터베이스의 순서로 바꿉니다. (결국 MySql의 자동 번호 ID). 그런 다음 응용 프로그램 대신 데이터베이스가 모든 질문에 고유 ID를 부여하도록합니다.

이 솔루션은 매우 간단하며 복잡성을 줄여줍니다. 다른 출처의 모든 질문을 데이터베이스에 저장 한 다음 여기에서 선택하면 작동합니다.

이 솔루션이 성능 문제를 일으키는 경우, Hibernate id 생성기가 어떻게 작동하는지 더 자세히 조사해야합니다. Hibernate는 다른 시나리오에 대해 여러 가지 다른 생성자를 제공한다.

희망이 도움이됩니다.

+0

질문을 위해 스키마를 추가했습니다. @GeneratedValue (strategy = IDENTITY) 주석을 제거 할 것을 제안 하시겠습니까? – Austen

+0

예. 여러 응용 프로그램에서 동일한 테이블에 값을 삽입하는 경우 테이블의 삽입 트리거가 가장 강력한 솔루션입니다. 이 트리거는 시퀀스에서 ID를 설정해야합니다. – Espen

+0

@GeneratedValue 주석을 제거하면 다음과 같이 나타납니다 : org.hibernate.id.IdentifierGenerationException : save()를 호출하기 전에이 클래스의 ID를 수동으로 할당해야합니다 : 데이터베이스에서 직접 ID를 직접 찾아내는 것이 좋습니다. 새로운 질문에 수동으로 할당 하시겠습니까? – Austen