Oracle SQL表の特定のレコード(更新されたもの)に対して、更新と選択が機能していないという問題があります。 Java JDBCコード、Javaコントロールは、その更新ステートメント(アプリケーションがそこに停滞している)で無期限に待機しています。私は下部にスタックトレースを添付しました。このプログラムは数年前から問題なく実行されています。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); } }
物事は私たちは、同じレコードのoracleのsqldeveloperセッションから更新クエリを実行することができます。
アプリケーションは、我々は、関連テーブルを検証行き詰まっ:
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)
編集-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)
これはあなたが得ているエラーです。また、クエリを呼び出す前にstrUpdQryを出力し、質問に出力を追加してください。 – Juan
アプリケーションはマルチスレッドですか?同じ行に関連する他の保留中のトランザクションが同時にありますか?トランザクションの隔離を変更しようとしましたか? –
最近更新されたソフトウェアのアップデートやパッチはありますか? DBの更新はOracle Java Driverと同期していませんか? – Juan