我有一个访问 Oracle 12 数据库的 Java 应用程序。当我在调试器之外运行它时,它运行良好。如果我尝试使用 IntelliJ 的 v2016.1.4 调试器对其进行调试,则会收到 java.sql.SQLRecoverableException
,并具有以下堆栈跟踪:
java.sql.SQLRecoverableException: IO Error: An existing connection was forcibly closed by the remote host, Authentication lapse 0 ms.
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:794) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:688) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:39) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:691) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:384) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:273) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:198) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:176) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at ...setDbConnection(OracleJmsQueue.java:537) [classes/:?]
...
Caused by: java.io.IOException: An existing connection was forcibly closed by the remote host, Authentication lapse 0 ms.
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:790) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
... 12 more
Caused by: java.io.IOException: An existing connection was forcibly closed by the remote host
at sun.nio.ch.SocketDispatcher.write0(Native Method) ~[?:1.8.0_131]
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51) ~[?:1.8.0_131]
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[?:1.8.0_131]
at sun.nio.ch.IOUtil.write(IOUtil.java:65) ~[?:1.8.0_131]
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) ~[?:1.8.0_131]
at oracle.net.nt.TimeoutSocketChannel.write(TimeoutSocketChannel.java:215) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.net.ns.NIOPacket.writeToSocketChannel(NIOPacket.java:211) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.net.ns.NIONSDataChannel.writeDataToSocketChannel(NIONSDataChannel.java:181) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.net.ns.NIONSDataChannel.writeDataToSocketChannel(NIONSDataChannel.java:132) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CMAREngineNIO.prepareForReading(T4CMAREngineNIO.java:96) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:534) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4C8TTIdty.receive(T4C8TTIdty.java:728) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4C8TTIdty.doRPC(T4C8TTIdty.java:639) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1544) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:518) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
... 12 more
有趣的是,这只在调试时发生。我可以在调试器外部启动 Java 进程,并使用 JPDA 启用远程调试,一切都运行良好。如果我随后连接远程 IntelliJ 调试器,就会出现问题。如果我随后分离调试器,Java 进程将再次正常运行。下面是发生异常的代码:
protected void setDbConnection(DataSource dataSource)
throws InterruptedException {
boolean connected = false;
while (!connected) {
try {
dbConnection = dataSource.getConnection();
dbConnection.setAutoCommit(false);
connected = true;
}
catch (SQLException e) {
int retryTime = 5000; // 5 seconds
final String msg =
String.format("Unable to connect to %s. Retrying in %s ms",
dataSource, retryTime);
logger.error(msg, e);
Thread.sleep(retryTime);
}
}
logConnectionDebugInfo();
}
这是调试器提供的调试信息。我注意到 SQLState
为“08006”,但无法找到有关它的很多有用信息。我欢迎任何关于这个问题的想法。大多数情况下,我想修复它,但我也想听听可能导致它的调试原因。会不会是线程问题?
2018 年 3 月 28 日更新:我可以使用 Eclipse 的 Neon.3 Release (4.6.3) 调试器进行调试,而不会出现此问题。
最佳答案
我在 Eclipse 2020-12 中遇到了完全相同的问题。我删除了所有断点并且工作正常。似乎一些断点减慢了速度,然后一旦超时,现有连接就会被远程主机强制关闭。
关于oracle - 仅在调试时出现 : java. io.IOException:现有连接被远程主机强制关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49512344/