0

我目前正在尝试解决与其他人编写的程序相关的问题,该程序使用 Jackcess 版本 1.1.8 将信息写入 Access 数据库。在应该向给定 Access 表中添加 400 万行的运行中,会发生以下异常:

08/29/2016 06:01:47 | ERROR | java.lang.IndexOutOfBoundsException
at java.nio.Buffer.checkIndex(Unknown Source)
at java.nio.HeapByteBuffer.getInt(Unknown Source)
at com.healthmarketscience.jackcess.ReferenceUsageMap.addOrRemovePageNumber(ReferenceUsageMap.java:82)
at com.healthmarketscience.jackcess.UsageMap.addPageNumber(UsageMap.java:201)
at com.healthmarketscience.jackcess.Table.newDataPage(Table.java:761)
at com.healthmarketscience.jackcess.Table.addRows(Table.java:714)
at com.healthmarketscience.jackcess.Table.addRow(Table.java:660)

从我在网上看到的,现在的Jackcess的版本好像是2.*,那么这个问题是不是可以用最新的版本来解决呢,还是有更大的问题,就是400万行太多了访问表?或者,有没有办法通过 Cursor 对象添加行,这会减少内存密集度?

4

1 回答 1

1

如果有问题的应用程序对您的业务仍然很重要,那么您需要更新它以使用当前版本的 Jackcess。到目前为止,您已经度过了 9 年多的时间(Jackcess 1.1.8 于 2007 年 2 月发布)并且从那时起事情有了一些进展。

值得注意的是,当前版本的 Jackcess 支持DatabaseBuilder#setAutoSync(false)禁用对数据库文件更新的逐行刷新。(我在 Jackcess 1.1.8 源代码中搜索了 'autosync' 并没有找到匹配项,所以我认为当时不支持它。)

对于使用 Jackcess 2.1.3 插入 100,000 行的测试,setAutoSync(true)(默认)大约需要 200 秒,而相同的代码setAutoSync(false)需要 8 秒。

一个包含 4,000,000 行的测试插入setAutoSync(false)大约需要 220 秒,也就是 3.5 分钟多一点。根据上面的数字,相同的操作预计 setAutoSync(false)需要大约 5,500 秒或 1.5 小时才能完成相同的事情。

于 2016-08-31T00:43:23.810 回答