UCanAccess - 使用 keepMirror 后无法重新连接到 Access 数据库
Posted
技术标签:
【中文标题】UCanAccess - 使用 keepMirror 后无法重新连接到 Access 数据库【英文标题】:UCanAccess - Unable to reconnect to Access database after using keepMirror 【发布时间】:2016-08-27 10:15:11 【问题描述】:我正在尝试使用 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");
在第一次运行时,应用程序运行良好,并在上面的目录中创建了镜像文件。但是,在随后的运行中,我得到以下异常:
【参考方案1】:线程“主”java.lang.RuntimeException 中的异常: net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.6 错误 脚本文件行:289 /some/dir/test/resources/db-mirror/mirror-783471167 唯一 语句 [CREATE] 中的列集上已存在约束 CACHED TABLE
ON DELETE CASCADE ON UPDATE CASCADE)] 在 de.gdfsuezenergie.stromnev.enet.ENETConnector.init(ENETConnector.java:69) 在 de.gdfsuezenergie.stromnev.Main.setUp(Main.java:374) 在 de.gdfsuezenergie.stromnev.Main.main(Main.java:165) 在 de.gdfsuezenergie.stromnev.MainTest.main(MainTest.java:9) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:483) 在 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
ON DELETE CASCADE ON UPDATE CASCADE)] 在 net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:264) 在 java.sql.DriverManager.getConnection(DriverManager.java:664) 在 java.sql.DriverManager.getConnection(DriverManager.java:270) 在 de.gdfsuezenergie.stromnev.enet.ENETConnector.createConnection(ENETConnector.java:86) 在 de.gdfsuezenergie.stromnev.enet.ENETConnector.init(ENETConnector.java:57) ... 8 更多原因:java.sql.SQLException:脚本文件中的错误 行:289 /some/dir/test/resources/db-mirror/mirror-783471167 唯一 语句 [CREATE] 中的列集上已存在约束 CACHED TABLE
ON DELETE CASCADE ON UPDATE CASCADE)] 在 org.hsqldb.jdbc.JDBCUtil.sqlException(未知来源)在 org.hsqldb.jdbc.JDBCUtil.sqlException(未知来源)在 org.hsqldb.jdbc.JDBCConnection.(Unknown Source) at 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) 在 net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:231) ... 12 更多原因:org.hsqldb.HsqlException:脚本文件中的错误 行:289 /some/dir/test/resources/db-mirror/mirror-783471167 唯一 语句 [CREATE] 中的列集上已存在约束 CACHED TABLE
ON DELETE CASCADE ON UPDATE CASCADE)] 在 org.hsqldb.error.Error.error(未知来源)在 org.hsqldb.scriptio.ScriptReaderText.readDDL(未知来源)在 org.hsqldb.scriptio.ScriptReaderBase.readAll(未知来源)在 org.hsqldb.persist.Log.processScript(未知来源)在 org.hsqldb.persist.Log.open(未知来源)在 org.hsqldb.persist.Logger.open(未知来源)在 org.hsqldb.Database.reopen(未知来源)在 org.hsqldb.Database.open(未知来源)在 org.hsqldb.DatabaseManager.getDatabase(未知来源)在 org.hsqldb.DatabaseManager.newSession(Unknown Source) ... 19 更多 引起:org.hsqldb.HsqlException: 一个 UNIQUE 约束已经 存在于 org.hsqldb.error.Error.error(Unknown 来源)在 org.hsqldb.error.Error.error(未知来源)在 org.hsqldb.ParserTable.addTableConstraintDefinitions(未知来源) 在 org.hsqldb.StatementSchema.getResult(Unknown Source) 在 org.hsqldb.StatementSchema.execute(未知来源)在 org.hsqldb.Session.executeCompiledStatement(未知来源)... 28 更多
我知道这违反了这个缓存表的一些约束,我不明白为什么它运行这个脚本。我认为创建镜像的全部意义在于我不需要重新应用任何脚本?
有人知道如何正确阅读镜子吗?
注意:
=> 为简洁起见,我跳过了表定义。
【问题讨论】:
我怀疑数据库的大小是连接的问题。实际查询大表而不是初始连接将是一个问题。如果您从发布的链接中阅读 OP 对自己问题的回答,他/她会指出网络/共享服务器是问题所在。 一定要使用有线局域网。并尝试使用 CPU 硬盘驱动器上的数据库测试速度。提醒一下,切勿在 Internet 文件夹(Dropbox、Google Drive、OneDrive 等)、闪存/拇指驱动器或存储空间不足的驱动器中使用数据库。 检查相关表的定义,看看它是否为给定列定义了多个唯一索引,例如,主键索引(Primary=Yes, Unique=Yes)和 另一个单独的唯一索引(Primary=No,Unique=Yes)。我过去曾看到这会导致keepMirror
出现问题。 数据库在我自己的硬盘上。它大约 1.5GB,应用程序运行大约需要 5 分钟,而使用 Java6 和 sun.jdbc.odbc.JdbcOdbcDriver 运行时需要 40 秒。 你是对的,只要听从戈德的建议。
当 Access 数据库中的表具有为给定列定义的多个唯一索引时会发生此问题,例如,主键索引(Primary=Yes, Unique=Yes)和 另一个单独的唯一索引(Primary=No,Unique=Yes)。
Access 本身对此没有任何问题,但 HSQLDB(UCanAccess 将其用作其后备数据库)不允许对一组列进行多个唯一约束。
最好的解决办法是在Access中打开.accdb或.mdb数据库,去掉多余的非Primary唯一索引。
【讨论】:
【参考方案2】:我设法让它工作,但它有点 hacky。基本上通过从镜像脚本中删除唯一约束,它终于设法通过了。遗憾的是我不了解这些数据,因此需要确定它是否仍然正确,但我相信它是正确的。
感谢大家的指点!非常感谢。
【讨论】:
以上是关于UCanAccess - 使用 keepMirror 后无法重新连接到 Access 数据库的主要内容,如果未能解决你的问题,请参考以下文章
UCanAccess - 使用 keepMirror 后无法重新连接到 Access 数据库
使用 UCanAccess 连接到数据库时出现“无效页码 1”错误