Jackcess Table 限制?

Jackcess Table Limit?

我目前正在尝试解决与其他人编写的程序相关的问题,该程序使用 Jackcess 1.1.8 版将信息写入 Access 数据库。在应该向给定访问 table 添加 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.*,所以这是可以使用最新版本解决的问题,还是存在更大的问题,即,一个 Access table 的 400 万行太多了?或者,有没有一种方法可以通过 Cursor 对象添加行,从而减少内存占用?

如果有问题的应用程序对您的业务仍然很重要,那么您需要更新它以使用当前版本的 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 秒。

使用 setAutoSync(false) 插入 4,000,000 行的测试用时大约 220 秒,即 3.5 多分钟。根据上面的数字,没有 setAutoSync(false) 的相同操作 预计需要大约 5,500 秒或 1.5 小时才能完成相同的操作。