2012-02-08 110 views
1

我有一個運行在tomcat 6,java 6(openjdk),centos 6.2上的新的tomcat應用服務器。該服務器是在centos 6.2主機上運行在qemu-kvm下的虛擬機。主機和來賓都是64位的。oracle瘦jdbc連接在不活動後接收「連接重置」

我有一個連接打開的情況(從連接池),然後「長時間計算」發生了大約4個小時,在此期間不使用連接。最後,「提交」被髮出,並且服務器對「連接重置」的例外,具體如下:

Caused by: java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:185) 
    at oracle.net.ns.Packet.receive(Packet.java:282) 
    at oracle.net.ns.DataPacket.receive(DataPacket.java:103) 
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:230) 
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:175) 
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:100) 
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:85) 
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:122) 
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:78) 
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1179) 
    at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1155) 
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:279) 
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) 
    at oracle.jdbc.driver.T4C7Ocommoncall.doOCOMMIT(T4C7Ocommoncall.java:75) 
    at oracle.jdbc.driver.T4CConnection.doCommit(T4CConnection.java:558) 

數據庫服務器和客戶端在同一個子網中,除了服務器是一個真正的物理主機,很明顯,應用程序服務器是在同一子網上的物理機器中運行的客戶機。

主機使用「橋接」網絡。

這可能不是軟件問題,而是linux os配置(iptables?)問題,但我真的不知道。

回答

1

我碰到過這個問題。幾乎總是由網絡超時(負載均衡器或防火牆)造成的。但是你已經明確提到你的服務器在同一個子網上,所以不確定發生了什麼。既然你懷疑iptables的,你可以將其關閉,運行測試,看看它是否工作(太容易了吧:)

無論如何,假設你連接到Oracle數據庫,下面的調整有助於

http://raibledesigns.com/rd/entry/tomcat_oracle_connectivity_problems

如果你使用不同的數據庫(比如說mysql),設置可能會不同,但邏輯是一樣的。設置Keepalive值以防止連接閒置太久。這樣,防火牆/負載均衡器/ iptables軟件將不會終止它。

+0

我相信這個問題是由做一個「system-config-firewall-tui」導致的,它間接刷新了iptables的配置和重新加載。這會導致一些現有連接死亡。 – dmansfield 2012-02-15 22:16:18

0

正如您在Oracle論壇中發佈的this文章中所看到的,這可能有多個問題/解決方案。

  • 檢查您的JDBC驅動程序版本是正確的
  • 檢查ORACLE_HOME環境變量
  • 嘗試添加參數-Djava.security.egd=file:///dev/urandom
  • 你的邏輯使用單獲取連接?在帖子中也提到了這個

希望這可以幫助你。

+0

當我讀它時,/ dev/urandom修復用於連接超時。這是連接的,有效的,用於某些語句,然後閒置。它仍然有可能成爲/ dev/urandom修復程序? – dmansfield 2012-02-10 18:18:00

+0

對不起,趕快輸入。至於ORACLE_HOME和其他sqlnet.ora調整,我不認爲它們適用於我使用的** thin **驅動程序(未指定)。但我會檢查驅動程序的版本。 – dmansfield 2012-02-10 18:20:00

1

@user通過在sqlnet.ora中配置「SQLNET.EXPIRE_TIME = 10」引用了一個很好的解決方法。

但是,此解決方法僅適用於您的應用程序使用厚OCI(jdbc:oci)而不是瘦(jdbc:thin)驅動程序。

Linux有軟件防火牆,即iptables,它可以掛起空閒的網絡連接,所以即使你在同一個子網中,你也可以使用iptables軟件防火牆。這在所有現代Linux中都是默認激活的,直到Linux管理員禁用它。

默認情況下,Linux iptables不會丟失空閒TCP/IP連接(jdbc屬於TCP/IP協議),所以Linux管理員必須配置iptables才能這樣做。以下是任何讀者誰有興趣瞭解更多的詳細的解釋:

http://www.digitage.co.uk/digitage/software/linux-security/cutter

企業用戶,安全團隊,或者建築師常提示網絡/ OS管理員使用防火牆來終止空閒連接,以及路由器。這總是反黑客社區的「推薦」,但它沒有得到適當的討論,並導致應用程序不穩定。最後,你應該與團隊討論找到一個餘額