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

问题描述:

我正在配置两个数据源,并尝试设置池化属性,并根据文档我应该使用spring.datasource.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 

下面是我的配置类: 我有一个类似的读取数据源(不同回购/实体)

@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。*样式不起作用?我能做些什么来完成这项工作?

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

+0

您正在使用哪个版本? –

+0

我正在使用1.5.4 –

+0

1.5.7中的情况与我相同。 DataSource没有选择'spring.datasource.tomcat。*'属性。对我来说,即使spring.datasource.test-on-borrow = true也不起作用。 –

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

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

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

无论如何,如果您自己创建DataSource(为什么?),则使用单独的名称空间。重命名spring.datasource命名空间相当混乱,因为用户期望自动配置提供的功能将得到遵守。而且他们不会因为你正在编写你自己的配置。

+0

然后如何配置多个数据源,以使池属性不受影响。 (在这种情况下是tomcat jdbc池)。文档不包括这个地方。 –

+0

该文档涵盖了完全(我在我的答案给了一个链接)。你看过吗? –

+0

找到了。我错过了连接属性也可以在同一个命名空间中指定。谢谢你的帮助 –

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

  2. 你的情况:配置两个数据源编程方式,请添加以下注释spring.datasource.typeapplication.properties告诉它你选择哪种连接池。

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