Как работать с режимом создания и удаления Hibernate с несколькими приложениями, подключенными к одной базе данных?

Наши среды разработки настроены так, что 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 для развертывания приложений последовательно, а не параллельно. Мы открыты и для других идей.


person Chris Williams    schedule 04.05.2012    source источник


Ответы (1)


В среде разработки каждое развернутое приложение должно иметь собственную схему базы данных. Это не только решит проблему, но также решит следующие:

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

И я уверен, что существует множество других сценариев, которые могут вызвать проблемы. Пусть у каждого разработчика своя схема, и все будет намного проще.

person JB Nizet    schedule 04.05.2012
comment
У нас есть собственные схемы. В этом случае я использую локальный экземпляр h2. У нас есть несколько приложений, которым необходимо работать с одной и той же базой данных - разные приложения для разных целей, но работают с одними и теми же данными. Это обычная ситуация для разработчиков веб-приложений. - person Chris Williams; 07.05.2012
comment
И почему бы вам просто не создать схему перед развертыванием приложений, используя сценарий SQL, или настроить только одно из развернутых приложений для создания схемы во время развертывания? - person JB Nizet; 07.05.2012
comment
Думаю, вот в чем мой вопрос: можно ли настроить одно из приложений для создания схемы? Параметр hibernate.hbm2ddl.auto установлен в файле конфигурации JBoss, мне не удалось найти способ установить его для каждого приложения. Кроме того, если мы это сделаем, нам понадобится какой-то способ сообщить JBoss о развертывании приложения, которое сначала создаст схему, а затем другие приложения. Если при запуске других приложений схема недоступна (поскольку ее создает другое приложение), приложение не запустится. - person Chris Williams; 08.05.2012
comment
Как правило, каждое приложение имеет собственную базу данных и, следовательно, собственную конфигурацию гибернации. В вашем случае у вас одна база данных, но каждое приложение по-прежнему должно иметь собственную конфигурацию гибернации. Приложение Hibernate не запускается без таблиц базы данных. - person JB Nizet; 08.05.2012
comment
Это не сработает, если проверка схемы включена, что мы и используем. Я думаю, мы могли бы просто включить его для сервера, который создает / удаляет базу данных. - person Chris Williams; 09.05.2012