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

JDBC 连接 Oracle 11G 问题小记
因公司运维那边将 Oracle 换成了 11.2 的版本,运行JDBC程序后一直提示异常信息:

ORA-12505, TNS:listener does not currently know of SID given in connect descriptor


dataSource配置如下:
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        scope="singleton">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@211.***.***.**:1521:dbpri"/>
        <property name="username" value="dyx" />
        <property name="password" value="dyx" />
        <property name="maxActive" value="100" />
        <property name="maxIdle" value="10" />
        <property name="maxWait" value="60000" />
        <property name="validationQuery" value="select 1 from dual" />
    </bean>

以前使用 oracle10 是没有问题的,估计是因为数据库升级问题,于是发现通过使用 SQL Developer 能够正常连接,可以判断出 Oralce Server 端配置应该是不存在问题。莫非是驱动也需要更新?
于是经过在 oralce 官方一阵摸索之后,发现 oracle 专门为11G提供了JDBC的 driver,地址:
http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html
于是下载了 ojdbc6.jar, 替换了 classes12.jar 后,仍然不能成功,还是上述错误。又返回到JDBC下载页面,看了一下它的 README 发现里面的里面有一个写法是:
//<host>:<port>/<service_name>

于是我将我的 url 改成:
<property name="url" value="jdbc:oracle:thin:@211.***.***.**:1521/dbpri" />

继续 Run ,发现一切正常,难道之所以要这样写是为了区分 Service name 和 SID?因为我发现通过使用 SQL Developer 连接库时,填写其中的 dbpri 其中就有一个选项,是选择 SID 还是 Service name。