解決Linux下JSP連接Orcale的著名錯誤Java.SQL.Exception The Network Adapter could not establish the connection .

本來一個context在A主機(Windows+Tomcat5.0.28) 能夠通過JDBC正常連接C主機(Windows+Orcale),後來移植到B主機(Linux+Tomcat5.0.28),訪問帶有數據庫連接的頁面,出現著名的:

javax.servlet.ServletException: Io /x{5F02}/x{5E38}: The Network Adapter could not establish the connection
 org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
 org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
 org.apache.jsp.test_jsp._jspService(test_jsp.java:66)
 org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:79)

www.baidu.com一搜,有很多人遇到類似的錯誤,網上別人的解答也大都集中在一下幾個方面:

1. Orcale服務是否正常,TNS是否啓動;

2. 將URL裏面的主機名改爲IP,端口是否正確,用戶名、密碼是否正確;

3. 因爲是Linux,防火牆是否攔截了JDBC連接請求;

由於我是將整個context從windows上拷貝至Linux下,因此在windows下可以連接的配置(URL的寫法)可以確定正確,而且Oracle服務器肯定正常(否則,從A主機無法訪問),因此錯誤原因1,2可以基本排除。後來我用iptables -F將防火牆關閉,仍然出現上述錯誤,後來還是到SUN的技術論壇:http://forum.java.sun.com/thread.jspa?forumID=48&threadID=284032上找到了答案:

1) Check for the class path frst.
2) Check whether the listner is running.
Linux or Solaris check --> ORA_HOME/bin/lsnrctrl.sh
Windows -->ORA_HOME/bin/lsnrctrl.exe
3) If these are Okay, the problem is with your Connection URL. Check the following.

In case of Linux or Solaris Use the below code:

DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=Host_name)(PORT=1521)))(CONNECT_DATA=(SID=service_name)(SERVER=DEDICATED)))", "usernam", "password");

In the above URL SERVER = DEDICATED is mandatory for Linux or Solaris.

In case of WINDOWS Use the below code:

DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host_name)(PORT=1521)))(CONNECT_DATA=(SID=service_name)(SERVER=DEDICATED)))", "username", "password");

In the above URL (SERVER = DEDICATED) is optional for Windows.

寫的很清楚,URL 中的(SERVER = DEDICATED)對Linux是必須的,對windows是可選的。至此,卡殼了2天的問題終於解決了,長舒一口氣,沒有妨礙項目進度。不過,由於最近項目很忙,沒有細緻研究其中的原因,或者還有別的什麼解決辦法,以後再說吧!

得到一個結論:遇到問題要自己善於利用網絡解決,最好到國外的一些官方網站逛逛!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章