小编典典

Spring Boot在以编程方式配置数据源时没有选择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。*样式不起作用?而我能做些什么呢?

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


阅读 809

收藏
2020-05-30

共1个答案

小编典典

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

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

该部分文档说明了基本属性(spring.datasource)和数据源绑定(spring.datasource.xyz.*)之间的区别。

无论如何,如果要创建DataSource自己(为什么?),请使用单独的名称空间。重用spring.datasource名称空间非常令人困惑,因为用户期望自动配置提供的功能会得到尊重。由于您正在编写自己的配置,因此不会。

2020-05-30