挂起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现在可以工作,不再挂起。