日期:2014-05-16  浏览次数:20486 次

PL/SQL连接数据库成功,JDBC却不行

?????? 搞了半下午的问题终于突破了。

???????用JAVA的JDBC连接ORACLE数据库,始终建立不了连接,驱动、用户名、密码都没问题。而奇怪的是用PL/SQL能连接上,查监听也没问题。但也应该不是JAVA的问题,第一:JAVA就是一个连接数据库,没有什么高深的技术,很简单的连接;第二:当前这程序在公司及在上一家客户那都能正常运行,且用的好好的,从来都没这方面的问题;第三:现在有些数据库连接不上,但有些数据库却能连接成功。
????? 最后发现是URL的问题,我的url是这样的jdbc.url=jdbc:oracle:thin:@192.8.190.1:1521:sznspos。注意这个sznspos,它是一个数据库名,问题也就出在这里。以前不知道,以为这是没问题的。其实不然,对于jdbc来说,这里不应该是数据库名,而应该是数据库的sid_name。对于PLSQL和SQLPlus来说,则只要是数据库名就好。大概以前的sid_name和数据库名一样,而没有注意到。于是,错误写法导致了如下错误:

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
The Connection descriptor used by the client was:
192.8.190.1:1521:sznspos

修正后的url应该是jdbc:oracle:thin:@192.8.190.1:1521:sznspdb,这个sznspdb是数据库的sid_name,链接成功。


附:

查询当前数据库名
方法一:select name from v$database;
方法二:show parameter db
方法三:查看参数文件

?

查询当前数据库实例名(sid_name)
方法一:select instance_name from v$instance;
方法二:show parameter instance
方法三:在参数文件中查询

?

查询数据库域名
方法一:select value from v$parameter where name = 'db_domain';
方法二:show parameter domain
方法三:在参数文件中查询

?

查询数据库服务名
方法一:select value from v$parameter where name = 'service_name';
方法二:show parameter service_name
方法三:在参数文件中查询