2016-08-29 9 views
2

JMCを使用してアプリケーション・プロファイリングを実行していますが、以下のスクリーンショットに示すようにロックされた/スレッドの競合はありませんでした。oracle.jdbc.driver.T4CConnectionにロックされたオブジェクトが見つかりました

enter image description here enter image description here enter image description here 私は(ごとに数秒)以下のSQLはまた、任意の結果が返されませんでした走りました。

select 
    (select username from v$session where sid=a.sid) blocker, 
    a.sid, 
    ' is blocking ', 
    (select username from v$session where sid=b.sid) blockee, 
    b.sid 
from 
    v$lock a, 
    v$lock b 
where 
    a.block = 1 
and 
    b.request > 0 
and 
    a.id1 = b.id1 
and 
    a.id2 = b.id2; 

ロックデータベース接続の原因は何ですか?それはデータベースのレコード/テーブルのロックですか?

以下は、永久に実行されているように見えるプログラムの実行中に抽出したスレッドダンプです。

java.lang.Thread.State: RUNNABLE 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) 
    at java.net.SocketInputStream.read(SocketInputStream.java:170) 
    at java.net.SocketInputStream.read(SocketInputStream.java:141) 
    at oracle.net.ns.Packet.receive(Packet.java:283) 
    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:123) 
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79) 
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1122) 
    at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1099) 
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:288) 
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191) 
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523) 
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207) 
    at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:863) 
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1153) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1275) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3620) 
    - locked <0x00000007af3423c0> (a oracle.jdbc.driver.T4CConnection) 
+0

私はあなたの懸念についてはよく分かりません。スレッドが永遠に実行されていると言っているときは、特定のSQLクエリが結果を返すのに時間がかかりすぎるということを意味しますか?そうでなければ、現在のデータには心配するものは何もないからです。 –

+0

完了までに5分かかる機能があります。私はボトルネックがどこにあるかを知ろうとしています。 – youcanlearnanything

+0

あまりにも長い間、ダンプされたスレッドによって実行される特定のSQLクエリーまで問題を追跡しましたか?それはダンプの中に「ロックされた」という言葉があり、何らかのブロックを意味すると思ったからです。 –

答えて

4

ここでは、Javaロックとデータベースロックを混同しています。 JMCはJavaプログラム内のロック(同期ブロック、待機など)のみを表示しますが、DB内で何が起こっているかはわかりません。 SQL問合せは、DBレベル(表ロック、行ロックなど)のロックのみを表示し、Javaプログラム内のロックについては何も認識しません。それらは絶対に異なる領域であり、まったく異なるロックです。

ここにあるものは、タイプT4CConnectionのオブジェクトにロックを保持するスレッドのダンプです。アドレスは0x7af3423c0です。これは、このスレッドがブロックsynchronized(connection)内のコードを実行中であることを意味します。それで全部です。スレッドは他のスレッドによってブロックされません(そうでなければ、その状態はRUNNABLEではなく、WAITINGまたはBLOCKEDとなります)。それは実行中で、ネットワークソケットから何かを読み取っています(恐らく、DBからの応答)。

このような現象はまったく正常です。 DBドライバは、他のスレッドがパラレルで使用することを許可しないようにSQLクエリを実行している間に、接続インスタンスの同期を行います。

このスクリーンショットとこのスレッドダンプで心配する必要はありません。

関連する問題