Spring Boot / JPA / Hibernate, как переключить поставщика базы данных в соответствии с профилем Spring?

#hibernate #maven #jpa #spring-boot #profile

#спящий режим #maven #jpa #spring-boot #Профиль

Вопрос:

Я использую Spring Boot / JPA / Hibernate. Я хотел бы использовать HSQLDB при тестировании на localhost и MySQL при развертывании на сервере.

В pom.xml , У меня есть эта зависимость для MySQL :

  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
 </dependency>
  

и эта зависимость для HSQLDB :

 <dependency>
   <groupId>org.hsqldb</groupId>
   <artifactId>hsqldb</artifactId>
</dependency>
  

Я, вероятно, не могу поместить обе зависимости в pom.xml из-за автоматической настройки загрузки Spring. Но я хотел бы использовать HSQLDB, когда local профиль Spring активен, и использовать MySQL, когда server профиль Spring активен. В идеале я хотел бы сгенерировать только один файл war и запустить локальную версию с mvn spring-boot:run и развернуть серверную версию из файла war.

Есть идеи?

PS: я использую maven

Комментарии:

1. Какая у вас проблема, если установлены обе зависимости? Приложение запускается неправильно? Или что-то еще

2. Может быть, вы можете реализовать два разных источника данных в своем приложении и позволить значению профиля определять, какой источник данных используется.

3. @Patrick После еще нескольких исследований я обнаружил, что проблема связана с несовместимостью диалекта sql между MySQL и HSQLDB, но Стефан Николл прав, нет проблем с наличием обеих зависимостей в pom.xml .

Ответ №1:

Я, вероятно, не могу поместить обе зависимости в pom.xml из-за автоматической настройки загрузки Spring.

Конечно, у вас могут быть оба из них. Существует несколько решений.

Самый простой — иметь обе зависимости и создать application-server.properties в своем проекте с настройками вашей базы данных mysql. Когда вы запускаете приложение без определенного профиля, Spring Boot не найдет никакой информации для подключения к MySQL, поэтому он вернется к HSQL. При развертывании приложения на сервере обязательно включите server профиль. Один и тот же артефакт может использоваться для обоих вариантов использования.

Вы могли бы немного улучшить это решение, исключив зависимость от hsql при создании fat jar. Преимущество этого заключается в том, что если вы забудете включить профиль, вы получите исключение при запуске, а не будете использовать данные в памяти молча. Чтобы исключить hsql, просто настройте плагин maven. Вы сможете запускать приложение локально ( mvn spring-boot:run ) или в своей IDE, а fat jar будет содержать только зависимость mysql. Однако вам все равно придется включить server профиль.

Если вы используете war, вы не можете использовать это последнее решение: еще одна причина переключиться на jar 😉

Комментарии:

1. Почему невозможно исключить hsql из файла war?

2. Вы можете. Но если вам нужно запустить файл war и вы исключите его, вы не сможете запустить свое приложение с базой данных в памяти. Когда у вас есть jar, вы можете запускать свое приложение непосредственно из IDE

Ответ №2:

Вам нужно создать профиль Maven, а не профиль spring, и соответствующим образом добавить зависимость. Создайте локальный профиль с зависимостью от hsqldb и активируйте его в режиме разработки. Затем создайте профиль сервера с зависимостью mysql и активируйте его при упаковке для развертывания на сервере. Я лично предпочитаю dev и release как соглашение об именовании (но это мое скромное мнение). Затем вам нужно сократить профиль maven с помощью профиля spring

 <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>xyz</version>
    <configuration>
      <profiles>
        <profile>local</profile>....
  

В локальном профиле и

 <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.4.1.RELEASE</version>
    <configuration>
      <profiles>
        <profile>server</profile>...
  

в профиле сервера и запустите нужную конфигурацию с помощью этого переключателя

 mvn spring-boot:run -P[local or server]
  

Введение в построение профилей

Комментарии:

1. Это хорошее решение, но он должен создать два файла war для test и prod, верно?

2. @Patrick Это решение, используемое в проекте нашей компании. Производственный профиль минимизирует источники JS и CSS, чтобы улучшить время загрузки страницы. Мы используем mvn clean package -Prelease для создания файла prod war. Отсутствие минимизации при каждой сборке также экономит нам время ожидания во время разработки.

3. @patrick это зависит: для тестирования и prod желательно использовать одну и ту же БД (например, mysql). он должен создать две войны: одну для разработки и одну для выпуска (для тестирования и производства). вот почему я предлагаю изменить соглашение об именах

4. @Sammyrulez На самом деле, у меня есть три комбинации профилей Spring: local для тестирования на моем локальном компьютере (HSQLDB), server,dev для тестирования в производственной среде (MySQL) и server для развертывания в производственной среде (MySQL).

5. @OrtomalaLokni профиль spring или профиль maven? извините, но это непонятно