1. 功能描述

在平台中,我们可能需要访问第三方的库,比如在自定义SQL查询中,自定义SQL服务是在jpaas-system下面的。这个时候我们通过自定义SQL访问JPAAS-USER下面的表数据。因为数据数据库是隔离的,这个时候我们就需要使用数据源,访问到第三方的数据库。

2. 实现原理

在分布式的环境中,我们的数据源配置如果存在与JPAAS-SYSTEM的微服务应用,那么其他的微服务如果希望使用数据源,那么jpaas-system微服务应用必须先起来,这样所有的系统都必须依赖于jpaas-system。

在平台中为了解决这个问题,在创建数据源的时候,我们会把数据源的配置信息发布到nacos。
其他的系统在启动时,通过读取nacos,就可以动态的在本地的微服务创建相应的数据源出来。

3. 操作步骤

3.1 添加数据源

点击菜单 单据中心 -> 辅助工具 —>数据源管理

点击添加数据源

属性 备注
数据源名称 这个定义一个有意义的名称
别名 这个需要在系统中保持唯一性
是否使用 勾选则启用
启动时初始化 在启动时初始化数据库连接池
微服务列表 这个的意思是,这个配置在哪些服务上进行使用,比如勾选了jpaas-form,那么在 jpaas-form 启动时,加载这个数据源
数据类型 这个数据源使用那种类型的数据库

连接池参数

参数 备注
url 数据库连接,这个需要根据实际情况更改
username 用户名
password 连接密码
driver-class-name 驱动名称
connection-init-sqls 初始连接时执行的SQL,默认可为空
initialSize 连接池初始化大小 (理论上这个不用设置太大,比如CPU为8核16线程,两个硬盘 就配置成 16 +2 =18) 就可以了
minIdle 连接池中的最小空闲连接数,Druid会定时扫描连接池的连接,如果空闲的连接数大于该值,则关闭多余的连接,反之则创建更多的连接以满足最小连接数要求,一般和 initialSize一样就可以了
maxActive 连接池最大的数 这个其实我们将这个和 initialSize 配置成一样即可,在启动时就创建好全部的连接,不用中途再创建,提升性能
maxWait 从连接池中获取连接池的最大等待时间 单位 为毫秒
timeBetweenEvictionRunsMillis 检查连接是否有效时间间隔 单位 为毫秒
minEvictableIdleTimeMillis 配置一个连接在池中最小生存的时间,单位是毫秒
validationQuery 校验连接的查询,mysql配置 为 select 1,oracle 配置为 select 1 from dual
testWhileIdle 开启空闲时检查连接可用性
testOnBorrow 开启在获取连接时,验证连接的可用性
testOnReturn 连接返回连接池时校验连接可用性
poolPreparedStatements 打开PSCACHE 默认为true
maxPoolPreparedStatementPerConnectionSize PSCACHE大小
filters durid 插件 ,默认即可

3.2 检查nacos 配置

在nacos 中我们找到 datasource.json 配置


可以查看他的配置

3.3 验证连接池可用性

例如在上面添加的微服务 为 jpaas-bpm 。

我们可以在微服务中找到 jpaas-bpm 的服务端口。

点击详情连接。

在地址栏输入

http://192.168.1.77:7301/druid/

需要输入用户名和密码,这个可以找到nacos 配置。

使用这个用户名和密码登录。

从这里可以看到我们创建的数据源,我们就验证了数据源是有效的。

3.4 如何使用数据源

3.4.1 动态切换数据源

应为在启动的时候,我们实际上时将数据源注册到了系统的 动态数据源中。这样我们可以通过代码对数据源进行切换。

即在访问数据库时,先切换数据源。

数据源切换工具类:

com.redxun.datasource.DataSourceContextHolder

方法说明:

方法 备注
void setDataSource(String alias) 使用数据源别名进行切换
void setDefaultDataSource() 使用默认的数据源
String getDataSource() 获取当前的数据源,这个动态数据调用。
void clearDataSource() 清除数据源

测试用例:

  1. @Service
  2. public class DatasourceServiceImpl {
  3. @Resource
  4. JdbcTemplate jdbcTemplate;
  5. @GlobalTransactional
  6. public void insertDemo(){
  7. String id=IdGenerator.getIdStr();
  8. String sql="insert into demo (id,name,address) values ('" + id +"','RAY','GUANGZHOU')";
  9. DataSourceContextHolder.setDataSource("jpaas_form");
  10. jdbcTemplate.execute(sql);
  11. DataSourceContextHolder.setDataSource("jpaas_bpm");
  12. jdbcTemplate.execute(sql);
  13. sql="insert into demo (id,name,address) values ('" + IdGenerator.getIdStr() +"','RAY','GUANGZHOU')";
  14. DataSourceContextHolder.setDataSource("jpaas_form");
  15. jdbcTemplate.execute(sql);
  16. }
  17. }

这样我们可以很方便的切换数据源,并实现事务。

3.4.2 通过CommonDao 访问

  1. /**
  2. * 根据别名数据源执行SQL语句。
  3. * @param alias 数据源源别名
  4. * @param sql 需要执行的sql
  5. */
  6. public int execute(String alias,String sql)
文档更新时间: 2020-10-07 21:22   作者:zhuyunyun