首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅在调试时: java.io.IOException:现有连接被远程主机强制关闭

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

Stack Overflow用户
提问于 2018-03-27 20:01:13
回答 1查看 3.6K关注 0票数 2

我有一个访问Oracle12数据库的Java应用程序。当我在调试器之外运行它时,它运行得很好。如果我尝试使用Intellijv2016.1.4调试器对其进行调试,我会得到一个java.sql.SQLRecoverableException,并带有以下堆栈跟踪:

代码语言:javascript
复制
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进程将再次正常运行。下面是发生异常的代码:

代码语言:javascript
复制
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)调试器进行调试,而不会看到这个问题。

EN

回答 1

Stack Overflow用户

发布于 2021-04-15 07:01:44

我在我的eclipse 2020-12中也遇到了同样的问题。我删除了所有的断点,它工作得很好。似乎一些断点减慢了它的速度,一旦超时,现有的连接就会被远程主机强制关闭。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49512344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档