У меня есть настольное приложение, которое сохраняет свои данные в локальной базе данных H2.Я использую Squeryl для взаимодействия с базой данных.
Размер базы данных очень мал (около 10 КБ).Я испытываю серьезные проблемы с производительностью, и происходит обширный дисковый ввод-вывод.Я только читаю БД и поэтому ожидал, что полные данные могут быть кэшированы;Я даже установил размер кеша на некоторое значение (намного больше, чем общий размер БД).Также я попытался отключить блокировку безрезультатно.
Моя программа выполняет очень много небольших запросов к базе данных;в основном у меня есть Swing TableModel
, который делает запрос для каждой записи таблицы (каждый столбец каждой строки).Я заключаю каждый из этих вызовов в блок Squeryl transaction
.
Я создал профиль с использованием JVisualVM, и я подозреваю, что следующее дерево вызовов показывает проблему.Самый верхний метод - доступ для чтения из моего кода.
ссылка на снимок экрана JVisualVM.
Вопрос
Как это исправить или что яЯ делаю не так?Каким-то образом я ожидаю, что мне удастся сделать много небольших вызовов для БД, которая достаточно мала, чтобы ее можно было хранить в пределах 1 МБ памяти.Почему происходит этот дисковый ввод-вывод и как его избежать?