六种方式注册数据源

最后更新:2024-08-15 10:23:47 | 状态:未完成
(0)静态的数据源可以在配置文件中提前配置好
参考连接池配置参数  不同版本的参数会有所区别,准确参数参考连接池的类属性(就是打开项目中依赖的连接池类的源码看看属性,如HikariDataSource、DruidDataSource)
这里用application.properties配置,yml类似
#一般先有一个默认数据源(并不是主从关系中的主)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.220.100:3306/simple?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.datasource.user-name=root
spring.datasource.password=root

#这里先声明一下都有哪些数据源(用anyline或spring前缀都可以,用anyline在IDEA中会有自动补齐的提示)
anyline.datasource.list=crm,erp
#或
anyline.datasource-list=crm,erp

#为每个数据源设置属性
anyline(或spring).datasource.crm.driver-class-name=com.mysql.cj.jdbc.Driver
anyline(或spring).datasource.crm.url=jdbc:mysql://192.168.220.100:3306/simple_crm?useUnicode=true&characterEncoding=UTF8&useSSL=false
...其他属性

anyline.datasource.erp.driver-class-name=com.mysql.cj.jdbc.Driver
anyline.datasource.erp.url=jdbc:mysql://192.168.220.100:3306/simple_erp?useUnicode=true&characterEncoding=UTF8&useSSL=false
...

(1)在Java中设置连接参数、由spring创建实例
如在运行过程中由用户动态添加数据源

// 这种方式只在写Hello World时用一下看看效果
String url = "jdbc:mysql://192.168.220.100:3306/simple_crm?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
DataSourceHolder.reg("crm", "com.zaxxer.hikari.HikariDataSource", "com.mysql.cj.jdbc.Driver", url, "root", "root");

//生产环境一定要这样,把属性放在Map中注册,因为默认的连接数可能不够用以及更多的微调参数需要设置 
Map<String,?> params = new HashMap();
params.put("driver-class","com.mysql.cj.jdbc.Driver");      //有些示例代码中没有设置driver是因为一些常用的数据库可以识别driver,最好还是写上
params.put("userNmae","root");                              //各种格式都可以user-name
...
JDBCDataSourceHolder.reg("crm", params); 

(2)在Java中创建实例交给spring管理
druid的参数比较多与srping默认数据源的属性差别比较大,就不用挨个确认属性名与类型了,直接在Java中调用setter方法设置
//DataSourceUtil.也提供了创建数据源的方法

DataSource ds = DataSourceUtil.build("com.zaxxer.hikari.HikariDataSource", "com.mysql.cj.jdbc.Driver", url, "root", "root"); 

//或者直接new 一个
DruidDataSource ds2= new DruidDataSource();                 //这里不像上面那样设置连接池class,直接创建实例
ds2.setUrl(url);
ds2.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds2.setUsername("root"); ds2.setPassword("root");
DataSourceHolder.reg("ds2", ds2);
ServiceProxy.service("ds2").query("crm_customer");

(3)临时数据源
有些场景中只是临时用一次,用完之后很长时间空闲,
如果按上面的情况注册数据源,用完之后还需要RuntimeHolder.destroy(key)注销数据源及一系列相关的bean
所以可以临时注册一个用完就不用管了GC会自动回收,参考【临时数据源操作
需要注意临时数据源不支持事务,多线程环境引发冲突

DruidDataSource ds = new DruidDataSource();
ds.setUrl(url);
AnylineService service = ServiceProxy.temporary(ds);
//DataSourceUtil.也提供了创建数据源的方法
ds = DataSourceUtil.build("com.zaxxer.hikari.HikariDataSource", "com.mysql.cj.jdbc.Driver", url, "root", "root"); 
service = ServiceProxy.temporary(ds);

(4)虚拟数据源

有些场景中并没有实际可用的数据源,如需要根据本的MySQL生成PG脚本,但并没有可用的PG环境(几百种数据库不可能都安装一遍)
这时可以直接根据数据库类型创建一个操作这种数据库的service,用这个service执行相关的命令返回针对这个数据库的SQL,测试方法参考【各数据库模拟环境
需要注意虚拟环境下 检测不到表是否已存在,所以在save(Table)时会直接生成create table而不是alter table

AnylineService service = ServiceProxy.service(DatabaseType.MYSQL);
ConfigStore configs = new DefaultConfigStore();
service.querys("crm_user", configs);
List<Run> runs = configs.runs();
for(Run run:runs){
	System.out.println(run.getFinalQuery());
}
Table table = new Table("crm_user");
table.addColumn("ID", "INT");
service.ddl().create(table);
List<String> ddls = table.ddls();
for (String ddl:ddls){
	System.out.println(ddl);
}
(5)如果有多个数据库,可以批量复制(帐号需要操作这些数据库的权限)
//如在同一个数据库实例上有多个数据库(mysql中就是多个schema)
//在已经有一个sso数据源的情况下,可以针对每个数据库复制出一个数据源,数据源的key=数据库名称
List<String> list = JDBCDatasourceHolder.copy("sso");

(6)经集成第三方的数据源anyline启动时会自动加载上下文中的已存在的DataSource,但是如果多个数据源使用同一个DataSource对象,会造成一个service对应多个数据源,参考【集成mybatis动态数据源

切换数据源参考【三种方式切换数据源

首页 最近更新 搜索 提交 回复