【问题标题】:How to specify a database engines in pom.xml in Spring Boot application如何在 Spring Boot 应用程序的 pom.xml 中指定数据库引擎
【发布时间】:2016-04-26 20:02:30
【问题描述】:

我正在使用连接到数据库的 Spring Boot 编写服务器应用程序。该应用程序使用 Hibernate / JPA 并且应该支持多个 DB 引擎,理想情况下只需配置 Spring Boot 属性 (spring.datasource.*)。

目前,它只支持 MySQL,为了支持开箱即用,我在我的 pom.xml 文件中添加了这个依赖项,正如许多 SO 问题中所建议的那样:

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

支持多个数据库引擎的最简洁的方法是什么?我应该:

  • 在 pom.xml 中包含我希望作为运行时依赖项支持的所有引擎依赖项? (似乎太“健谈”,手动且不完整)
  • [编辑] 添加一些已经拥有最新数据库引擎列表的统一依赖项? (我找不到)
  • 不在 pom.xml 中包含任何依赖项,并要求应用程序部署者进行额外的服务器配置,以便在类路径中拥有正确的引擎库? (向部署人员询问似乎是不必要的复杂步骤)
  • 还有什么其他方式可以干净利落地做到这一点?

谢谢。

【问题讨论】:

  • 只是用我的解决方案来回答:我实际上与客户交谈过,看看他们对此有何看法。事实证明,他们都已经在他们的服务器的类路径上有一个 DB 驱动程序,因此选项“不包括 pom.xml 中的任何依赖项......”对于我的情况似乎是正确的。我的软件的客户是银行,其他类型的客户可能会有所不同。

标签: spring hibernate maven spring-mvc jpa


【解决方案1】:

您需要多个数据库连接的用例是什么?我很想创建多个存储库配置文件,例如来自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;
    }

}

【讨论】:

  • 我不需要多个连接,只是为了支持不同的引擎而不是仅将我的实现与 MySQL 捆绑在一起......我要求最好的方法来做到这一点......
  • 我会在你的 POM 中包含所有依赖项,并根据需要/希望在配置中更改驱动程序类名称和方言
【解决方案2】:
【解决方案3】:
  1. 如果您使用的是 spring-boot-starter-parent,那么您将拥有所有流行的 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注解,创建数据源,基于给定类的存在是类路径:

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

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 2017-02-17
    • 1970-01-01
    • 2020-05-06
    • 2019-08-28
    • 1970-01-01
    • 2015-01-09
    • 2021-02-20
    • 1970-01-01
    相关资源
    最近更新 更多