Java Web应用与Oracle连接问题
1. 概况
刚安装的Java Web应用连接不到数据库,初步判断是数据库连接字符串没有正确配置。通常在Tomcat中可以通过配置WEB-INF下的l或者l文件来修改数据库连接字符串。
后询问高手,在Tomcat自身路径下也有配置文件:
%TOMCAT%\conf\Catalina\localhost\%APPNAME%.xml
修改数据库连接字符串中的IP和SID
<?xml version="1.0" encoding="UTF-8"?>
<Context
    workDir="work/Catalina/localhost/LogisticCall">
  <Resource
    auth="Container"
    description="SqlServer Datasource "
    name="jdbc/logisticcallsource"
    type="javax.sql.DataSource"
    password="135246"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    maxIdle="2"
    maxWait="5000"
    username="orclfl"
    url="jdbc:oracle:thin:@10.96.149.65:1521:dlwl"
    maxActive="4"/>
</Context>
刷新页面,仍然报错无法连接:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
The Connection descriptor used by the client was:
10.96.149.65:1521:DLWL
)
2. 探索
使用WireShark侦听网络传输内容,对比PL/SQL和JDBC连接不同。
2.1. PL/SQL Dev传送的连接字符串
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.96.149.66)(PORT=1521))(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=dlwl)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRIES=180)(DELAY=5))
(CID=(PROGRAM=E:\apps\PLSQL Developer 9.0.0.)
(HOST=PC-XK)(USER=Administrator))(INSTANCE_NAME=dlwl1)))
2.2. JDBC传送的连接字符串
(DESCRIPTION=(CONNECT_DATA=(SID=DLWL)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=)))(ADDRESS=(PROTOCOL=tcp)(HOST=10.96.149.65)(PORT=1521)))
错误提示如下
(DESCRIPTION=(TMP=)(VSNNUM=169869568)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
基本判定是连接字符串中的SID和ServiceName导致的差异。
查询了相关资料,猜测可能是ojdbc14.jar的版本导致的问题,程序中的版本为"10.2.0.3.0",相对较新,不存在问题。
3. SID和ServiceName
oracle建立数据库连接转而以“数据库连接字符串”为关键字查询资料
参考:hi.baidu/gladfeel/blog/item/739a82ee0cbbb4092cf534f0.html
JDBC Thin Driver 的格式有三种格式:
3.1. 格式一:  ServiceName:
jdbc:oracle:thin:@//<host>:<port>/<service_name>
Example: jdbc:oracle:thin:@//192.168.115.1:1521/db
注意这里的格式,@后面有//, 这是与使用SID的主要区别。
这种格式是Oracle 推荐的格式,因为对于集来说,每个节点的SID 是不一样的,但是SERVICE_NAME 确可以包含所有节点。
3.2. 格式二: SID:
jdbc:oracle:thin:@<host>:<port>:<SID>
Example: jdbc:oracle:thin:192.168.112.1:1521:XXX
Note: Support for SID is being phased out. Oracle recommends that users switch over to usingservice names.
3.3. 格式三:TNSName:
jdbc:oracle:thin:@<TNSName>
Example: jdbc:oracle:thin:@tns_a
Note:
Support for TNSNames was added in the driver release 10.2.0.1
4. 解决
修改配置中的数据库连接字符串为 url="jdbc:oracle:thin:@//10.96.149.65:1521/dlwl"
问题解决。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。