九、数据源的配置与构建
Solon 是强调多数据源的框架,可用两种方式构建数据源的托管 Bean(效果相同):
- 使用
@Bean
方法构建(自己随意配置) - 使用
solon.dataSources
特定配置格式自动构建
1、使用@Bean
方法构建
添加配置。配置名随意,与 @Bean
函数的注入对上就可以(就是普通托管对象的构建方式)。
demo.db_order: #数据源
driverClassName: "xx"
jdbcUrl: "xxx"
username: "xxx"
paasword: "xxx"
demo.db_user: #动态数据源
strict: true #是否严格的
default: db_user_r #指定默认的内部数据源
db_user_r: #内部数据源1
dataSourceClassName: "com.zaxxer.hikari.HikariDataSource"
driverClassName: "xx"
jdbcUrl: "xxx" #属性名要与 type 类的属性对上
username: "xxx"
paasword: "xxx"
db_user_w: #内部数据源2
dataSourceClassName: "com.zaxxer.hikari.HikariDataSource"
driverClassName: "xx"
jdbcUrl: "xxx" #属性名要与 type 类的属性对上
username: "xxx"
paasword: "xxx"
demo.db_log: #分片数据源
file: "classpath:sharding.yml"
添加 Java 配置类。注意 @Inject
对应的配置名,相关的属性配置要与对应的注入类有关。
@Configuration
public class DsConfig {
@Bean(name="db_order", typed=true)
public DataSource db_order(@Inject("${demo.db_order}") HikariDataSource ds){
return ds;
}
@Bean("db_user")
public DataSource db_user(@Inject("${demo.db_user}") DynamicDataSource ds){
return ds;
}
@Bean("db_log")
public DataSource db_log(@Inject("${demo.db_log}") ShardingDataSource ds){
return ds;
}
}
2、使用 solon.dataSources
特定配置格式自动构建(v2.9.0 后支持)
根据配置自动构建,是“使用 Java 配置类进行构建”方式的自然演化。
(1)格式说明
配置以 solon.dataSources
开头(注意是以"s"结尾的,强调多数据源特性),内容为 Map
结构。格式如下:
solon.dataSources:
name1!:
class: "....DataSource"
prop..: ...
name2:
class: "....DataSource"
prop...: ...
说明:
name*
表示数据源注册到容器的名字(例如:db_user, db_order)name*!
(加!
号)表示还要按类型注册到容器,相当于默认(只能有一个)。使用或关联时,仍是name*
class
表示数据源的类名(必须是 DataSource 接口的实现类)prop...
表示数据源的属性配置(需要什么属性,要看 class 的需求)
(2)配置示例
有自动构建支持后。相当于省去了 Java 的配置类代码。其中 DynamicDataSource 由插件solon-data-dynamicds 提供。
solon.dataSources:
"db_order!": #数据源(!结尾表示 typed=true)
class: "com.zaxxer.hikari.HikariDataSource"
driverClassName: "xx"
jdbcUrl: "xxx"
username: "xxx"
paasword: "xxx"
"db_user": #动态数据源
class: "org.noear.solon.data.dynamicds.DynamicDataSource"
strict: true #是否严格的
default: db_user_r #指定默认的内部数据源
db_user_r: #内部数据源1
dataSourceClassName: "com.zaxxer.hikari.HikariDataSource"
driverClassName: "xx"
jdbcUrl: "xxx" #属性名要与 type 类的属性对上
username: "xxx"
paasword: "xxx"
db_user_w: #内部数据源2
dataSourceClassName: "com.zaxxer.hikari.HikariDataSource"
driverClassName: "xx"
jdbcUrl: "xxx" #属性名要与 type 类的属性对上
username: "xxx"
paasword: "xxx"
"db_log": #分片数据源
class: "org.noear.solon.data.shardingds.ShardingDataSource"
file: "classpath:sharding.yml"
(3)如何获取数据源?
以上配置,会构建一批 DataSource 的托管 bean。之后即可通过 AppContext 接口 获取:
- 获取具体名字的数据源(如果要获取默认数据源,则采用类型注入与获取的方式即可)
//1.注入方式
@Inject("db_order")
DataSource db_order;
//2.异步获取方式
Solon.context().getBeanAsync("db_order", bean->{
//...
});
//或者
Solon.context().getWrapAsync("db_order", bw->{
//bw.name(); //数据源名字
//bw.typed(); //是否申明以类型注册的(相当于默认)
//bw.raw(); //原始 DataSource 实例
});
//3.同步获取方式(要注意时机点)
DataSource db_order = Solon.context().getBean("db_order");
- 获取一批数据源
//1.注入方式
@Inject
Map<String, DataSource> dsMap;
//2.订阅获取方式(可以源源不断,实时获取新建构的数据源)
Solon.context().subWrapsOfType(DataSource.class, bw->{
//bw.name(); //数据源名字
//bw.typed(); //是否申明以类型注册的(相当于默认)
//bw.raw(); //原始 DataSource 实例
});
//3.同步获取方式(要注意时机点)
Map<String, DataSource> dsMap = Solon.context().getBeansMapOfType(DataSource.class);
应用开发时,一般不会直接使用数据源对象,而是使用 ORM 的特定对象及增强注解。
(4)支持带加密配置(支持定制算法)
内置了算法,也可以定制。具体参考 solon-security-vault 插件 的使用
solon.vault:
password: "liylU9PhDq63tk1C"
solon.dataSources:
"db_order!": #数据源(!结尾表示 typed=true)
class: "com.zaxxer.hikari.HikariDataSource"
driverClassName: "xx"
jdbcUrl: "xxx"
username: "ENC(xo1zJjGXUouQ/CZac55HZA==)"
paasword: "ENC(XgRqh3C00JmkjsPi4mPySA==)"