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() | 清除数据源 |
测试用例:
@Service
public class DatasourceServiceImpl {
@Resource
JdbcTemplate jdbcTemplate;
@GlobalTransactional
public 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)