SpringBootMyBatisUCP实现多数据源切换
防火墙配置
Oracle数据库端默认ONS TCP端口是 6200。应用部署的机器需要能够访问数据库节点的6200端口。可以运行 telnet检查一下: telnet <数据库IP> 6200组件版本信息
SpringBoot
spring-boot-starter-xxx
2.1.7
MyBatis
mybatis-spring-boot-starter
2.1.4
Dynamic Datasource
dynamic-datasource-spring-boot-starter
3.6.1
UCP
ojdbc8-production
21.9.0.0
… …
UCP POM配置
UCP连接池配置方法
此项目中使用的是SpringBoot 2.1.x版本,需要手工创建UCP数据源。方法如下:
首先创建一个UCPDataSource.java的配置类 (类名可随意)。实现非常简洁,就是指定UCP在配置文件中的配置项,以及创建UCP实例。
如下截图中,创建了两个UCP数据源:ncmsobs和ncmsccs,然后将它们加入了Dynamic Datasource的数据源列表中,并指定ncmsobs为主数据源:
对应的配置文件(application.properties)如下 (注意不要再包含dynamic 了,即不要再指定成spring.datasource.dynamic .xxx这个格式了,避免造成混淆):
如此,在代码中就可以实现不同的类/方法使用不同的数据源了,如:
注意,如果需要实现当数据库节点切换时对应用是透明的 (即透明应用连续性特性,又即Transparent Application Continuity,简称 TAC),URL中指定的服务名需要指定为是具有TAC属性的服务:-- URL注意事项: -- DB端创建具有TAC属性服务srv_tac: srvctl add service -db orcl_icn1s6 -pdb pdb1 -service srv_tac -preferred orcl1 -available orcl2 -failover_restore AUTO -failoverretry 1 -failoverdelay 3 -commit_outcome TRUE -failovertype AUTO -replay_init_time 600 -retention 86400 -notification TRUE -drain_timeout 300 -stopoption IMMEDIATE -- 用下面URL(注意要用scan,以及上面创建好的服务srv_tac): url=jdbc:oracle:thin:@(DESCRIPTION = (CONNECT_TIMEOUT=120) (RETRY_COUNT=20)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)(ADDRESS_LIST =(LOAD_BALANCE=on)(ADDRESS = (PROTOCOL = TCP)(HOST=rac-scan)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME = srv_tac))) -- 可以用sqlplus测试连通性: sqlplus user_name/"user_password"@"(DESCRIPTION = (CONNECT_TIMEOUT=120) (RETRY_COUNT=20)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)(ADDRESS_LIST =(LOAD_BALANCE=on)(ADDRESS = (PROTOCOL = TCP)(HOST=rac-scan)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME = srv_tac)))"
以上就完成了UCP在SpringBoot 2.1.x中的配置。
附DB端模拟节点故障的方法:--------------------------------
- 测试DB相关命令:
--------------------------------
--查看服务(srv_tac)以及DB状态:
srvctl status database -thishome -verbose
--模拟节点故障: 在服务srv_tac所运行的节点上,找到pmon进程ID并kill。
ps -ef | grep -i pmon
kill pmon进程ID
--再次查看服务(srv_tac)以及DB状态:
srv_tac所在节点会停止,然后又会重新启动。
服务srv_tac会自动转到另一个节点.
--测试完后,可以用下面命令再把服务srv_tac relocate回先前节点:
srvctl relocate service -db orcl_icn1s6 -oldinst orcl2 -newinst orcl1