有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 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小时才能完成相同的任务