六种方式注册数据源
最后更新:2024-08-15 10:23:47
|
状态:未完成
(0)静态的数据源可以在配置文件中提前配置好
参考连接池配置参数 不同版本的参数会有所区别,准确参数参考连接池的类属性(就是打开项目中依赖的连接池类的源码看看属性,如HikariDataSource、DruidDataSource)
这里用application.properties配置,yml类似
参考连接池配置参数 不同版本的参数会有所区别,准确参数参考连接池的类属性(就是打开项目中依赖的连接池类的源码看看属性,如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动态数据源】
切换数据源参考【三种方式切换数据源】