我目前正试图解决与使用jacess版本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)
从我在网上看到的,看来jackess的当前版本是2。*,所以这是可以通过使用最新版本来解决的问题,还是有一个更大的问题,即400万行太多的访问表?或者,是否有一种方法可以通过Cursor对象添加行,从而减少内存消耗?
如果有问题的应用程序对您的业务仍然很重要,那么您需要更新它以使用当前版本的jacess。到目前为止,你已经有9年多的时间了(jackess 1.1.8于2007年2月发布),从那以后事情有了一些进展。
值得注意的是,当前版本的jacess支持DatabaseBuilder#setAutoSync(false)
,它禁止对数据库文件的更新进行逐行刷新。(我在jackess 1.1.8的源代码中搜索了"autosync",没有找到匹配项,所以我认为当时不支持。)
对于使用jackess 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小时来完成相同的事情。