gpt4 book ai didi

java - 用 JDBC 取消 SQL 语句

转载 作者:行者123 更新时间:2023-11-28 22:55:26 26 4
gpt4 key购买 nike

我在这里遇到了这个问题。我正在我的 Tomcat 应用程序服务器上运行一个应用程序。作为前端,我使用一个带有 javascript 的 HTML 站点,在后端,我使用 Java。

当用户单击一个按钮时,将进行多个 sql 查询,一个接一个。现在,如果用户愿意,我想提供取消此查询的功能。

我已经检查了我的 jdbc 驱动程序和数据库是否与 cancel() 方法兼容,这很好。

这是我的代码:

PreparedStatement stmt = null;

public void runQuery(String query) {
Connection con = getConnection();

try {
stmt = con.prepareStatement(query);
stmt.execute();
} catch(SQLException e) {
e.printStackTrace();
} finally {
if(stmt != null && !stmt.isClosed()) {
stmt.close();
}

if(con != null) {
con.close();
}
}
}

public void cancelQuery() {
try {
if(stmt != null && !stmt.isClosed()) {
stmt.cancel();
}
} catch (SQLException e) {
e.printStackTrace();
}
}

因此用户单击运行按钮 => runQuery 被执行并且 stmt 被需要执行的查询初始化/覆盖。

然后用户点击取消按钮=> cancelQuery被执行。不幸的是,我有时会收到 NullPointerException,因为 stmt 为空。但如果 stmt 为空,它甚至不应该调用 cancelQuery?!这是堆栈跟踪:

    Stacktrace:] with root cause
java.lang.NullPointerException
at com.sybase.jdbc3.jdbc.SybStatement.doCancel(SybStatement.java:646)
at com.sybase.jdbc3.jdbc.SybStatement.cancel(SybStatement.java:614)
at org.apache.tomcat.dbcp.dbcp2.DelegatingStatement.cancel(DelegatingStatement.java:269)
at org.apache.tomcat.dbcp.dbcp2.DelegatingStatement.cancel(DelegatingStatement.java:269)
at de.package.util.DBHelper.cancelQuery(DBHelper.java:82)
.....

知道为什么这会一直产生异常吗?如何以正确的方式取消声明?

编辑:我查看了评论中的链接,现在从另一个线程运行 cancel() 方法。但是 NullPointer 仍然会发生。这就是我现在调用 cancel() 方法的方式:

public void cancelQuery() {
Thread thread = new Thread(new SQLCancelRunnable(stmt));
thread.start();
}

public class SQLCancelRunnable implements Runnable {
PreparedStatement stmt;

public SQLCancelRunnable(PreparedStatement stmt) {
this.stmt = stmt;
}

@Override
public void run() {
if(stmt != null) {
try {
System.out.println(stmt);
System.out.println(stmt.toString());
stmt.cancel();
System.out.println("canceled");

} catch (SQLException e) {
e.printStackTrace();
}

}
}
}

编辑2找到我的答案问题是 runQuery() 方法的 finally block 。因为我关闭了语句和连接,所以抛出了 NullPointer。我现在删除了这个 block ,但这当然会导致巨大的资源泄漏。任何人都可以指导我正确的方向如何正确关闭我的资源?

最佳答案

    PreparedStatement stmt = null;

public void runQuery(String query) {
Connection con = getConnection();


try {
stmt = con.prepareStatement(query);
stmt.execute();

}
catch(SQLException e) {
e.printStackTrace();
}
finally {
if(stmt != null && !stmt.isClosed()) {
stmt.close();
}

if(con != null) {
con.close();
}
}

}

public void cancelQuery() {
try {
if(stmt != null && !stmt.isClosed()) {
stmt.cancel();
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

试试这个。我在 SQLException 之后添加了一个通用异常。

不能说这是一个非常干净的解决方案,但它会忽略 stmt.close() 语句可能引发的空指针异常。

关于java - 用 JDBC 取消 SQL 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28481809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com