我当前正在尝试解决与其他人使用Jackcess 1.1.8版将信息写出到Access数据库的程序有关的问题。在应该将400万行添加到给定的Access表的运行中,发生以下异常:
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对象添加行,而这些行会减少内存消耗?
最佳答案
如果有问题的应用程序对您的业务仍然很重要,那么您需要对其进行更新以使用当前版本的Jackcess。到目前为止,您已经有9年的时间了(Jackcess 1.1.8于2007年2月发布),从那时起,事情有了一些进展。
值得注意的是,当前版本的Jackcess支持DatabaseBuilder#setAutoSync(false)
,它禁用了对数据库文件更新的逐行刷新。 (我在Jackcess 1.1.8源代码中搜索了“自动同步”,但没有找到匹配项,因此我认为当时不支持该代码。)
对于使用Jackcess 2.1.3进行的100,000行测试插入,setAutoSync(true)
(默认)花费了大约200秒,而使用setAutoSync(false)
的相同代码花费了8秒。
使用setAutoSync(false)
插入4,000,000行的测试大约花费了220秒,或刚刚超过3.5分钟。根据上面的数字,完成相同的操作时,不带setAutoSync(false)
的相同操作将花费大约5500秒(即1.5小时)的时间。