Java程序毫无例外地挂起在executeUpdate上

tex*_*uce 5 java database oracle

我有一个简单的程序,使用Oracle Driver进行数据库更新.它是一个长期运行的SQL,它在SQLDeveloper模式下工作,但在Java程序中执行时挂起:

String sql = "UPDATE ...";
PreparedStatement ps = conn.prepareStatement(sql);
log.info(sql);

int affectedRows = ps.executeUpdate();
log.info("affected rows = " + affectedRows);
Run Code Online (Sandbox Code Playgroud)

它记录sql行,但从不打印受影响的行行.

在数据库中,它显示execute(V$SESSION_LONGOPS)完成时剩余0个时间:

在此输入图像描述

然而奇怪的是这个会话只存在V$SESSION_LONGOPS但不存在V$SESSION.显然,这永远不会回到Java程序.在程序的运行系统中,ps -ef提供以下信息:

user 5889  5885  0 00:00 ?        00:00:11 /java/jdk1.6.0_25/bin/java -cp ...
Run Code Online (Sandbox Code Playgroud)

它显示它开始在00.00(由Cron安排)运行并且仅执行了11秒(现在是10点,其中10小时已经过去).似乎程序只是挂起/死亡,并且日志中没有给出异常(一个大的尝试catch被日志异常包围).

它永远不会到达程序的末尾,因为ps仍然打印这个并且没有即将到来的行的日志.

非常感谢任何指向方向的帮助.

小智 5

您可以检查下表,您的会话是否处于等待模式。

从 dba_blockers 中选择*;从 dba_waiters 中选择*;

确保您的会话不在上述查询中。

并检查您的对象是否未使用以下查询锁定

select * from v$locked_object 在此视图中您可以获得锁定的对象 ID,从 dba_objects 您可以获得对象名称。

如果您在此发现任何会话,请先终止或完成该会话。