Java 如何在Spring中将tomcat连接池属性添加到自定义数据源?
我希望在我的应用程序中有多个Java 如何在Spring中将tomcat连接池属性添加到自定义数据源?,java,spring,tomcat,spring-boot,Java,Spring,Tomcat,Spring Boot,我希望在我的应用程序中有多个数据源。因此,不能依赖Spring的数据源自动配置,必须创建我自己的,如下所示: @Bean @Primary @ConfigurationProperties("spring.datasource.custom") public DataSource primaryDataSource() { return DataSourceBuilder.create().build();
数据源。因此,不能依赖Spring的数据源自动配置,必须创建我自己的,如下所示:
@Bean
@Primary
@ConfigurationProperties("spring.datasource.custom")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
spring.datasource.custom.url=jdbc:mysql://localhost/tablename
spring.datasource.custom.username=root
spring.datasource.custom.password=rootpw
spring.datasource.custom.driver-class-name=com.mysql.jdbc.Driver
#the important part:
spring.datasource.custom.tomcat.test-on-borrow=true
spring.datasource.custom.tomcat.validation-query=SELECT 1
@Bean
@Primary
@ConfigurationProperties("spring.datasource.custom")
public DataSourceProperties primaryDataSourceProperties() {
return new DataSourceProperties;
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource.custom.tomcat")
public DataSource primaryDataSource() {
return primaryDataSourceProperties().initializeDataSourceBuilder().build();
}
问题:未自动拾取.tomcat.
属性
问题:如何将它们放入数据源中?您需要创建多个数据源bean,其中一个是@Primary
,您可以像这样设置tomcat连接池属性
@Value("${spring.datasource.custom.tomcat.validation-query}")
private String validationQuery;
@Value("${spring.datasource.custom.tomcat.test-on-borrow}")
private boolean onBorrow;
org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
ds.setValidationQuery(validationQuery);
ds.setTestOnBorrow(onBorrow);
而不是返回DataSourceBuilder.create().build()代码>您需要返回您在上面创建的数据源我通过org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Tomcat类查看spring boot是如何实现的,这非常简单
例如:
@Bean
@Primary // or @Qualifier("foobar")
@ConfigurationProperties("foobar.datasource")
DataSourceProperties foobarDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary // or @Qualifier("foobar")
@ConfigurationProperties("foobar.datasource.tomcat")
public org.apache.tomcat.jdbc.pool.DataSource foobarDataSource(DataSourceProperties properties) {
org.apache.tomcat.jdbc.pool.DataSource dataSource = createDataSource(properties, org.apache.tomcat.jdbc.pool.DataSource.class);
DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl());
String validationQuery = databaseDriver.getValidationQuery();
if (validationQuery != null) {
dataSource.setTestOnBorrow(true);
dataSource.setValidationQuery(validationQuery);
}
return dataSource;
}
@SuppressWarnings("unchecked")
protected <T> T createDataSource(/*@Qualifier("foobar")*/ DataSourceProperties properties, Class<? extends DataSource> type) {
return (T) properties.initializeDataSourceBuilder().type(type).build();
}
@Bean
@主//或@Qualifier(“foobar”)
@ConfigurationProperties(“foobar.datasource”)
数据源属性foobarDataSourceProperties(){
返回新的数据源属性();
}
@豆子
@主//或@Qualifier(“foobar”)
@ConfigurationProperties(“foobar.datasource.tomcat”)
public org.apache.tomcat.jdbc.pool.DataSource foobarDataSource(DataSourceProperties属性){
org.apache.tomcat.jdbc.pool.DataSource DataSource=createDataSource(属性,org.apache.tomcat.jdbc.pool.DataSource.class);
DatabaseDriver DatabaseDriver=DatabaseDriver.fromJdbcUrl(properties.determineUrl());
String validationQuery=databaseDriver.getValidationQuery();
if(validationQuery!=null){
dataSource.settstonbrow(true);
setValidationQuery(validationQuery);
}
返回数据源;
}
@抑制警告(“未选中”)
受保护的T createDataSource(/*@Qualifier(“foobar”)*/DataSourceProperties属性,类,在application.properties中具有以下行:
spring.datasource.custom.url=jdbc:mysql://localhost/tablename
spring.datasource.custom.username=root
spring.datasource.custom.password=rootpw
spring.datasource.custom.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.custom.type=org.apache.tomcat.jdbc.pool.DataSource
#the important part:
spring.datasource.custom.tomcat.test-on-borrow=true
spring.datasource.custom.tomcat.validation-query=SELECT 1
您的配置bean应该如下所示:
@Bean
@Primary
@ConfigurationProperties("spring.datasource.custom")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
spring.datasource.custom.url=jdbc:mysql://localhost/tablename
spring.datasource.custom.username=root
spring.datasource.custom.password=rootpw
spring.datasource.custom.driver-class-name=com.mysql.jdbc.Driver
#the important part:
spring.datasource.custom.tomcat.test-on-borrow=true
spring.datasource.custom.tomcat.validation-query=SELECT 1
@Bean
@Primary
@ConfigurationProperties("spring.datasource.custom")
public DataSourceProperties primaryDataSourceProperties() {
return new DataSourceProperties;
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource.custom.tomcat")
public DataSource primaryDataSource() {
return primaryDataSourceProperties().initializeDataSourceBuilder().build();
}
我当前的Spring启动版本是1.5.18,但是我不能仅仅依靠配置的Spring.datasource.custom.tomcat=
属性吗?例如,如果我添加了连接池属性,比如Spring.datasource.custom.tomcat.max active=
,对于默认的数据源,Spring会自动获取那些tomcat属性。H我现在如何将这些属性分配给我的自定义数据源?我的意思是,在自动配置期间依赖单个数据源时,spring autoconfigure如何将这些tomcat属性添加到ds?您可以自动连接这些属性(使用@Value
)在创建数据源并使用这些数据源的bean中。只有在使用默认数据源且属性与spring指定的完全匹配时,Springboot才会选择值。如果创建类似spring.datasource.custom.tomcat.max-activeOk这样的属性,spring将不会选择。您知道在哪里可以找到spring auto-con吗在正常的自动配置启动过程中读取.tomcat*
属性的配置?因此,也许我可以继承或复制粘贴它们使用的代码。检查DataSourceAutoConfiguration
Spring似乎是通过反射在AbstractPropertyAccessor.setPropertyValues()内设置tomcat属性
。因此,可能唯一的机会就是通过@Value'注入参数,并在tomcat
数据源上显式设置它们。。。