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

标签 java database multithreading oracle

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

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)

最佳答案

您在这里混淆了数据库锁和 Java 锁。 JMC 只向您显示 Java 程序中的锁(同步块(synchronized block)、等待等),它对您的数据库中发生的事情一无所知。您的 SQL 查询仅显示数据库级别的锁(表锁、行锁等),而对 Java 程序中的锁一无所知。这些是完全不同的区域和完全不同的锁。

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

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

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

关于java - 在 oracle.jdbc.driver.T4CConnection 上找到锁定的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39200259/

相关文章:

java - 强制 JScrollPane 和 JPanel 重绘

iPhone:通过互联网连接到数据库?

android - 如果我从线程调用 asyncTask,onPostExecute() 将在线程或调用 Activity 上执行

c - 在多线程应用程序中使用基于 openssl 的 pbkdf2

java - 更改 NatTable 单元格选择颜色

java - 公钥处理 Java/PHP

database - 两台服务器 Postgres 数据库之间的同步

java - 如何中断被阻塞的同步方法

java - 整数数组静态初始化

php - Doctrine PHP 问题