💥Spring Data JDBC 如何配置多数据源??
⚡️作为一个Java开发者,如果经常关注Spring社区的话,会发现一个持久层框架,Spring Data JDBC,只需简单的配置数据源,一个注解,一个接口,就能够直接访问数据库,并且配合IDEA内置的插件,能够在反射阶段根据方法名自动的生成对应的SQL,对于一些轻量级的服务,能够很好的起到开箱即用的功能,那么对于这一套框架,如何配置多数据源呢?
⚡️下面的Demo,博主用了两个数据源,分别为sexytea-pro-rd
和sexytea-test-all
两个。
⚡️首先先上配置文件application.yml
:
spring:
datasource:
# 生产库只读
sexytea-pro-rd:
jdbc-url: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
username: xxxxxxxxxxxxxxxxxxxxxxxxxxx
password: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 10000
pool-name: sexytea
driver-class-name: com.mysql.cj.jdbc.Driver
data-source-properties:
connectTimeout: 3000
socketTimeout: 10000
# 开发测试库
sexytea-test-all:
jdbc-url: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
username: xxxxxxxxxxxxxxxxxxxxx
password: xxxxxxxxxxxxxxxxxxxxxx
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 10000
pool-name: sexytea
driver-class-name: com.mysql.cj.jdbc.Driver
data-source-properties:
connectTimeout: 3000
socketTimeout: 10000
⚡️数据源一:SexyTeaProdSourceonfig
/**
* 生产只读库数据源配置
* @author Cocowwy
* @create 2021-09-09-11:55
*/
@Configuration
@EnableJdbcRepositories(jdbcOperationsRef = "sexyteaProdNamedParameterJdbcOperations",
basePackages = "com.sexytea.xxxxxx.repository.sexyteapro")
public class SexyTeaProdSourceonfig extends AbstractJdbcConfiguration {
@Bean("sexyteaProdDataSource")
@ConfigurationProperties(prefix = "spring.datasource.sexytea-pro-rd")
public DataSource sexyteaDataSource() {
return DataSourceBuilder.create()
.build();
}
@Bean("sexyteaProdNamedParameterJdbcOperations")
public NamedParameterJdbcOperations sexyteaNamedParameterJdbcOperations(@Qualifier("sexyteaProdDataSource") DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
@Bean
public DataAccessStrategy sexyteaProdDataAccessStrategy(@Qualifier("sexyteaProdNamedParameterJdbcOperations") NamedParameterJdbcOperations operations,
JdbcConverter jdbcConverter, JdbcMappingContext context, Dialect dialect) {
return new DefaultDataAccessStrategy(new SqlGeneratorSource(context, jdbcConverter, dialect), context,
jdbcConverter, operations);
}
}
⚡️数据源二:SexyTeaTestSourceConfig
/**
* 开发测试库只读配置
* @author Cocowwy
* @create 2021-09-09-11:54
*/
@Configuration
@EnableJdbcRepositories(jdbcOperationsRef = "sexyteaTestNamedParameterJdbcOperations",
basePackages = "com.sexytea.xxxxxx.repository.sexyteatest")
public class SexyTeaTestSourceConfig extends AbstractJdbcConfiguration {
@Primary
@Bean("sexyteaTestDataSource")
@ConfigurationProperties(prefix = "spring.datasource.sexytea-test-all")
public DataSource sexyteaDataSource() {
return DataSourceBuilder.create()
.build();
}
@Primary
@Bean("sexyteaTestNamedParameterJdbcOperations")
public NamedParameterJdbcOperations sexyteaNamedParameterJdbcOperations(@Qualifier("sexyteaTestDataSource") DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
@Bean
public DataAccessStrategy sexyteaTestDataAccessStrategy(@Qualifier("sexyteaTestNamedParameterJdbcOperations") NamedParameterJdbcOperations operations,
JdbcConverter jdbcConverter, JdbcMappingContext context, Dialect dialect) {
return new DefaultDataAccessStrategy(new SqlGeneratorSource(context, jdbcConverter, dialect), context,
jdbcConverter, operations);
}
}
⚡️实体类entity
/**
* @author Cocowwy
* @create 2021-09-09-14:49
*/
@Data
@Builder
@Table("t_order")
public class Order {
@Id
@Column("f_id")
private Long id;
//......字段忽略~
}
⚡️Repository
package com.sexytea.xxxxxx.repository.sexyteapro;
/**
* @author Cocowwy
* @create 2021-09-09-14:47
*/
public interface OrderProdRepository extends CrudRepository<Order, Long> {
//......
}
package com.sexytea.xxxxxx.repository.sexyteatest;
/**
* @author Cocowwy
* @create 2021-09-09-14:50
*/
public interface OrderTestRepository extends CrudRepository<Order, Long> {
//......
}
⚡️目录结构:
⚡️保持EnableJdbcRepositories的basePackages指定的包名格式一致,即该包下的Repository接口均路由到指定的数据源上面
到此,基于SpringDataJDBC的多数据源已经配置完成💥~