Solon v3.0.3

九、数据源的配置与构建

</> markdown

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==)"