挂起DELETE语句的javajdbc

挂起DELETE语句的javajdbc,java,jdbc,Java,Jdbc,我正在运行以下代码: protected String processDeleteQuery (String aTable) { Statement stmt = null; ResultSet rs = null; Connection conn = this.conn; String mResult = "Delete failed"; try { stmt = conn.createStatement(); Stri

我正在运行以下代码:

protected String processDeleteQuery (String aTable) {

    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = this.conn;
    String mResult = "Delete failed";
    try {
        stmt = conn.createStatement();
        String sqlstr = "delete from test_table where is_valid=2";
        stmt.executeUpdate(sqlstr);
        mResult = "Delete successful";
    } catch(SQLException sqlExcep) {
        sqlExcep.printStackTrace();
        mResult = "Delete failed - "+sqlExcep.getMessage();
    } finally {
        if(rs != null) { try { rs.close(); } catch(Exception e) {} }
        if(stmt != null) { try { stmt.close(); } catch(Exception e) {} }
    }
    return mResult;
}
但是,代码挂在这一行:

stmt.executeUpdate(sqlstr);
永不回头,无休止地奔跑。从test_表中删除SQL语句,其中is_valid=2在我从sqldeveloper手动运行时工作得很快,而INSERT和SELECT语句在JDBC代码和sqldeveloper中都可以工作,只是delete语句在作为JDBC代码运行时挂起。我也尝试过PreparedStatements,但得到的结果与上面相同,仅在从JDBC运行时删除语句

JDBC executeQuery语句会因为并发性、锁、权限等删除语句而挂起,这有什么原因吗

我使用的是Oracle DB版本11.2、JDK 1.8.0_101和Tomcat v8.0, 使用驱动程序:oracle.jdbc.driver.OracleDriver

并从EclipseJavaEEIDEforWebDevelopers版本:Neon.3Release4.6.3运行服务器

编辑1:

我已经更新了原始帖子中的代码,删除了autocommit行,也尝试了将其设置为true,并将executeQuery更改为executeUpdate,但是,它仍然挂在executeUpdate行上,这意味着执行无休止地尝试处理该行,但从未从中返回

编辑2:

在JStack中,尽管我关闭了所有其他窗口,确保只有一个实例正在运行,但仍有许多被阻止的线程,等等:

线程34051:状态=阻塞 -sun.misc.Unsafe.parkboolean,长@bci=0帧 -java.util.concurrent.locks.LockSupport.parkjava.lang.Object@bci=14,line=175解释帧 -java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await@bci=42,line=2039解释帧 -java.util.concurrent.LinkedBlockingQueue.take@bci=29,line=442解释帧 -org.apache.tomcat.util.threads.TaskQueue.take@bci=36,line=103解释帧 -org.apache.tomcat.util.threads.TaskQueue.take@bci=1,line=31解释帧 -java.util.concurrent.ThreadPoolExecutor.getTask@bci=149,line=1067解释帧 -java.util.concurrent.ThreadPoolExecutor.runWorkerjava.util.concurrent.ThreadPoolExecutor$Worker@bci=26,line=1127解释帧 -java.util.concurrent.ThreadPoolExecutor$Worker.run@bci=5,line=617解释帧 -org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run@bci=4,line=61解释帧 -java.lang.Thread.run@bci=11,行=745解释帧

螺纹22275:状态=阻塞 -java.lang.Thread.sleeplong@bci=0编译帧;信息可能不准确 -org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run@bci=46,line=1344解释帧 -java.lang.Thread.run@bci=11,行=745解释帧

线程19715:状态=阻塞 -java.lang.Object.waitlong@bci=0解释帧 -sun.misc.GC$Daemon.run@bci=51,行=117

线程16643:状态=阻塞

线程12547:状态=阻塞 -java.lang.Object.waitlong@bci=0解释帧 -java.lang.ref.ReferenceQueue.removelong@bci=59,line=143编译帧 -java.lang.ref.ReferenceQueue.remove@bci=2,line=164编译帧 -java.lang.ref.Finalizer$FinalizerThread.run@bci=36,line=209解释帧;这意味着您需要在某个时刻提交事务

尝试设置conn.SETAUTOCOMMITRUE;看看这有什么不同

从oracle文档:

创建连接时,它处于自动提交模式。这意味着 每个单独的SQL语句都被视为一个事务,并且 执行后立即自动提交。更 确切地说,默认情况下,SQL语句在被提交时提交 已完成,而不是在执行时。当所有 已检索其结果集和更新计数的。几乎 但是,所有案件都已完成陈述,因此已提交, 就在它被执行之后

此外,在此处使用executeUpdate而不是executeQuery:


挂在这里是什么意思?你能在stacktraces处于挂起状态时发布它吗?不要默默地吞下异常-将它们打印出来。另外,将executeQuery更改为ExecuteUpdate有许多线程被阻止:很抱歉,在原始帖子中添加,因为在评论中很难编辑。如果这不再是重复的,那么您需要解释为什么会有所不同。您在帖子中说代码挂起在rs=stmt.executeUpdatesqlstr;rs是一个结果集。这根本不应该编译,所以它不是您实际运行的…谢谢,我已经更新了原始帖子中的代码,删除了自动提交行,也尝试了将其设置为true,并将executeQuery更改为executeUpdate,但是,它仍然挂在executeUpdate行,这意味着执行将无休止地尝试处理该行,你在帖子中说代码挂在rs=stmt.executeUpdate上
qlstr;rs是一个结果集。这根本不应该编译,所以它不是您实际运行的…抱歉,再次编辑,只是运行stmt.executeUpdatesqlstr;结果表明,这是由于SQL developer对表进行了一些未提交的更改,在关闭SQL developer并回滚对表的所有更改后,JDBC的DELETE through executeUpdate现在可以工作,不再挂起。