2016-08-27 79 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エラー文:[CREATE キャッシュテーブルの列セットにUNIQUE 制約がすでに存在しています。<テーブルDEF >更新CASCADE ON CASCADEのDELETE CASCADEをONにしてください) ] at de.gdfsuezenergie.stromnev.enet.ENETConnector.init(ENETConnector.java:69) at de.gdfsuezenergie.stromnev.Main.setUp(Main.java:374) でsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で de.gdfsuezenergie.stromnev.MainTest.main(MainTest.java:9)でde.gdfsuezenergie.stromnev.Main.main(Main.java:165) java.lang.reflect.Method.invokeでsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) でsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) (Method.java:483)で com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 原因:net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc ::: 3.0.6 スクリプトファイルの行にエラーがあります:289 /いくつかの/ dir/test/resources/db-mirror/mirror-783471167 UNIQUE 制約が既に net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:264)は、Javaで で[UPDATE CASCADE ON DELETE CASCADE)ON キャッシュ表<表DEF >作成]ステートメント内の列のセットに存在します。 sql.DriverManager.getConnection(DriverManager.java:664)at java.sql.DriverManager.getConnection(DriverManager.java:270)at de.gdfsuezenergie.stromnev.enet.ENETConnector.createConnection(ENETConnector.java:86) at 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 CACHED表< TABLEの作成]ステートメント内の列のセットに存在します.JDBCUtil.sqlException(Unknown Source)at org.hsqldb.jdbc.JDBCConnection(不明なソース) org.hsqldb.jdbc.JDBCDriver.getConnection(不明なソース) org.hsqldb.jdbc.JDBCDriver.connect(不明なソース)ソース)) java.sql.DriverManager.getConnection(DriverManager.java:664) java.sql.DriverManager.getConnection(DriverManager.java:247) net.ucanaccess.jdbc.DBReference。getHSQLDBConnection(DBReference.java:440) 以上に起因 ... 12 net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:231) で:org.hsqldb.HsqlException:スクリプトファイルにエラー ライン:289/some/dir/test/resources/db-mirror/mirror-783471167 UNIQUE という制約が、文[CREATE キャッシュテーブルの列セットにすでに存在しています。テーブルDEF >を削除CASCADE ON UPDATE CASCADEで実行]] org。 htqldb.error.Error.error(不明なソース) org.hsqldb.scriptio.ScriptReaderText.readDDL(不明なソース)at org.hsqldb.scriptio.ScriptReaderBase.readAll(不明なソース)at org.hsqldb.persist.Log .processScript(Unknown Source)at 0 (不明なソース) org.hsqldb.persist.Logger.open(不明なソース) org.hsqldb.Database.reopen(不明なソース) org.hsqldb.Database。 のorg.hsqldb.DatabaseManager.getDatabase(不明なソース)、 の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 より

私が理解していないのは、なぜこのスクリプトを実行しているのかということです。私はミラーを作成する全体のポイントは、私はスクリプトを再適用する必要はないと思った?

誰かが正しくミラーを読み取る方法を知っていますか?

注:<表DEF > =>私は、簡潔さのために表定義をスキップしました。

+0

私はデータベースのサイズが接続の問題であるとは思わない。これは、初期接続ではなく、大きなテーブルの実際のクエリで問題になります。あなたが投稿したリンクから自分の質問に対するOPの答えを読んだら、彼/彼女はネットワーキング/共有サーバーが問題だと指摘します。 – Parfait

+0

有線LANネットワークを使用するようにしてください。また、CPUハードデスクドライブのデータベースで速度をテストしてみてください。インターネットフォルダ(Dropbox、Googleドライブ、OneDriveなど)、フラッシュ/サムドライブ、またはストレージ容量の少ないドライブでデータベースを使用しないでください。 – Parfait

+1

問題のテーブルの定義をチェックして、プライマリキーインデックス(Primary = Yes、Unique = Yes)*および*別の別個の一意インデックス(Primary = Yes、Unique = Yes)いいえ、一意=はい)。私は過去に 'keepMirror'に問題があるのを見ました。 –

答えて

0

この問題は、Accessデータベース内のテーブルに、プライマリキーインデックス(プライマリ=はい、一意=はい)の別の独自の一意のインデックスなど、特定の列に対して複数の一意のインデックスが定義されている場合に発生することが知られています。インデックス(プライマリ=いいえ、一意=はい)。

DupUnique.png

アクセス自体はこれで問題ありませんが、(UCanAccessが、その裏データベース用に使用しています)HSQLDBは​​、列のセット上に複数の一意性制約を許可していません。

最適な解決策は、Accessで.accdbまたは.mdbデータベースを開き、冗長な非プライマリ一意のインデックスを削除することです。

0

私はそれをうまく動作させることができましたが、ちょっとハッキリです。基本的に、ユニーク制約をミラースクリプトから削除することによって、最終的にはそれを通過することができました。悲しいことに私はデータの知識を持っていないので、それでも正しい場合は解決する必要がありますが、私はそれが信じています。

ポインタありがとうございます!非常に高く評価。

関連する問題