oracle - 仅在调试时出现 : java. io.IOException:现有连接被远程主机强制关闭

标签 oracle debugging intellij-idea jdbc

我有一个访问 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”,但无法找到有关它的很多有用信息。我欢迎任何关于这个问题的想法。大多数情况下,我想修复它,但我也想听听可能导致它的调试原因。会不会是线程问题?

enter image description here

2018 年 3 月 28 日更新:我可以使用 Eclipse 的 Neon.3 Release (4.6.3) 调试器进行调试,而不会出现此问题。

最佳答案

我在 Eclipse 2020-12 中遇到了完全相同的问题。我删除了所有断点并且工作正常。似乎一些断点减慢了速度,然后一旦超时,现有连接就会被远程主机强制关闭。

关于oracle - 仅在调试时出现 : java. io.IOException:现有连接被远程主机强制关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49512344/

相关文章:

eclipse - 如何在 Eclipse 中调试 JComboBox 的 actionEvent 的处理并避免锁定窗口系统?

java - ArrayList 不通过套接字更新内容

git - 如何使用 Intellij 编辑以前的 git 提交消息?

python - PyCharm 和 Python 日志记录的正确工作流程

java - 在 Debug模式下找不到 JSP 变量

java - IntelliJ IDEA 提示 Maven 类未找到

SQL合并具有相同ID但列值不同的两行(Oracle)

sql - 触发器SQL中指定字母和数字字符串的格式

Oracle - FAST REFRESH 使用 LEFT JOINS 更新的物化 View 非常慢

java - 如何在 oracle 列中查找无效的 UTF-8 字符