web-dev-qa-db-fra.com

Comment puis-je fournir différentes configurations de base de données avec Spring Boot?

Comme je le vois actuellement, j'ai 5 profils de base de données possibles

  • Test de CI -> h2 mem
  • environnement de développement (test ou exécution d'application) -> h2 mem, ou fichier h2 ou postgres
  • production -> postgres (idéalement des identifiants non stockés dans le git/war)

actuellement, j'ai postgres configuré pour exécuter l'application, et h2 configuré pour tester via un application.properties différent dans Java/resources vs test/resources

quel est le moyen le plus simple de modifier les informations de connexion à la base de données pour ces scénarios?

29
xenoterracide

Comme M. Deinum le mentionne dans son commentaire, le moyen le plus simple consiste à utiliser configuration spécifique au profil .

Spring Boot vous permet d’avoir un fichier de configuration commun (application.properties), puis plusieurs autres fichiers, chacun spécifique à un profil (application-${profile}.properties).

Par exemple:

  • application.properties - Configuration commune
  • application-dev.properties - Configuration pour le profil dev
  • application-ci.properties - Configuration pour les profils ci

Si votre application s'exécute avec un profil "ci" par exemple, le fichier de configuration par défaut ainsi que le fichier de configuration ci (qui contiendrait les propriétés de configuration de la source de données pour le profil ci) seront chargés.

Pour changer de profil, vous pouvez utiliser l'une des options suivantes:

  • Propriété JVM: -Dspring.profiles.active=ci
  • Commutateur de ligne de commande: --spring.profiles.active=dev

Pour les tests unitaires, vous pouvez utiliser l'annotation @ActiveProfiles("test") sur vos classes de tests pour indiquer à Spring que les tests unitaires doivent être exécutés avec un profil de test.

De plus, si vous ne souhaitez pas stocker les informations d'identification de la base de données de production avec votre code source, vous pouvez spécifier un fichier de configuration externe lorsque vous déployez votre application en production:

  • Utilisation du commutateur de ligne de commande: --spring.config.location=/srv/myapp/config.properties
  • Utilisation d'une propriété de la machine virtuelle Java: -Dspring.config.location=/srv/myapp/config.properties
52
Bohuslav Burghardt

La réponse compacte pour le scénario ci-dessus consisterait à créer un seul fichier application.yml et à créer différents profils en fonction des besoins, dans votre cas -dev, -ci et -prod et à fournir les informations de base de données en conséquence.

Exemple d'exemple:

spring:
  profiles.active: development

---
spring:
  profiles: development
datasource:
  db-person:
      url: jdbc:Oracle:thin:@db_person_dev
      username: username
      password: pwd
      driver-class-name: Oracle.jdbc.OracleDriver
      test-on-borrow: true
      validation-query: SELECT 1 FROM dual
  db-contract:
      url: jdbc:Oracle:thin:@db_contract_dev
      username: username
      password: pwd
      driver-class-name: Oracle.jdbc.OracleDriver
      test-on-borrow: true
      validation-query: SELECT 1 FROM dual

    ---

    spring:
      profiles: test
    datasource:
      db-person:
          url: jdbc:Oracle:thin:@db_person_test
          username: username
          password: pwd
          driver-class-name: Oracle.jdbc.OracleDriver
          test-on-borrow: true
          validation-query: SELECT 1 FROM dual
      db-contract:
          url: jdbc:Oracle:thin:@db_contract_test
          username: username
          password: pwd
          driver-class-name: Oracle.jdbc.OracleDriver
          test-on-borrow: true
          validation-query: SELECT 1 FROM dual

    ---

    spring:
      profiles: production
    datasource:
      db-person:
          url: jdbc:Oracle:thin:@db_person_prod
          username: username
          password: pwd
          driver-class-name: Oracle.jdbc.OracleDriver
          test-on-borrow: true
          validation-query: SELECT 1 FROM dual
      db-contract:
          url: jdbc:Oracle:thin:@db_contract_prod
          username: username
          password: pwd
          driver-class-name: Oracle.jdbc.OracleDriver
          test-on-borrow: true
          validation-query: SELECT 1 FROM dual

    ---

Pour plus de compréhension et un exemple simple, vous pouvez vous référer à ce lien .