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 您可以获得对象名称。
如果您在此发现任何会话,请先终止或完成该会话。