Предел стола Джекцесса?

В настоящее время я пытаюсь решить проблему, связанную с программой, написанной кем-то еще, который использует Jackcess версии 1.1.8 для записи информации в базу данных Access. При выполнении, которое должно добавить 4 миллиона строк в данную таблицу 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. *, так что это может быть решено с помощью последней версии, или есть большая проблема, то есть 4 миллиона слишком много строк для таблицы доступа? В качестве альтернативы, есть ли способ добавить строки через объект Cursor, который был бы менее интенсивным в памяти?

1 ответ

Решение

Если рассматриваемое приложение по-прежнему важно для вашего бизнеса, вам необходимо обновить его, чтобы использовать текущую версию Jackcess. Вы получили более 9 лет из этого (Jackcess 1.1.8 был выпущен в феврале 2007 года), и с тех пор ситуация немного улучшилась.

Примечательно, что текущая версия Jackcess поддерживает DatabaseBuilder#setAutoSync(false) который отключает построчную очистку обновлений файла базы данных. (Я искал исходный код Jackcess 1.1.8 для поиска 'autosync' и не нашел совпадений, поэтому я предполагаю, что он не был поддержан в то время.)

Для тестовой вставки из 100 000 строк с использованием Jackcess 2.1.3, setAutoSync(true) (по умолчанию) заняло около 200 секунд, в то время как тот же код с setAutoSync(false) заняло 8 секунд.

Тестовая вставка из 4 000 000 строк с setAutoSync(false) заняло около 220 секунд, или чуть более 3,5 минут. Исходя из числа выше, та же операция без setAutoSync(false) Ожидается, что для выполнения той же задачи потребуется где-то порядка 5500 секунд или 1,5 ЧАСА.

Другие вопросы по тегам