我正在使用 JMC 执行应用程序分析,我没有看到任何锁定/线程争用,如下面的屏幕截图所示。
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)
最佳答案
您在这里混淆了数据库锁和 Java 锁。 JMC 只向您显示 Java 程序中的锁(同步块(synchronized block)、等待等),它对您的数据库中发生的事情一无所知。您的 SQL 查询仅显示数据库级别的锁(表锁、行锁等),而对 Java 程序中的锁一无所知。这些是完全不同的区域和完全不同的锁。
这里是一个线程的转储,该线程持有 T4CConnection
类型对象的锁,地址为 0x7af3423c0
。它仅表示此线程正在执行某个 synchronized(connection)
block 内的代码。就这样。该线程未被其他线程阻塞(否则它的状态将不是RUNNABLE
,而是WAITING
或BLOCKED
)。它正在运行并从网络套接字中读取内容(可能是来自数据库的响应)。
这样的行为是绝对正常的。 DB 驱动程序在连接实例上执行同步,同时它正在执行 SQL 查询以不允许其他线程并行使用它。
在此屏幕截图和线程转储中,您无需担心任何事情。
关于java - 在 oracle.jdbc.driver.T4CConnection 上找到锁定的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39200259/