Эти 2 предложения - красные флаги для меня:
Когда мы запускаем приложение, мы тянем
вся информация из базы данных
и превратить его в объекты для использования
в нашем приложении (используя Java SQL
statemens). В приложении мы редактируем
некоторые из этих объектов, а затем, когда мы
выйти из приложения мы сохраняем или обновляем
информация в базе данных с использованием
Hibernate.
Существует ли причина, по которой вы загружаете всю информацию из базы данных в память при запуске, или почему вы ждете до выключения, чтобы сохранить изменения обратно в базу данных?
Если нет, я бы предложил изменить дизайн. Если у вас уже есть отображения Hibernate для таблиц в БД, я бы использовал Hibernate для обеих ваших операций CRUD (создание, чтение, обновление, удаление). И я бы загружал только те данные, которые нужны каждой странице вашего приложения, так как это необходимо.
Если вы не можете внести такого рода изменения в конструкцию на этом этапе, я думаю, что вы должны внимательно посмотреть, как вы управляете соединениями с базой данных. Вы используете пулы соединений? Вы открываете несколько соединений? Забыл освободить их?
На что-то еще посмотреть. Как вы используете Hibernate для сохранения сущностей в БД? Вы делаете getHibernateTemplate (). Get для каждого, а затем делаете entity.save или entity.update для каждого? Если это так, это означает, что вы также заставляете Hibernate запускать запрос на выборку для каждого объекта базы данных перед сохранением или обновлением. Таким образом, по сути, вы будете загружать каждый объект базы данных дважды (один раз в начале программы, один раз перед сохранением). Чтобы увидеть, происходит ли это, вы можете включить свойство show_sql или использовать P6Spy , чтобы точно узнать, какие запросы выполняет Hibernate.