我想在我的应用程序中有多个DataSource
。因此不能依赖 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
问题:不会自动选取.tomcat.*
属性。
问题:我怎样才能让他们进入DataSource
?
您需要创建多个数据源 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);
而不是return DataSourceBuilder.create().build();
您需要返回上面创建的数据源 u
在 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 DataSourceProperties primaryDataSourceProperties() {
return new DataSourceProperties;
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource.custom.tomcat")
public DataSource primaryDataSource() {
return primaryDataSourceProperties().initializeDataSourceBuilder().build();
}
我当前的 Spring 引导版本是 1.5.18
我通过 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();
}
并且此属性将被拾取:
foobar.datasource.tomcat.test-on-borrow=false
foobar.datasource.tomcat.test-while-idle=true
foobar.datasource.tomcat.validation-interval=5000
foobar.datasource.tomcat.<whateve other props tomcat's pool accepts>=xxx