今天看到程序报错,无法获取连接,怀疑和数据库早上出问题有关,查看了代码连接方式,发现竟然连接的是ORAC中的一台,而恰恰出事情的那台就是程序连接的那一台。
数据库的部署有单实例和RAC的情况,单实例比较简单,使用SID连接;RAC 有多个实例来增加并发和负载,RAC时TNS一般配置的是Server Name,RAC节点根据Server情况自动跳到合适的SID。对于RAC的情况,有各自的实例,此时连接数据库可以找到RAC下的SID,选择其中的一个单独的SID进行连接,也可以直接改变连接方式使用RAC的连接方式进行连接。
问题一:为何程序连接是单节点?
这个问题要从这个报错说起
Caused by: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
spring 连接池如下配置
driverClassName: oracle.jdbc.driver.OracleDriver url: jdbc:oracle:thin:@10.50.10.9:1521:PQDB username: * password: 1100@* test-on-borrow: true validation-query: select 1 from dual test-while-idle: true max-idle: 5 max-wait: 10000 min-idle: 1 initial-size: 5 max-active: 80
这样的配置程序报错 ORA-12505。原因有2点
1、问题出在第二行URL,在连接ORAC时,一定要注意是用service_name,而不是SID,两者区别。(有效避免单节点故障)
2、serviceName前面的分割符应该用 "/"而非“:”。(主要问题,一般来说SID之一就是serviceName,除非是专门修改配置)
于是将第二行的URL改为,就可以了。
url: jdbc:oracle:thin:@10.50.10.9:1521/PQMDB