jdbc 是否提供了一种方法来读取给定连接的数据库进程 id/session id?

Does jdbc provide a way to read the database process id/session id for a given connection?

我正在尝试使用 liquibase 进行数据库更改(我们正在使用 oracle),我们的 DBA 提出的要求之一是记录 jdbc 连接的 ospid 和数据库会话 ID,以便他们可以如果需要,手动杀死它。我查看了 java.sql.Connection 界面,似乎没有可用于从 jdbc 连接中检索这些值的选项。我错过了什么 ?如果有人能指出一种方法来做到这一点,我将不胜感激。提前致谢

可以通过查询得到当前session的SID和OS进程ID:

SELECT s.sid, p.spid
FROM v$session s
JOIN v$process p ON p.addr = s.paddr 
WHERE sid=sys_context('USERENV','SID') ;

您的 DBA 必须授予您访问 V$SESSION 和 V$PROCESS 的权限。

但是,我不太明白这个要求。如果会话导致问题,DBA 会第一个通过 Oracle Enterprise Manager 知道是哪个会话。

据我了解 如果您从 JDBC 连接执行以下查询,它将为您提供所需的信息

SELECT s.sid, s.serial#, p.spid, s.osuser, s.program FROM v$session s, v$process p WHERE p.addr = s.paddr and s.sid in (select distinct sid from v$mystat)

JDBC API 本身没有任何东西可以获取此信息。您将需要使用特定于驱动程序的扩展,或查询信息,如其他答案所示。

今天,我也陷入了寻找哪个线程是 运行 哪个 Oracle 会话 ID 的情况。基本上,我使用连接池在多线程中获取连接,并在每个线程中将 I/O 写入全局临时 table (GTT)。如果会话 ID 不同,则写入一个线程的数据对其他线程不可见。 因此,在这样做的同时,我需要知道哪个线程(有自己的连接)正在使用哪个 SID。我发现可以通过在 setClientInfo 中从 Java 端发送标记,然后我们可以在数据库查询 select 模块中看到来自 v$session 的 sid。实际步骤为:

  1. 在java端,获取连接后,设置客户端信息

    连接con = dbcpDs.getConnection(); con.setClientInfo("E2E_CONTEXT.MODULE","threadid");

  2. 然后 运行 代码和数据库端 运行ning 你可以像这样查询 select 模块,来自 v$session 的 sid 我们知道哪个 java 线程,连接映射到哪个 Oracle SID。现在从 java 端我们可以使用 where module ="threadid" 查询 v$session 并在 java 的 运行 时间获取它!