Стоит ли использовать Hibernate с этой многопоточной архитектурой или отказаться от нее? - PullRequest
2 голосов
/ 29 июля 2010

Мое программное обеспечение использует несколько потоков для своей работы. Существует конвейер, который выглядит примерно так:

                   +-----------------+
                   |+-----------------+
+------------+     ||+-----------------+     +------------+
|            |     |||                 |     |            |
| Get and    |     ||| Worker Threads  |     |  Save      |
| feed work  |--->>|||                 |--->>|     Output |
|            |     |||   Do Work       |     |            |
+------------+     +||                 |     +------------+
                    +|                 |
                     +-----------------+

Каждая коробка представляет отдельный поток. Стрелки между ними являются потокобезопасными очередями для прохождения «рабочих» объектов. Поток "Get and feed work" извлекает ожидающую работу из базы данных и передает ее в пул рабочих потоков. Эти рабочие потоки выполняют некоторую работу, обновляя флаг состояния на рабочем объекте (и сохраняя его в БД), а также производят некоторые выходные объекты. Выходные объекты передаются в поток «Save Output», где они сохраняются и / или обновляются в базе данных.

Целью этой архитектуры является главным образом повышение эффективности очередей.

Мне нужно, чтобы поток «Get and Feed Work» имел собственный сеанс / соединение с БД, чтобы он мог непрерывно считывать данные из БД, разблокировать и передавать эти данные в рабочие потоки.

Каждый рабочий поток также нуждается в своем собственном соединении / сеансе работы с БД, главным образом для обновления своего прогресса в БД при выполнении любой задачи, над которой он работает. Эти соединения / сеансы БД всегда являются незначительными, нечастыми обновлениями. Каждый рабочий поток производит что-то существенное, что требует вставки в БД. Вместо того, чтобы каждый рабочий поток выполнял свою собственную вставку, он переносит эту ответственность вниз по потоку к потоку «Сохранить вывод».

Поток "Сохранить вывод" повышает эффективность записи в БД, выполняя ее в пакетном режиме - операции вставки в пакетах выполняются намного быстрее, чем по одному за раз.

Я начинаю думать, что Hibernate не подходит для этой архитектуры.

Я обнаружил, что сталкиваюсь со многими проблемами, связанными с сессиями Hibernate, выселением, слиянием, очисткой, сбросом, о боже.

Моя архитектура в настоящее время кажется стабильной, но она также кажется крайне неэффективной. Было бы лучше отказаться от Hibernate и использовать прямой JDBC?

Ответы [ 2 ]

1 голос
/ 29 июля 2010

Вы можете отсоединить объекты, переданные между сеансами, или передать только идентификатор объекта.

0 голосов
/ 29 июля 2010

Сеансы Hibernate и объекты, загруженные из сессий, не являются потокобезопасными, поэтому к ним не могут обращаться разные потоки одновременно , однако можно обращаться к ним из разных потоков последовательно . Судя по описанию вашего процесса, между потоками нет совпадения, поэтому вы должны хорошо передавать объекты и сеанс.

Убедитесь, что не используете связанные с потоками сессии, не используйте SessionFactory.getCurrentSession()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...