Spring Boot不会选择spring.datasource.tomcat。*而是以编程方式配置数据源?

时间:2017-08-06 13:33:38

标签: java spring tomcat spring-boot

我正在配置两个数据源,并尝试设置池属性,并且根据文档我应该使用spring.datasource.tomcat。*,这似乎不适用于我正在进行的配置。我究竟做错了什么?或者我错过了什么?

我的application.properties:

spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validationQuery=SELECT 1 
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username
spring.datasource.password

spring.read.datasource.tomcat.test-on-borrow=true
spring.read.datasource.tomcat.validationQuery=SELECT 1 
spring.read.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.read.datasource.username
spring.read.datasource.password

以下是我的配置类: 我有一个类似的读数据源(针对不同的repo /实体)

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager",
basePackages = "com.test.feature.repo.internal")
public class DataSourceConfig {

    @Primary
    @Bean("dataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource(){
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name="entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, 
            @Qualifier("dataSource")DataSource dataSource){
        return builder.dataSource(dataSource).packages("com.test.feature.entity.internal").persistenceUnit("defaultPersistenceUnit").build();
    }

    @Primary
    @Bean(name="transactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory){
        return new JpaTransactionManager(entityManagerFactory);
    }
}

如果我尝试使用spring.datasource.test-on-borrow = true,那么这可行。

我真的想知道为什么.tomcat。*样式不起作用?我能做些什么才能做到这一点?

即使有人将我重新定向到一些有用的阅读材料来理解这一点,我也会很高兴。 :)

3 个答案:

答案 0 :(得分:4)

该文档是关于自动配置的,您没有使用它。如果您正在编写自定义代码来设置DataSource,那么您也负责配置的绑定。

上面的代码有一个@ConfigurationPropeties("spring.datasource")。如果删除它,则不会在您自己的代码中考虑spring.datasource.*属性。

This section of the doc解释了基本属性(spring.datasource)和数据源绑定(spring.datasource.xyz.*)之间的区别。

无论如何,如果您自己创建DataSource(为什么?),请使用单独的命名空间。重用spring.datasource命名空间非常混乱,因为用户期望自动配置提供的功能将得到尊重。他们不会写你自己的配置。

答案 1 :(得分:1)

我在application.properties中添加了以下两行。

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.read.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

正在运行...谢谢。

答案 2 :(得分:0)

  1. 如果您只有一个数据源和自动配置,则只需要使用spring.datasource。*来配置。 tomcatcp将被选为默认cp。

  2. 在您的情况下:以编程方式配置两个dataSource,请在 application.properties 中添加以下注释 spring.datasource.type ,告诉它哪个连接池你选。

  3. spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource spring.read.datasource.type=org.apache.tomcat.jdbc.pool.DataSource