2013-02-27 4 views
0

Я сохраняю сущности над несколькими подключениями к базе данных. Класс, обрабатывающий persisting, реализует интерфейс runnable, и я создаю EntityManagers в методе run(). После чтения this, я хочу знать, лучше ли инициализировать EntityManagerFactory в конструкторе класса или в статическом блоке инициализации.Инициализация EntityManagerFactory в многопоточной среде

+0

Я думаю, что нужно добавить EntityManagerFactory, а затем создать новый EntityManager в каждом потоке, так как ваше приложение также должно быть потокобезопасным, это решение, которое я использовал для аналогичного требования. –

ответ

1

Я предполагаю, что вы используете JPA в Java SE - не Java EE. Более того, я предполагаю, что у вас есть класс, который обрабатывает существующие сущности - и вы имеете в виду этот класс, когда вы запрашиваете конструктор класса или статической инициализации. Более того, я предполагаю, что все ваши множественные соединения нацелены на одну и ту же базу данных ... и я предполагаю, что вы не будете повторно использовать свои экземпляры: ни ваши EntityManager экземпляры, ни ваши экземпляры класса runnable.

Если предположения верны, то я предпочел бы инициализировать EntityManagerFactory либо в статической инициализации вашего класса runnable, либо во втором классе, который реализован как singleton.

Если вы создаете EntityManagerFactory в конструкторе класса класса runnable, у вас есть одна фабрика в каждом экземпляре (то есть в потоке). Это возможно, но не нужно, потому что вам понадобится только один EntityManagerFactory для нескольких логических идентичных экземпляров EntityManager.

Другой вопрос: где создать сам EntityManager: в конструкторе класса (позволяет ловить ошибки в начале потока инициализации) или в методе run. Лично я предпочел бы run -метод, потому что она позволяет создавать и закрывать EntityManager в в то же способом с использованием try/finally)

Предупреждение: Имейте в виду, что у Вас нет никаких транзакций между несколькими потоками.

Смежные вопросы