Мое программное обеспечение использует несколько потоков для своей работы. Существует конвейер, который выглядит примерно так:
+-----------------+
|+-----------------+
+------------+ ||+-----------------+ +------------+
| | ||| | | |
| Get and | ||| Worker Threads | | Save |
| feed work |--->>||| |--->>| Output |
| | ||| Do Work | | |
+------------+ +|| | +------------+
+| |
+-----------------+
Каждая коробка представляет отдельный поток. Стрелки между ними являются потокобезопасными очередями для прохождения «рабочих» объектов. Поток "Get and feed work" извлекает ожидающую работу из базы данных и передает ее в пул рабочих потоков. Эти рабочие потоки выполняют некоторую работу, обновляя флаг состояния на рабочем объекте (и сохраняя его в БД), а также производят некоторые выходные объекты. Выходные объекты передаются в поток «Save Output», где они сохраняются и / или обновляются в базе данных.
Целью этой архитектуры является главным образом повышение эффективности очередей.
Мне нужно, чтобы поток «Get and Feed Work» имел собственный сеанс / соединение с БД, чтобы он мог непрерывно считывать данные из БД, разблокировать и передавать эти данные в рабочие потоки.
Каждый рабочий поток также нуждается в своем собственном соединении / сеансе работы с БД, главным образом для обновления своего прогресса в БД при выполнении любой задачи, над которой он работает. Эти соединения / сеансы БД всегда являются незначительными, нечастыми обновлениями. Каждый рабочий поток производит что-то существенное, что требует вставки в БД. Вместо того, чтобы каждый рабочий поток выполнял свою собственную вставку, он переносит эту ответственность вниз по потоку к потоку «Сохранить вывод».
Поток "Сохранить вывод" повышает эффективность записи в БД, выполняя ее в пакетном режиме - операции вставки в пакетах выполняются намного быстрее, чем по одному за раз.
Я начинаю думать, что Hibernate не подходит для этой архитектуры.
Я обнаружил, что сталкиваюсь со многими проблемами, связанными с сессиями Hibernate, выселением, слиянием, очисткой, сбросом, о боже.
Моя архитектура в настоящее время кажется стабильной, но она также кажется крайне неэффективной. Было бы лучше отказаться от Hibernate и использовать прямой JDBC?