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() | 清除数据源 |
测试用例:
@Servicepublic class DatasourceServiceImpl {@ResourceJdbcTemplate jdbcTemplate;@GlobalTransactionalpublic void insertDemo(){String id=IdGenerator.getIdStr();String sql="insert into demo (id,name,address) values ('" + id +"','RAY','GUANGZHOU')";DataSourceContextHolder.setDataSource("jpaas_form");jdbcTemplate.execute(sql);DataSourceContextHolder.setDataSource("jpaas_bpm");jdbcTemplate.execute(sql);sql="insert into demo (id,name,address) values ('" + IdGenerator.getIdStr() +"','RAY','GUANGZHOU')";DataSourceContextHolder.setDataSource("jpaas_form");jdbcTemplate.execute(sql);}}
这样我们可以很方便的切换数据源,并实现事务。
3.4.2 通过CommonDao 访问
/*** 根据别名数据源执行SQL语句。* @param alias 数据源源别名* @param sql 需要执行的sql*/public int execute(String alias,String sql)