我有一个新的 tomcat 应用服务器运行在 tomcat 6、java 6 (openjdk)、centos 6.2 上。服务器是在centos 6.2主机上运行在qemu-kvm下的虚拟机。主机和 guest 都是 64 位的。
我有一个连接打开的情况,(从连接池)然后“长时间计算”发生大约 4 小时,在此期间不使用连接。最后发出“commit”,服务器给出“connection reset”异常,具体为:
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)
数据库服务器和客户端在同一个子网中,除了服务器是一个真实的物理主机,显然应用服务器是运行在同一个子网中的物理机器中的 guest 。
主机使用“桥接”网络。
这可能根本不是软件问题,而是 linux 操作系统配置(iptables?)问题,但我真的不知道。
最佳答案
我已经遇到过几次了。几乎总是由网络超时(负载平衡器或防火墙)引起。但是你已经明确提到你的服务器在同一个子网上,所以不太确定发生了什么。既然你怀疑 iptables,你能不能把它关掉,运行测试看看它是否有效(太简单了哈:)
无论如何,假设您正在连接到 Oracle 数据库,以下调整会有所帮助
http://raibledesigns.com/rd/entry/tomcat_oracle_connectivity_problems
如果您使用不同的数据库(比如 mysql),设置可能不同,但逻辑是相同的。设置一个 keepalive 值以防止连接空闲时间过长。这样防火墙/负载平衡器/iptables 软件就不会终止它。
关于linux - oracle 瘦 jdbc 连接在不活动后接收 "connection reset",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9202813/