我正面临一个问题,即对于Oracle SQL表中的一个特定记录(随机),更新和选择无法使用Java JDBC代码,java控件无限期地等待该更新语句(应用程序卡在那里)。我在底部附加了堆栈跟踪。这个程序几年来一直没有任何问题地执行。
码:
public void updateRequestStatus(long req_id, int status){
int rowsAffected=0;
Statement stmt = null;
try{
stmt = objCon.createStatement();
String strUpdQry="";
'--- some java code
'---
strUpdQry= "UPDATE abcrequest SET status="+status+" where request_id="+req_id;
this.logger.printString("Before executing Update Query :: with status: "+status+", Request id: "+req_id);
rowsAffected=stmt.executeUpdate(strUpdQry);
this.logger.printString("After executing Update Query:: "+status+", Request id: "+req_id);
this.objCon.commit();
}catch(SQLException sqle){
this.lg.error("SQLException at :",sqle);
this.logger.printString("SQLException occured "+sqle.getMessage());
}catch(Exception e){
this.lg.error("Exception :",e);
this.logger.printString("Exception occured in: "+e.getMessage());
}
finally{
closeStatement(stmt);
}
}
我们尝试过的事情
V$LOCKED_OBJECT
,v$LOCK
,v$session_longops
,dba_blockers
,v$session
,dba_waiters
,用于查找表记录中的任何锁定,使java应用程序无限等待。但我们找不到任何东西。导致这种情况的因素是什么?
堆栈跟踪
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at oracle.net.ns.Packet.receive(Unknown Source)
at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.jdbc.ttc7.MAREngine.unmarshalUB1(MAREngine.java:931)
at oracle.jdbc.ttc7.MAREngine.unmarshalSB1(MAREngine.java:893)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:369)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:830)
- locked <0x09c62c78> (a oracle.jdbc.ttc7.TTC7Protocol)
at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2391)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2672)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:572)
- locked <0x04b068d8> (a oracle.jdbc.driver.OracleStatement)
- locked <0x09c35338> (a oracle.jdbc.driver.OracleConnection)
at xxxxx.DBActions.xxxxx.getRequestAttributes(Unknown Source)
Edit-1:添加了关于ojdbc6的新堆栈跟踪。
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at oracle.net.ns.Packet.receive(Packet.java:282)
at oracle.net.ns.DataPacket.receive(DataPacket.java:103)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:230)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:175)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:100)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:85)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:122)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:78)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1179)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1155)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:279)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:194)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1000)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1814)
at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1779)
- locked <0x09ec40f0> (a oracle.jdbc.driver.T4CConnection)
at oracle.jdbc.driver.OracleStatementWrapper.executeUpdate(OracleStatementWrapper.java:277)
at cas.com.database.MQDatabaseDts.updateProvRequestStatus(MQDatabaseDts.java:595)
at cas.com.thread.NeoMQSenderThread.run(NeoMQSenderThread.java:188)
at java.lang.Thread.run(Unknown Source)
您应该在执行此语句之前调用objCon.isValid()
,因为此问题看起来您的连接已断开连接。如果连接无效,请获取一个新连接。
上述问题是由于Oracle版本中的并发问题导致java会话被阻止。
在更新到实时的最新Oracle DB版本时,问题得以解决。