Java 执行语句时关闭JDBC连接

Java 执行语句时关闭JDBC连接,java,oracle,jdbc,Java,Oracle,Jdbc,最近,我遇到了在Tomcat停止后Oracle数据库中有活动会话的问题。我决定重现这种情况,并试图找到解决办法。测试代码: import lombok.extern.slf4j.Slf4j; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; @Slf4j public class ClosingActiveOra

最近,我遇到了在Tomcat停止后Oracle数据库中有活动会话的问题。我决定重现这种情况,并试图找到解决办法。测试代码:

import lombok.extern.slf4j.Slf4j;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

@Slf4j
public class ClosingActiveOracleSession {

    public static void main(String[] args) throws SQLException, InterruptedException {
        final Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//...", "username", "password");
        final Statement statement = connection.createStatement();
        new Thread(() -> {
            try {
                statement.execute("BEGIN\n"
                        + "  LOOP\n"
                        + "    dbms_lock.sleep(5);\n"
                        + "  END LOOP;\n"
                        + "END;");
            } catch (SQLException e) {
                throw new RuntimeException("PL/SQL execution error", e);
            }
        }).start();
        log.info("[main] will sleep");
        Thread.sleep(10000);
        log.info("[main] awoke");
        statement.cancel();
        log.info("statement canceled");
        statement.close();
        log.info("statement closed");
        connection.close();
        log.info("[main] connection closed");
    }
}
我收到一条消息,说明该语句已被取消,但有关其关闭的消息未出现。我怀疑结束语句被互斥锁(连接)阻止。Oracle数据库中的会话仍处于活动状态

为了检查是否可以取消此查询,我在PL/SQL Developer中运行了此PL/SQL块,并单击了“中断”按钮:

过了一段时间,我有了ORA-01013,PL/SQL块的执行被取消了。Oracle数据库中会话的状态变为非活动状态

有人知道Oracle JDBC驱动程序有什么问题吗?
Oracle驱动程序版本:ojdbc7-12.1.0.2
Oracle数据库版本:Oracle数据库12c企业版12.1.0.2.0

但这段代码运行良好:

import lombok.extern.slf4j.Slf4j;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

@Slf4j
public class ClosingActiveOracleSession {

    public static void main(String[] args) throws SQLException, InterruptedException {
        final Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//...", "username", "password");
        final Statement statement = connection.createStatement();
        new Thread(() -> {
            try {
                final ResultSet resultSet = statement.executeQuery("SELECT * FROM some_table WHERE some_condition = 21332112");
                while (resultSet.next()) {
                    // Ignore
                }
            } catch (SQLException e) {
                throw new RuntimeException("Processing ResultSet failed", e);
            }
        }).start();
        log.info("[main] will sleep");
        Thread.sleep(10000);
        log.info("[main] awoke");
        statement.cancel();
        log.info("statement cancelled");
        statement.close();
        log.info("statement closed");
        connection.close();
        log.info("[main] connection closed");
    }
}
当声明取消时,我得到: java.sql.SQLException:关闭的结果集:下一步

java.sql.SQLException:ORA-12592:TNS:bad packet
谢谢你的帮助。
p、 s:对不起,我的英语不好

你在日志文件中看到了所有调试消息吗?只有语句取消我想我需要在Oracle中注册一个bug。有人知道怎么做吗?
import lombok.extern.slf4j.Slf4j;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

@Slf4j
public class ClosingActiveOracleSession {

    public static void main(String[] args) throws SQLException, InterruptedException {
        final Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//...", "username", "password");
        final Statement statement = connection.createStatement();
        new Thread(() -> {
            try {
                final ResultSet resultSet = statement.executeQuery("SELECT * FROM some_table WHERE some_condition = 21332112");
                while (resultSet.next()) {
                    // Ignore
                }
            } catch (SQLException e) {
                throw new RuntimeException("Processing ResultSet failed", e);
            }
        }).start();
        log.info("[main] will sleep");
        Thread.sleep(10000);
        log.info("[main] awoke");
        statement.cancel();
        log.info("statement cancelled");
        statement.close();
        log.info("statement closed");
        connection.close();
        log.info("[main] connection closed");
    }
}