2016-08-30 42 views
0

我正在嘗試解決與其他人使用Jackcess版本1.1.8將信息寫入Access數據庫的程序相關的問題。在這應該加4個百萬行給定的Access表運行時,會出現以下異常:Jackcess Table Limit?

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表來說,有400萬行太多了?或者,有沒有辦法通過一個Cursor對象添加行,這會減少內存密集?

+0

不,對於Access表*本身,400萬行不是太多行*。但是,如果您的數據庫文件達到2 GB的限制,則會導致問題。至於「內存密集程度較低」的內容,異常並不表示JVM內存有問題(例如,「堆空間不足」)。此應用程序是否創建新的數據庫文件,還是寫入現有的文件? –

+0

@GordThompson,有問題的代碼創建一個Table對象,然後調用它的addRow()方法,所以我的假設是Table對象在某個點上太大以適應內存,因此例外... –

回答

1

如果有問題的應用程序對您的業務仍然很重要,那麼您需要將其更新爲使用當前版本的Jackcess。到目前爲止,你已經超過了9年(Jackcess 1.1.8於2007年2月發佈),並且自那時以來事情已經有所進展。

值得注意的是,當前版本的Jackcess支持DatabaseBuilder#setAutoSync(false),它禁止逐行刷新數據庫文件的更新。 (我在Jackcess 1.1.8源代碼中搜索'自動同步'並且沒有找到匹配項,所以我認爲它當時不支持。)

對於使用插件2.1.3,setAutoSync(true)的100,000行測試插入(默認值)大約需要200秒,而與setAutoSync(false)相同的代碼需要8秒。

帶有setAutoSync(false)的4,000,000行測試插入需要大約220秒或超過3.5分鐘。根據上面的數字,同樣的操作沒有setAutoSync(false)預計將需要約5,500秒,或1.5小時的地方完成同樣的事情。

+1

根據先前與其他評論者的對話中,我感謝您的回覆的溫和性質,@GordThompson :)關閉自動同步可以幫助解決另一個我只是間接討論的問題:這個應用程序的緩慢。爲了創建400萬行表格的表格,該程序在撞擊前運行了四天。根據您的測試結果,運行時間比默認模式的運行時間要好25倍,應該可以在幾小時內完成此程序,而不是幾天。我會讓你發佈...... –

+0

我更新了程序以使用最新版本的Jackcess,好消息是它在14分鐘內運行,而不是四天。但壞消息是,它仍然沒有消失。但至少它是關於什麼問題的更多信息:Access數據庫的2G大小限制已被觸及。我在MS-Access網站上看到,表格可以從一個數據庫鏈接到另一個數據庫。你是否知道Jackcess是否可以讓你這樣做? –

+0

是的,Jackcess可以*處理包含與另一個Access數據庫中的錶鏈接的表的數據庫,並且在Windows上它非常透明。 (在非Windows機器上,我們需要創建一個實現LinkResolver的類,以便將錶鏈接中的Windows路徑與非Windows路徑進行協調。)我不記得在Jackcess中看到了一種機制來創建表中的鏈接一個數據庫,但是一個解決方法是在Access中創建一個「模板」數據庫,並使用所需的錶鏈接並從那開始,而不是全新的空數據庫文件。 –