@longBurn

Как организвовать многопоточное взаимодействие с БД в Java?

Добрый день, товарищи!

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

Можно создать класс, который будет предоставлять методы readRecord() и writeRecord(), передать ссылку на этот объект во все потоки. Можно в каждом потоке независимо устанавливать подключение к БД и и производить требуемые операции.

Есть ли какие-нибудь принятые шаблоны реализации? Есть ли какая-нибудь литература расскрывающая днный вопрос?

Заранее всем спасибо!
  • Вопрос задан
  • 5472 просмотра
Решения вопроса 1
ehabarov
@ehabarov
IT Specialist
Подход из мира JEE (и не только):

Для всего многопоточного приложения используется реализация "пула соединений", которая обслуживает соединения с СУБД (одной или несколькими).
Прикладной код каждого потока обращается к пулу, получает из него соединение с СУБД, выполняет определенную работу (запрос или запросы), закрывает транзакцию и закрывает соединение (в результате соединение возвращается в пул).
В этом случае предполагается, что прикладной код удерживает соединение минимально необходимое время.

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

Логика управления пулом может самостоятельно устанавливать новые соединения (если все существующие заняты), завершать соединения (если очень много свободных), "отбирать" соединения у прикладного кода, если по соединению долго не было никакой активности (банально забыли закрыть соединение), проверять незанятые соединения на "живость", выполняя диагностические SQL-запросы и т.п.

Примеры реализации пулов соединений:
Apache Commons DBCP
c3p0:JDBC DataSources/Resource Pools
The Tomcat JDBC Connection Pool
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
В мире Java для работы с БД принято использовать Hibernate. Но, как обычно, есть проблемы.
Ответ написан
Комментировать
Ну желательно каждому потоку выдавать свой конекшен, т.к. операции выполняются в транзакции, а если в один конекшен будут пихать запросы разные потоки, то при комите в базу, закомитится все, при ролбеке все откатится. Обычно используют пул конекшенов к БД и в принципе никаких проблем, у пула просят конекшен getConnection(), а пул либо выдает уже существующий, если есть свободный или создает новый.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы