Spring官方文档给出了多数据配置示例(https://docs.spring.io/spring-boot/docs/2.4.2/reference/htmlsingle/#howto-two-datasources),但是比如用默认的HikariCP(https://github.com/brettwooldridge/HikariCP),对一些优化配置参数并不能生效。
默认单数据源配置
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
hikari:
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 500
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
rewriteBatchedStatements: true
cacheResultSetMetadata: true
cacheServerConfiguration: true
elideSetAutoCommits: true
maintainTimeStats: false
下面的例子,提供了多数据源情况下,如何配置HikariCP的DataSourceProperties。
自定义HikariCP的DataSourceProperties的Configuration Properties
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public class HikariProperties {
private Map<String, Object> dataSourceProperties;
public Map<String, Object> getDataSourceProperties() {
return dataSourceProperties;
}
public void setDataSourceProperties(Map<String, Object> dataSourceProperties) {
this.dataSourceProperties = dataSourceProperties;
}
}
在Application中激活上面的配置
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.reactive.function.client.WebClient;
import cn.ydyun360.common.config.HikariProperties;
@EnableDiscoveryClient
@SpringBootApplication
@EnableCaching
@EnableConfigurationProperties(HikariProperties.class)
@ComponentScan("")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
job数据源配置
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import com.zaxxer.hikari.HikariDataSource;
import cn.ydyun360.common.config.HikariProperties;
@Configuration
public class JobJpaConfig {
@Bean
@ConfigurationProperties("spring.datasource.job")
@Primary
public DataSourceProperties jobDataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = "jobDataSource")
@ConfigurationProperties("spring.datasource.job.configuration")
@Primary
public HikariDataSource jobDataSource(HikariProperties hikariProperties) {
var dataSource = jobDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
for (var entry : hikariProperties.getDataSourceProperties().entrySet()) {
dataSource.addDataSourceProperty(entry.getKey(), entry.getValue());
}
return dataSource;
}
@Bean(name = "jobJdbcTemplate")
@Primary
public JdbcTemplate jdbcTemplate(HikariProperties hikariProperties) {
var ds = jobDataSource(hikariProperties);
return new JdbcTemplate(ds);
}
}
goods数据源配置
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import com.zaxxer.hikari.HikariDataSource;
import cn.ydyun360.common.config.HikariProperties;
@Configuration
public class GoodsJpaConfig {
@Bean
@ConfigurationProperties("spring.datasource.goods")
public DataSourceProperties goodsDataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = "goodsDataSource")
@ConfigurationProperties("spring.datasource.goods.configuration")
public HikariDataSource goodsDataSource(HikariProperties hikariProperties) {
var dataSource = goodsDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
for (var entry : hikariProperties.getDataSourceProperties().entrySet()) {
dataSource.addDataSourceProperty(entry.getKey(), entry.getValue());
}
return dataSource;
}
@Bean(name = "goodsJdbcTemplate")
public JdbcTemplate jdbcTemplate(HikariProperties hikariProperties) {
return new JdbcTemplate(goodsDataSource(hikariProperties));
}
@Bean(name = "goodsNamedParameterJdbcTemplate")
public NamedParameterJdbcTemplate goodsNamedParameterJdbcTemplate(HikariProperties hikariProperties) {
return new NamedParameterJdbcTemplate(jdbcTemplate(hikariProperties));
}
}
配置文件
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
hikari:
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 500
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
rewriteBatchedStatements: true
cacheResultSetMetadata: true
cacheServerConfiguration: true
elideSetAutoCommits: true
maintainTimeStats: false
job:
driverClassName: com.mysql.cj.jdbc.Driver
goods:
driverClassName: com.mysql.cj.jdbc.Driver
网友评论