2016-08-27 3 views
1

UCanAccess를 사용하여 Access 데이터베이스를 읽으려고합니다.UCanAccess - keepMirror를 사용한 후 Access 데이터베이스에 다시 연결할 수 없습니다.

코드가 작동하지만 데이터베이스가 커져서 속도가 매우 느립니다. 데이터베이스가 거의 변경되지 않기 때문에

Slow initial connection to MS access database에있는 keepMirror 제안을 사용하려고합니다. . 첫 번째 실행에

connection = DriverManager.getConnection(UcanaccessDriver.URL_PREFIX + databaseFile + ";keepMirror=/some/dir/test/resources/db-mirror/mirror");

는 응용 프로그램이 완벽하게 작동하고 위의 디렉토리에 미러 파일을 만듭니다. 스레드에서

예외 "주요"java.lang.RuntimeException가 : net.ucanaccess.jdbc.UcanaccessSQLException : UCAExc ::: 3.0.6 오류 스크립트 후속 실행에, 그러나, 나는 다음과 같은 예외를 얻을 파일 라인 : 289 /일부/디렉토리/테스트/자원/DB-거울/거울-783471167 고유 제약은 이미 문에 열 집합에 존재를 [UPDATE CASCADE ON DELETE CASCADE ON 캐시 된 표 < 표 DEF >을 CREATE) ]에서 de.gdfsuezenergie.stromnev.enet.ENETConnector.init (ENETConnector.java:69) at de.gdfsuezenergie.stromnev.Main.setUp (Main.java:374) 에서de.gdfsuezenergie.stromnev.Main.main sun.reflect.NativeMethodAccessorImpl.invoke0 (기본 방법)에서 de.gdfsuezenergie.stromnev.MainTest.main (MainTest.java:9)에서 (Main.java:165) sun.reflect.NativeMethodAccessorImpl.invoke sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)에서 (NativeMethodAccessorImpl.java:62) java.lang.reflect.Method.invoke (Method.java:483)에서의 net.ucanaccess.jdbc.UcanaccessSQLException :에 의한 com.intellij.rt.execution.application.AppMain.main (AppMain.java:144) UCAExc ::: 스크립트 파일 라인 3.0.6 오류 : 289 /일부/dir/test/resources/db-mirror/mirror-783471167 고유 한 제약은 이미 net.ucanaccess.jdbc.UcanaccessDriver.connect (UcanaccessDriver.java:264) 자바에서 에서 [UPDATE CASCADE ON DELETE CASCADE) ON 캐시 된 표 < 표 DEF > 만들기]를 문에 열 집합에 존재합니다. sql.DriverManager.getConnection de.gdfsuezenergie.stromnev.enet.ENETConnector.createConnection (ENETConnector.java:86)에서 java.sql.DriverManager.getConnection (DriverManager.java:270)에서 (DriverManager.java:664)에서 de.gdfsuezenergie.stromnev.enet.ENETConnector.init (ENETConnector.java:57) ... 8 자세한 내용 원인 : java.sql.SQLException : 스크립트 파일의 오류 줄 : 289/some/dir/test/resources/db-mirror/mirror-783471167 UNIQUE제약은 이미 org.hsqldb.jdbc에서 org.hsqldb.jdbc.JDBCUtil.sqlException (알 수없는 소스)에서 [ 캐시 표를 DEF > UPDATE CASCADE ON DELETE CASCADE) ON < 테이블 만들기] 문에 열 집합에 존재 (알 수없는 소스) org.hsqldb.jdbc.JDBCConnection. 원본) 에서 java.sql.DriverManager.getConnection (DriverManager.java:664) 에서 java.sql.DriverManager.getConnection (DriverManager.java:247) net.ucanaccess.jdbc.DBReference.org.hsqldb.HsqlException : getHSQLDBConnection net.ucanaccess.jdbc.UcanaccessDriver.connect (UcanaccessDriver.java:231)에서 (DBReference.java:440) 은 ... 더에 의한 12 오류를 스크립트 파일 라인 : 289/어떤/디렉토리/테스트/자원/DB-거울/거울-783471167 고유 제약은 이미 문에 열 집합에 존재 조직에서 [UPDATE CASCADE ON DELETE CASCADE) ON DEF > 캐시 된 표 < 테이블 만들기]. 에서 org.hsqldb.scriptio.ScriptReaderBase.readAll (알 소스)에 org.hsqldb.scriptio.ScriptReaderText.readDDL (알 소스)에 hsqldb.error.Error.error (알 소스) org.hsqldb.persist.Log .processScript (알 수없는 원본) org.hsqldb.persist.Log.open org.hsqldb.Database에서 org.hsqldb.Database.reopen (알 소스)에 org.hsqldb.persist.Logger.open (알 소스)에서 (알 소스). org.hsqldb.DatabaseManager.getDatabase (Unknown Source) at org.hsqldb.DatabaseManager.newSession (알 수없는 소스) ... 더 많은 것 에 의해 발생했습니다 : org.hsqldb.HsqlException : 이미 UNIQUE 제약 조건 는 org.hsqldb.ParserTable.addTableConstraintDefinitions에서 org.hsqldb.error.Error.error에서 org.hsqldb.error.Error.error (알 소스) (알 소스) (알 소스) 에서 열 집합에 존재 org.hsqldb.StatementSchema.getResult (알려지지 않은 소스)에서 org.hsqldb.Session.executeCompiledStatement에서org.hsqldb.StatementSchema.execute (알 수없는 소스) (알 수없는 소스) ... (28) 더

나는이 때문에이 캐시 테이블에 몇 가지 제약 조건을 위반 이해 , 내가 왜이 스크립트를 실행하는지 이해할 수 없다. 나는 거울을 만드는 모든 점이 어떤 스크립트를 다시 적용 할 필요가 없다고 생각 했는가?

누군가가 거울을 올바르게 읽는 방법을 알고 있습니까?

참고 : => 나는 테이블 정의를 간략하게하기 위해 생략했다.

+0

데이터베이스의 크기가 의심 스럽습니다. 초기 연결이 아닌 큰 테이블을 실제로 쿼리 할 때 문제가 될 수 있습니다.게시 한 링크에서 자신의 질문에 대한 OP의 대답을 읽으면 네트워킹/공유 서버가 문제임을 지적합니다. – Parfait

+0

유선 LAN 네트워크를 사용해야합니다. 그리고 CPU 하드 데스크 드라이브의 데이터베이스로 테스트 속도를 시험해보십시오. 인터넷 폴더 (Dropbox, Google 드라이브, OneDrive 등), 플래시/썸 드라이브 또는 저장 용량이 적은 드라이브에서 데이터베이스를 사용하지 마십시오. – Parfait

+1

해당 테이블의 정의를 확인하여 주 키 인덱스 (Primary = Yes, Unique = Yes) * 및 * 다른 별도 고유 인덱스 (Primary = 예, Unique = Yes)와 같은 주어진 열에 대해 정의 된 둘 이상의 고유 인덱스가 있는지 확인하십시오. 아니오, 고유 = 예). 과거에는'keepMirror '에 문제가 있다는 것을 알았습니다. –

답변

0

이 문제는 Access 데이터베이스의 테이블에 기본 열 인덱스 (기본 = 예, 고유 = 예) 다른 고유 한 고유 인덱스와 같이 지정된 열에 대해 정의 된 둘 이상의 고유 인덱스가있을 때 발생하는 것으로 알려져 있습니다. 색인 (기본 = 아니오, 고유 = 예).

DupUnique.png

액세스 자신이 어떤 문제를 가지고 있지 않지만, (UCanAccess는 백업 데이터베이스에 사용) HSQLDB는 열 집합에 하나 개 이상의 고유 제한을 허용하지 않습니다.

최상의 솔루션은 Access에서 .accdb 또는 .mdb 데이터베이스를 열고 여분의 비 기본 고유 인덱스를 제거하는 것입니다.

0

나는 그럭저럭 일할 수 있었다. 그러나 그것은 조금 해키 다. 기본적으로 미러 스크립트에서 고유 제약 조건을 제거하여 마침내 관리 할 수있었습니다. 슬프게도 나는 데이터에 대한 지식이 없으므로 여전히 정확한 정보가 있으면 해결해야합니다.

포인터 모두에게 감사드립니다! 대단히 감사합니다.

관련 문제