База данных сервера H2, созданная с помощью Spring, недоступна

версии, которые я использую:

  • Весенняя версия: 4.0.5.RELEASE
  • Версия H2: 1.3.174
  • Версия для спящего режима: 4.3.6.

У меня была рабочая настройка, где я создаю сервер H2 и источник данных, используя мой applicationContext при развертывании военного файла. Моя конфигурация такова:

<bean id="h2Server" factory-method="createTcpServer" init-method="start" destroy-method="stop">
 </bean>

<bean id="dataSource" depends-on="h2Server">
 <property name="driverClassName" value="org.h2.Driver">
 <property name="url" value="${database.url}">
 <property name="username" value="${database.username}">
 </property></property></property></bean>

Затем я определил

LocalContainerEntityManagerFactoryBean

с jpaProperty, определенным для того, чтобы позволить hibernate автоматически генерировать все таблицы:

<property name="jpaProperties">
 <props>
 <prop key="hibernate.hbm2ddl.auto">update</prop>
 <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
 </props>
</property>

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

Поэтому я решил использовать flyway в качестве инструмента миграции DB, и я удалил следующую строку из определения EntityManager:

<prop key="hibernate.hbm2ddl.auto">update</prop>

Кажется, что это работает, и база данных создана и имеет минимальный размер, но когда я пытаюсь подключиться к ней с помощью Squirrel, я получаю следующее исключение:

Я ожидал бы, что если H2Server и источники данных будут созданы Spring, DB будет доступна с использованием драйвера, url, username, password.

Моя первая идея заключалась в том, что они не были созданы из-за ленивой инициализации, в то время как создание таблицы спящего режима подразумевает, что компоненты будут действительно инициализированы. Я попытался установить для свойства lazy initialization значение false для обоих свойств, но не повезло...

Я должен что-то упустить, но пока не вижу его... Есть ли способ сделать базу данных доступной для соединений после развертывания приложения?

2 ответа

Я нашел решение: все работает нормально. Я поставил точку останова в методах запуска и остановки класса org.h2.tools.Server и активировал удаленную отладку при развертывании приложения на моем сервере tomcat.

Я заметил, что сервер запустился, но через некоторое время я тоже пришел в методе остановки. Более глубокое исследование показало мне следующие строки в команде tomcat:

04-Nov-2014 13:00:28.240 SEVERE [localhost-startStop-1] org.apache.catalina.core
 .StandardContext.startInternal Error listenerStart
04-Nov-2014 13:00:55.961 SEVERE [localhost-startStop-1] org.apache.catalina.core
 .StandardContext.startInternal Context [/healthdata_hd4res] startup failed due to previous errors

Затем в файле localhost.log я обнаружил следующую ошибку:

Caused by: org.h2.jdbc.JdbcSQLException: Table "CONFIGURATIONS" not found; SQL statement:
 select configurat0_.CONFIGURATION_ID as CONFIGUR1_1_, configurat0_.DESCRIPTION as DESCRIPT2_1_, configurat0_.KEY as KEY3_1_, configurat0_.UPDATED_ON as UPDATED_4_1_, configurat0_.VALID_FROM as VALID_FR5_1_, configurat0_.VALID_TILL as VALID_TI6_1_, configurat0_.VALUE as VALUE7_1_ from CONFIGURATIONS configurat0_ where configurat0_.KEY=? and (configurat0_.VALID_FROM is null or configurat0_.VALID_FROM<=?) and (configurat0_.VALID_TILL is null or configurat0_.VALID_TILL>=?) [42102-174]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:332)
at org.h2.message.DbException.get(DbException.java:172)

Было 2 класса, которые реализовали ServletContextListener для ввода данных в существующие таблицы. Поскольку таблицы еще не были созданы, возникла ошибка, и мой h2Server был отключен во время развертывания...


Вы используете версию H2 1.4.181 на стороне клиента. (Последняя часть кода ошибки, 90067-181, является номером сборки H2).

На стороне сервера вы написали, что используете версию H2 1.3.174.

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

Я предлагаю также обновить сервер до 1.3.181 и добавить в URL-адрес базы данных ;mv_store=false чтобы отключить новый механизм хранения, который все еще находится в бета-версии.

licensed under cc by-sa 3.0 with attribution.