UCanAccess - 使用keepMirror

时间:2016-08-27 10:15:12

标签: java ms-access jdbc ucanaccess

我正在尝试使用UCanAccess读取Access数据库。

代码正在运行,但由于数据库很大,速度非常慢。由于数据库很少更改,我尝试使用

中的keepMirror建议

Slow initial connection to MS access database;

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

首次运行时,应用程序可以正常运行,并在上面的目录中创建镜像文件。但是,在后续运行中,我得到以下异常:

  

线程“main”中的异常java.lang.RuntimeException:   net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc ::: 3.0.6错误   脚本文件行:289   / some / dir / test / resources / db-mirror / mirror-783471167一个独特的   约束已存在于语句[CREATE中]的列集上   CACHED TABLE< TABLE DEF> ON DELATE CASCADE ON UPDATE CASCADE)] at   de.gdfsuezenergie.stromnev.enet.ENETConnector.init(ENETConnector.java:69)     在de.gdfsuezenergie.stromnev.Main.setUp(Main.java:374)at   de.gdfsuezenergie.stromnev.Main.main(Main.java:165)at   de.gdfsuezenergie.stromnev.MainTest.main(MainTest.java:9)at at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:483)at   com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)   引起:net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc ::: 3.0.6   脚本文件行中的错误:289   / some / dir / test / resources / db-mirror / mirror-783471167一个独特的   约束已存在于语句[CREATE中]的列集上   CACHED TABLE< TABLE DEF> ON DELATE CASCADE ON UPDATE CASCADE)] at   net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:264)     在java.sql.DriverManager.getConnection(DriverManager.java:664)at   java.sql.DriverManager.getConnection(DriverManager.java:270)at   de.gdfsuezenergie.stromnev.enet.ENETConnector.createConnection(ENETConnector.java:86)     在   de.gdfsuezenergie.stromnev.enet.ENETConnector.init(ENETConnector.java:57)     ... 8更多引起:java.sql.SQLException:脚本文件中的错误   line:289 / some / dir / test / resources / db-mirror / mirror-783471167一个独特的   约束已存在于语句[CREATE中]的列集上   CACHED TABLE< TABLE DEF> ON DELATE CASCADE ON UPDATE CASCADE)] at   org.hsqldb.jdbc.JDBCUtil.sqlException(未知来源)at   org.hsqldb.jdbc.JDBCUtil.sqlException(未知来源)at   org.hsqldb.jdbc.JDBCConnection。(未知来源)at   org.hsqldb.jdbc.JDBCDriver.getConnection(未知来源)at   org.hsqldb.jdbc.JDBCDriver.connect(未知来源)at   java.sql.DriverManager.getConnection(DriverManager.java:664)at   java.sql.DriverManager.getConnection(DriverManager.java:247)at   net.ucanaccess.jdbc.DBReference.getHSQLDBConnection(DBReference.java:440)     在   net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:231)     ... 12更多引起:org.hsqldb.HsqlException:脚本文件中的错误   line:289 / some / dir / test / resources / db-mirror / mirror-783471167一个独特的   约束已存在于语句[CREATE中]的列集上   CACHED TABLE< TABLE DEF> ON DELATE CASCADE ON UPDATE CASCADE)] at   org.hsqldb.error.Error.error(未知来源)at   org.hsqldb.scriptio.ScriptReaderText.readDDL(未知来源)at   org.hsqldb.scriptio.ScriptReaderBase.readAll(未知来源)at   org.hsqldb.persist.Log.processScript(未知来源)at   org.hsqldb.persist.Log.open(未知来源)at   org.hsqldb.persist.Logger.open(未知来源)at   org.hsqldb.Database.reopen(未知来源)at   org.hsqldb.Database.open(未知来源)at   org.hsqldb.DatabaseManager.getDatabase(未知来源)at   org.hsqldb.DatabaseManager.newSession(未知来源)......还有19个   引起:org.hsqldb.HsqlException:已经是UNIQUE约束   存在于org.hsqldb.error.Error.error的列集上(未知   来自)org.hsqldb.error.Error.error(未知来源)at   org.hsqldb.ParserTable.addTableConstraintDefinitions(未知来源)     在org.hsqldb.StatementSchema.getResult(未知来源)at   org.hsqldb.StatementSchema.execute(未知来源)at   org.hsqldb.Session.executeCompiledStatement(Unknown Source)... 28   更

据我所知,这违反了对这个缓存表的一些约束,我不明白为什么它运行这个脚本。我认为创建镜像的重点是我不需要重新应用任何脚本?

有人知道如何正确阅读镜子吗?

注意:< TABLE DEF> =>为简洁起见,我跳过了表定义。

2 个答案:

答案 0 :(得分:0)

我设法让它发挥作用,但它有点hacky。基本上,通过从镜像脚本中删除Unique Constraints,它最终成功完成了。可悲的是,我不知道数据,所以如果它仍然正确,需要解决,但我相信它是。

感谢大家的指点!非常感谢。

答案 1 :(得分:0)

当Access数据库中的表具有为给定列定义的多个唯一索引时,例如主键索引(主要=是,唯一=是)另一个单独的唯一索引(主要=否,唯一=是)。

DupUnique.png

Access本身对此没有任何问题,但HSQLDB(UCanAccess用于其后备数据库)不允许在一组列上有多个唯一约束。

最佳解决方案是在Access中打开.accdb或.mdb数据库并删除冗余的非主要唯一索引。