我有一个访问Oracle12数据库的Java应用程序。当我在调试器之外运行它时,它运行得很好。如果我尝试使用Intellijv2016.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版本(4.6.3)调试器进行调试,而不会看到这个问题。
发布于 2021-04-15 07:01:44
我在我的eclipse 2020-12中也遇到了同样的问题。我删除了所有的断点,它工作得很好。似乎一些断点减慢了它的速度,一旦超时,现有的连接就会被远程主机强制关闭。
https://stackoverflow.com/questions/49512344
复制相似问题