2012-09-27 4 views
2

자바 프로젝트에서 HSQLDB의 이상한 동작이 발생했습니다. 매우 간단한 쿼리는 일관성없는 결과를 반환했습니다. 나는이 문제를 최신이 아닌 일부 테이블의 색인으로 추적했다. 불행히도 나는 SQL의 전문가도 아니고 java의 데이터베이스를 다루는 전문가도 아니다.HSQLDB 인덱스 불일치

HSQLDB 버전은 2.2.8입니다. 2.2.9로 업데이트하려고했지만 도움이되지 않았습니다.

우리의 데이터베이스는 매우 간단합니다. 여기에는 여러 독립 테이블이 포함됩니다. 그들 사이에 관계가 없습니다. 각 테이블에는 인덱스가 있으며, 그 중 하나는 여러 개의 컬럼을 결합한 고유 인덱스입니다. 다음은 예제입니다.

CREATE CACHED TABLE PUBLIC.MYTABLE(
    A BIGINT DEFAULT -9999 NOT NULL, 
    B BIGINT DEFAULT -9999 NOT NULL, 
    C NUMERIC(12,7) DEFAULT -9999.0000000 NOT NULL, 
    D INTEGER DEFAULT -9999 NOT NULL); 

CREATE INDEX IDX1 ON PUBLIC.MYTABLE(A); 
CREATE INDEX IDX2 ON PUBLIC.MYTABLE(B); 
CREATE INDEX IDX3 ON PUBLIC.MYTABLE(C); 

CREATE UNIQUE INDEX MYTABLE_PRIMARY_KEY ON PUBLIC.MYTABLE(A, B); 

보통 Java 프로그램의 행과 쿼리 테이블을 삽입하고 기존 행을 업데이트하지 않습니다. 삽입 작업은 다음과 같이 보입니다 :

Connection con = ...; // get connection from 
PreparedStatement stmt; 

con.setAutoCommit(false); 

stmt = this.con.prepareStatement( 
    String.format( 
     "insert into %s values (?,?,?,?)", "MYTABLE")); 

stmt.setLong(1, data1); 
stmt.setLong(2, data2); 
stmt.setDouble(3, data3); 
stmt.setInt(4, data4); 

stmt.addBatch() 

을하고 다른 곳에서 우리는 일괄 우리가 문 적절한 방법으로 접속을 종료 후

stmt.executeBatch(); 
stmt.clearBatch(); 
con.commit(); 

코드는 루프에서 실행을 실행합니다. 또한 연결 URL 끝에 "shutdown = true"가 있으므로 데이터베이스가 올바르게 종료 될 것으로 예상했습니다. 앞서 언급 한 바와 같이 이러한

SELECT COUNT(*) FROM MYTABLE 

같은 SQL 쿼리가 행의 예상 수의 약 절반을 반환과 같은 불합리한 결과를 반환 시작했을 때

, 나는이 문제를 발견. 실험에서 테이블에서 고유 인덱스를 삭제하고 모든 쿼리가 올바르게 작동했습니다. 이것은 내가 인덱스가 삽입시 제대로 업데이트되지 않는다고 생각하는 이유입니다. 색인을 조사하는 단서는 인터넷 게시판 및 포럼에 대한 인터넷 검색 및 의견 읽기에서 나왔습니다. Disable and rebuild an index in HSQLDB에서 설명한 바와 같이

내가

SHUTDOWN COMPACT 

을 사용하고 우리의 데이터베이스의 모든 테이블을 치유, 모든 데이터가 모든 쿼리는 올바른 결과를 반환합니다. 나는 그 질문의 저자가 나의 것과 비슷한 이슈를 가지고 있었다고 생각한다.

좋아, 내 데이터는 안전하므로 문제의 원인을 이해하고 수정하고 싶습니다.

삽입시 인덱스를 업데이트해야합니까? 또는 이것은 잘못된 가정이므로 데이터베이스를 업데이트 할 때마다 SHUTDOWN COMPACT를 실행해야합니까?

여러 열에 대한 고유 인덱스가 문제의 원인 일 수 있습니까?

나는 어떤 제안이나 지시 사항을 부탁드립니다.

답변

0

인덱스는 항상 삽입/삭제/업데이트시 업데이트됩니다. 이 목적을 위해 SHUTDOWN COMPACT를 실행할 필요가 없습니다.

왜 불일치가 발생했는지는 분명하지 않습니다. 더미 데이터로 재현 할 수 있다면 HSQLDB 프로젝트에 테스트 케이스를 제출하면 조사가 진행됩니다.

+0

제안 해 주셔서 감사합니다. 더미 데이터에 문제를 재현하려고합니다. – stys

+0

더미 데이터로 문제를 재현하려고 시도했지만 실패했습니다.모든 것이 올바르게 작동합니다. 또한 여러 배포 된 데이터베이스를 확인하고 모두 괜찮습니다. 문제는 컴퓨터에서 테스트 할 때 사용하는 두 개의 데이터베이스에만 나타납니다. 나는 응용 프로그램을 디버깅하는 동안 색인을 깨뜨린 특수한 조건이 있었을 것으로 생각합니다. – stys

+0

나는 여전히 문제의 원인을 밝히려고하고있다. 한 가지는 NetBeans IDE에서 중지 버튼을 사용하여 프로세스를 종료하는 데 문제가 있다는 것입니다. 여기 [Bug 22641] (http://netbeans.org/bugzilla/show_bug.cgi?id=22641)에서 자세히 설명합니다. 간단히 말해, Stop 버튼을 사용하면 shutdown hook이 호출되지 않으며, 데이터베이스 닫기 코드가 정확히 존재합니다. 그리고 자주 버튼을 사용하기 때문에 데이터베이스가 적절하게 닫히지 않은 경우가 많았습니다. – stys