Oracle JDBC连接池启动时SocketException: Connection reset问题排查与解决
嘿,咱们来好好分析下你启动应用时遇到的这个Connection reset问题,从你贴的错误栈跟踪来看,问题出在Tomcat JDBC连接池初始化Oracle数据库连接的环节。下面是最常见的原因和对应的解决办法:
可能原因及解决方法
1. 数据库主动回收了空闲连接
- 原因:Oracle数据库默认会通过
IDLE_TIME参数自动断开长时间闲置的连接。如果你的连接池在启动时尝试复用这些已经被数据库标记为失效的连接,就会触发连接重置错误。从栈里的ConnectionPool.init能看出来,是连接池创建连接时碰到了无效连接。 - 解决方法:
- 给连接池加上连接有效性校验:在Tomcat JDBC配置里设置
testOnBorrow=true,同时指定validationQuery="SELECT 1 FROM DUAL",这样每次获取连接前都会检查连接是否有效,无效的话会自动重新创建。 - 对齐连接池和数据库的超时配置:把连接池的
minEvictableIdleTimeMillis设置成比数据库IDLE_TIME更小的值,让连接池主动回收空闲连接,避免被数据库先断开。
- 给连接池加上连接有效性校验:在Tomcat JDBC配置里设置
2. 中间网络设备(防火墙/负载均衡)断开了连接
- 原因:如果应用和数据库之间隔了防火墙或者负载均衡,这些设备通常会断开长时间没有数据交互的连接——哪怕数据库本身还没超时。启动时连接池创建的连接可能被这些中间设备提前断开,导致写数据时触发连接重置。
- 解决方法:
- 配置连接池的心跳机制:设置
timeBetweenEvictionRunsMillis参数,定期对空闲连接执行validationQuery,保持连接活跃,防止被中间设备判定为闲置断开。 - 联系运维调整中间设备的超时时间,确保它比连接池的空闲回收时间更长。
- 配置连接池的心跳机制:设置
3. JDBC驱动版本不兼容
- 原因:你用的是
ojdbc7-12.1.0.2.jar,如果这个版本和你实际的Oracle数据库版本不匹配(比如数据库是19c但驱动是12.1),可能会出现协议层面的兼容性问题,导致连接重置。另外也要注意驱动和JDK版本的兼容性(你用的是JDK8,ojdbc7/8都兼容,但别用ojdbc11这类高版本驱动)。 - 解决方法:
- 升级JDBC驱动到和数据库版本匹配的版本:比如数据库是12c用ojdbc7/8,19c建议用ojdbc8或ojdbc11。
- 确保驱动版本和JDK8兼容,避免版本冲突。
4. 连接池初始化配置不合理
- 原因:如果连接池的
initialSize设置得太大,启动时一次性创建大量连接,可能会导致数据库端连接数耗尽或者网络拥堵,部分连接创建失败就会出现重置错误。 - 解决方法:
- 适当降低
initialSize的值,避免启动瞬间给数据库带来过大的连接压力。 - 配置
maxWait参数设置连接获取超时时间,避免线程长时间阻塞,同时通过超时日志来调整参数。
- 适当降低
5. 数据库端资源不足或异常
- 原因:数据库可能存在连接数耗尽、内存不足、进程异常等情况,导致无法处理新的连接请求,主动重置连接。
- 解决方法:
- 检查数据库的
processes、sessions参数,确保有足够的连接数可以分配给应用。 - 查看数据库的告警日志,排查是否有OOM、进程崩溃等异常,针对性解决数据库端的问题。
- 检查数据库的
你提供的错误栈跟踪:
... Caused by: java.net.SocketException: Connection reset at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:115) ~[?:1.8.0_121] at java.net.SocketOutputStream.write(SocketOutputStream.java:155) ~[?:1.8.0_121] at oracle.net.ns.DataPacket.send(DataPacket.java:209) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.net.ano.CryptoDataPacket.send(Unknown Source) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:215) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:302) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.net.ns.NetInputStream.read(NetInputStream.java:249) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.net.ns.NetInputStream.read(NetInputStream.java:171) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.net.ns.NetInputStream.read(NetInputStream.java:89) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.jdbc.driver.T4CMAREngineStream.unmarshalUB1(T4CMAREngineStream.java:429) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:397) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:437) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:954) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:639) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:666) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:566) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:310) ~[tomcat-jdbc-8.5.11.jar:?] at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203) ~[tomcat-jdbc-8.5.11.jar:?] at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:732) ~[tomcat-jdbc-8.5.11.jar:?] at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:664) ~[tomcat-jdbc-8.5.11.jar:?] at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:479) ~[tomcat-jdbc-8.5.11.jar:?] at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154) ~[tomcat-jdbc-8.5.11.jar:?] at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118) ~[tomcat-jdbc-8.5.11.jar:?] at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107) ~[tomcat-jdbc-8.5.11.jar:?] at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:131) ~[tomcat-jdbc-8.5.11.jar:?] at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) ~[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE] at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) ~[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE] at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:326) ~[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE] ... 61 more
内容的提问来源于stack exchange,提问作者Mykhaylo Adamovych
相关产品推荐
相关产品推荐

