Наши среды разработки настроены так, что Hibernate будет создавать новую пустую базу данных при каждом запуске нашего приложения:
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
Это работает для одного приложения, развернутого на сервере, но в наших средах разработки мы обычно развертываем несколько приложений, которые подключаются к одной и той же базе данных. Оба они используют один и тот же источник данных с сервера приложений.
Проблема в том, что при запуске в JBoss AS7 они развертываются параллельно, поэтому оба сервера приложений пытаются создать таблицы одновременно. Мы получаем такие вещи (с анонимными именами таблиц и столбцов):
16:07:25,307 ERROR [org.hibernate.tool.hbm2ddl.SchemaExport] (MSC service thread 1-13) Unsuccessful: create table PUBLIC.SOME_TABLE (SOME_COLUMN varchar(32) not null, SOME_OTHER_COLUMN char not null, primary key (SOME_COLUMN)) 16:07:25,346 ERROR [org.hibernate.tool.hbm2ddl.SchemaExport] (MSC service thread 1-13) Table "SOME_TABLE" already exists; SQL statement: create table PUBLIC.SOME_TABLE (SOME_COLUMN varchar(32) not null, SOME_OTHER_COLUMN char not null, primary key (SOME_COLUMN)) [42101-161]
Эти ошибки игнорируются, и сервер в конечном итоге запускается, но мы хотели бы знать, есть ли способ избежать этой проблемы. Мы говорили о создании приложения, которое развертывается только для того, чтобы выполнить create-drop и заставить другие приложения ждать, но мы не уверены, насколько сложно будет изменить сканер развертывания JBoss для развертывания приложений последовательно, а не параллельно. Мы открыты и для других идей.