Java 执行语句时关闭JDBC连接
最近,我遇到了在Tomcat停止后Oracle数据库中有活动会话的问题。我决定重现这种情况,并试图找到解决办法。测试代码: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
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");
}
}