javajackcess表限制?
我目前正在尝试解决一个与其他人编写的程序有关的问题,该程序使用JackAccess 1.1.8版将信息写入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万?或者,是否有一种通过游标对象添加行的方法,这种方法占用的内存更少
# 1 楼答案
如果所讨论的应用程序对您的业务仍然很重要,那么您需要更新它以使用当前版本的Jackcess。到目前为止,您已经使用了9年(Jackcess 1.1.8于2007年2月发布),从那时起,事情有了一些进展
值得注意的是,当前版本的Jackcess支持
DatabaseBuilder#setAutoSync(false)
,这将禁用对数据库文件的逐行刷新更新。(我在jackcess1.1.8源代码中搜索了“autosync”,但没有找到匹配项,因此我假设当时不支持它。)对于使用jackcess2.1.3进行的100000行测试插入,
setAutoSync(true)
(默认值)大约需要200秒,而使用setAutoSync(false)
的相同代码需要8秒使用
setAutoSync(false)
进行4000000行的测试插入大约需要220秒,也就是刚刚超过3.5分钟。根据上述数字,没有setAutoSync(false)
的相同操作预计需要5500秒或1.5小时才能完成相同的任务