在oracle.jdbc.driver.T4CConnection上找到的锁定对象

我正在使用JMC执行应用程序分析,我没有看到任何锁定/线程争用,如下面的屏幕截图所示。

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 我在下面运行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  (a oracle.jdbc.driver.T4CConnection) 

您在此处将数据库锁与Java锁混淆。 JMC只显示Java程序中的锁(同步块,等待等),它对数据库内部的内容一无所知。 您的SQL查询仅显示数据库级别的锁(表锁,行锁等),并且不了解Java程序中的锁。 这些是绝对不同的领域和完全不同的锁。

你在这里有一个线程的转储,该线程持有对T4CConnection类型的对象的锁定,地址为0x7af3423c0 。 它只表示此线程正在执行某个synchronized(connection)块内的代码。 就这样。 其他线程不阻塞该线程(否则其状态将不是RUNNABLE ,它将是WAITINGBLOCKED )。 它正在运行并从网络套接字读取内容(可能是来自数据库的响应)。

这种行为绝对正常。 DB驱动程序在执行SQL查询的过程中对连接实例执行同步,以允许其他线程并行使用它。

在此屏幕截图和此线程转储中,您无需担心任何问题。