2016-01-20 45 views
1

我在寫一個使用Spring Boot的服務器應用程序,它連接到數據庫。應用程序使用Hibernate/JPA,並且應該支持多個數據庫引擎,理想情況下只需配置Spring Boot屬性(spring.datasource.*)即可。如何在Spring Boot應用程序中的pom.xml中指定數據庫引擎

目前,它僅支持MySQL和爲了支持工作開箱即用,我在pom.xml文件中添加這種依賴性,因爲在許多SO問題建議:

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

什麼是支持多個數據庫引擎的最簡潔的方式嗎?我應該:

  • 包含我想支持的所有引擎依賴關係作爲運行時依賴關係在pom.xml中? (似乎太「健談」,手動和不完整)
  • 添加一些統一的依賴關係,已經有最新的數據庫引擎列表? (我找不到)
  • 在pom.xml中不包含任何依賴項,並要求應用程序部署者執行額外的服務器配置,以便在類路徑上擁有正確的引擎庫? (似乎是不必要的複雜的步驟要求從部署者)
  • 任何其他方式以乾淨的方式做到這一點?

謝謝。

+0

只是爲了我的解決方案回答:我其實跟客戶,看看他們想一想。事實證明,他們都已經在他們的服務器的類路徑中有一個數據庫驅動程序,因此,在我的情況下,「在pom.xml中不包含任何依賴項」選項似乎是正確的。我的軟件客戶是銀行,其他類型的客戶可能會有所不同。 –

回答

0

您的用例需要多個數據庫連接?我很想創建多個存儲庫配置文件,例如從http://fruzenshtein.com/spring-java-configurations/

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories("com.mobapp.repository") 
public class DataBaseConfig { 

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver"; 
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password"; 
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url"; 
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username"; 

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; 
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql"; 
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan"; 

    @Resource 
    private Environment env; 

    @Bean 
    public DataSource dataSource() { 
      DriverManagerDataSource dataSource = new DriverManagerDataSource(); 

      dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER)); 
      dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL)); 
      dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME)); 
      dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD)); 

      return dataSource; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
      LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
      entityManagerFactoryBean.setDataSource(dataSource()); 
      entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class); 
      entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN)); 

      entityManagerFactoryBean.setJpaProperties(hibProperties()); 

      return entityManagerFactoryBean; 
    } 

    private Properties hibProperties() { 
      Properties properties = new Properties(); 
      properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); 
      properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); 
      return properties;   
    } 

    @Bean 
    public JpaTransactionManager transactionManager() { 
      JpaTransactionManager transactionManager = new JpaTransactionManager(); 
      transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
      return transactionManager; 
    } 

}

+0

我不需要多個連接,只是爲了支持不同的引擎,而不是將我的實現與MySQL綁定......我要求一個最好的方法來做到這一點...... –

+1

我會在你的POM中包含所有依賴關係,驅動程序類名稱和方言根據需要配置 –

0
  1. 如果您使用的彈簧引導啓動父,你把所有流行的JDBC驅動程序的列表,最新的版本。

    <parent> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-parent</artifactId> 
        <version>1.3.1.RELEASE</version> 
        <relativePath/> <!-- lookup parent from repository --> 
    </parent> 
    

    因此,包括依賴關係時,您可以省略版本:

    <dependency> 
        <groupId>com.h2database</groupId> 
        <artifactId>h2</artifactId> 
        <scope>runtime</scope> 
    </dependency> 
    
  2. 您可以使用maven的配置文件來指定在 啓動時要使用的JDBC提供者,由此前宣佈的具體配置文件的依賴關係:

    <profiles> 
        <profile> 
         <id>mysql</id> 
         <dependencies> 
          <dependency>…</dependency> 
         </dependencies> 
        </profile> 
        <profile> 
         <id>h2</id> 
         <dependencies> 
          <dependency>…</dependency> 
         </dependencies> 
        </profile> 
    </profiles> 
    
  3. 在你的配置

    然後,您可以使用@ConditionalOnClass註釋,創建datasou RCE,根據給定類的存在是類路徑:

    @ConditionalOnClass(name ="com.mysql.jdbc.jdbc2.optional.MysqlDataSource") 
    public DataSource dataSource() { 
        return new MysqlDataSource(); 
    } 
    
相關問題