Использование синхронизированного является неадекватным способом решения этой проблемы:
Во-первых, вы закодируете свое приложение, чтобы одновременно можно было развернуть только один экземпляр.Это не только масштабирование в облаке.Для ИТ-отдела является нормальным хотеть поднять более одного экземпляра приложения, чтобы это не было единственной точкой отказа (так что в случае, если ящик, на котором размещен один экземпляр, выходит из строя, приложение все еще доступно).Использование статической синхронизации означает, что блокировка не выходит за пределы одного загрузчика классов приложения, поэтому несколько экземпляров могут чередовать свою работу, подверженную ошибкам.
Если вы в какой-то момент должны покинуть проект, последующие сопровождающие могут не знать об этой проблеме и могут попытаться развернуть приложение так, как вы этого не планировали.Используя синхронизированные средства, вы оставите наземную мину, чтобы они могли наткнуться на нее.
Во-вторых, использование синхронизированного блока препятствует параллелизму вашего приложения, поскольку за один раз может выполняться только один поток.
Итак, вы ввели узкое место и в то же время отменили способность операций обходить узкое место путем развертывания второго экземпляра.Не очень хорошее решение
Поскольку в опубликованном коде нет признаков того, где находятся транзакции, я предполагаю, что либо каждый DAO создает свою собственную транзакцию, либо вы подключаетесь в режиме автоматической фиксации.Базы данных предоставляют транзакции для решения этой проблемы, и, поскольку эта функция реализована в базе данных, она будет работать независимо от того, сколько экземпляров приложения запущено.
Простым способом решения проблемы, которая позволила бы избежать вышеуказанных недостатков, было бы поместить транзакцию на уровень обслуживания, чтобы все вызовы DAO выполнялись в одной транзакции.Служебный уровень может получить соединение с базой данных из пула, запустить транзакцию, передать соединение каждому вызову метода DAO, зафиксировать транзакцию и затем вернуть соединение в пул.