2017-11-06 5 views
3

Oracle SQL表の特定のレコード(更新されたもの)に対して、更新と選択が機能していないという問題があります。 Java JDBCコード、Javaコントロールは、その更新ステートメント(アプリケーションがそこに停滞している)で無期限に待機しています。私は下部にスタックトレースを添付しました。このプログラムは数年前から問題なく実行されています。oracle sqlデータベースの行をjava jdbcから更新できませんでした。Javaコードが更新時にスタックしました

コード:私たちは

  1. を試してみました

    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セッションから更新クエリを実行することができます。

  2. アプリケーションは、我々は、関連テーブルを検証行き詰まっ:V$LOCKED_OBJECTv$LOCKv$session_longopsdba_blockersv$sessiondba_waiters javaアプリケーションが無限に待機するようになっているテーブルのレコードのロックを見つけるため。しかし、私たちは何も見つけることができませんでした。

  3. アプリケーションを再起動すると、同じレコードの更新や選択が行われていても、フリーズしています。そのレコードをスキップすると、他のレコードは何の問題もなく更新されます。

これを引き起こす要因は何ですか?

スタックトレース

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) 
+1

これはあなたが得ているエラーです。また、クエリを呼び出す前にstrUpdQryを出力し、質問に出力を追加してください。 – Juan

+0

アプリケーションはマルチスレッドですか?同じ行に関連する他の保留中のトランザクションが同時にありますか?トランザクションの隔離を変更しようとしましたか? –

+0

最近更新されたソフトウェアのアップデートやパッチはありますか? DBの更新はOracle Java Driverと同期していませんか? – Juan

答えて

1

上記の問題は、そのOracleバージョンの同時実行性問題のために、 がJavaセッションのブロックを引き起こしているためです。

ライブで最新のOracle DBバージョンに更新すると、この問題は解決されます。

1

あなたはこの文を実行する前にobjCon.isValid()を呼び出す必要があります。接続が有効でない場合は、新しい接続を取得します。

+0

それは接続の問題ではないようです。同じレコード(問題あり)を処理してもコードがフリーズしていて、それをスキップして次のレコードを処理すると、更新と選択がうまく動作します。 –

+0

その後、あなたのドライバを最新のものにアップグレードすることをお勧めします。例外スタックトレースに「TTC7Protocol」があるという事実は、10年以上前のドライバを使用していることを示しています。ドライバをアップグレードすることで問題が解決される可能性があります。 –

+0

私たちはojdbc6に更新しましたが、問題はまだ複製されています。v $ sessionには1つの手がかりがあります.Block session_idのblocking_session列にsession_idがあり、ロックが見つかりませんでした。 b]私は新しいスタックwrt ojdbc6を更新しました。解決策を提案してください。 –

関連する問題