问题描述:
之前给开发在生产环境新建了数据库用户,今天开发反映测试连接的时候无法从web服务器端连接到数据库。
报错如下:
java.sql.SQLException: Listener refused the connection withthe following error:
ORA-12505, TNS:listener does not currently know of SID givenin connect descriptor
The Connection descriptor used by the clientwas:
ip:1521:abcd (不是实际的配置)
atoracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
atoracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:260)
atoracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:386)
atoracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:419)
atoracle.jdbc.driver.T4CConnection.(T4CConnection.java:164)
atoracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:34)
atoracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:752)
web服务器端的应用连接配置:(不是实际的配置)
jdbc.url=jdbc:oracle:thin:@ip:1521:abcd
jdbc.username=username
jdbc.password=xxxxx
问题分析:
首先先用上面的用户名密码在本地用plsql developer进行登录测试,可以登录。
说明密码没有问题。
然后上网查一下ora-12505的解决方法,大部分都是说要改listener.ora的配置。
由于是生产库,肯定不行。
后来想到,这个生产库是rac结构,有两个节点,开发在连接配置中的abcd实际上是service_name,
而不是sid_name。而实际的sid是abcd1和abcd2,所以在连接的时候会报无法识别sid的错误。
问题解决:
所以只需要在连接配置中指定service_name。
使用如下连接配置即可:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ip地址)(PORT=1521))(CONNECT_DATA=
(SERVER=DEDICATED)(SERVICE_NAME=abcd)))
使用完整的连接串来指定service_name就能成功连接了。