事情起因是这样的,小程所在单位的Oracle数据库由原来的单数据库做了集群改造,导致好几个业务系统数据库连接都报错
原因分析
Oracle数据库的JDBC URL格式通常有servicename和sid两种格式,如下:
jdbc:oracle:thin:@hostname:port/servicename
或者
jdbc:oracle:thin:@hostname:port:sid
原来单个数据库采用的是sid的方式,做了集群后使用的是servicename方式,造成了下面的报错提示:
ORA-12516, TNS:listener could not find available handler with matching protocol stack
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
解决方案
一、首先检查oracle配置文件的连接方式是否为服务名(SERVICE_NAME)
DB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.XX.XX)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = DB)
)
)
二、具体业务修改
java代码配置文件 [ : 换成 / ]
url: jdbc:oracle:thin:@IP地址:1521:服务名
改成
url: jdbc:oracle:thin:@IP地址:1521/服务名
kettle 工具
数据库测量连接中,在主机名称前面加上 // , 在数据库名称前面加上 /,如
Tip
当然也有不改动SERVICE_NAME的方式,就是直连数据库某个节点的sid,比如db1和db2做了集群,对外是db,连接方式还是跟原来一样,但是改成db1即可。但是也会存在问题,当db1数据库崩溃了,该业务系统需要切换到db2,所以还是不太建议用这个方式。
请关注我吧,一起来探讨技术的奥秘,交流更多的技术经验!