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

Oracle jdbc是否提供了一种读取给定连接的数据库进程id/会话id的方法?,oracle,jdbc,oracle11g,liquibase,ojdbc,Oracle,Jdbc,Oracle11g,Liquibase,Ojdbc,我正在尝试使用liquibase进行数据库更改(我们正在使用oracle),我们的DBA提出的一个要求是记录jdbc连接的ospid和db会话id,以便在需要时可以手动终止它。我查看了java.sql.Connection接口,它似乎不是从jdbc连接中检索这些值的可用选项。我错过什么了吗?如果有人能指出这样做的方法,我将不胜感激。提前感谢您可以通过查询获得当前会话的SID和操作系统进程ID: SELECT s.sid, p.spid FROM v$session s JOIN v$proces

我正在尝试使用liquibase进行数据库更改(我们正在使用oracle),我们的DBA提出的一个要求是记录jdbc连接的ospid和db会话id,以便在需要时可以手动终止它。我查看了java.sql.Connection接口,它似乎不是从jdbc连接中检索这些值的可用选项。我错过什么了吗?如果有人能指出这样做的方法,我将不胜感激。提前感谢

您可以通过查询获得当前会话的SID和操作系统进程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$会话和V$进程的访问权


然而,我并不真正理解这个要求。如果会话导致问题,DBA会首先通过Oracle Enterprise Manager知道是哪一个问题。

您可以通过查询获得当前会话的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$会话和V$进程的访问权

然而,我并不真正理解这个要求。如果某个会话导致了问题,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连接执行以下查询,它将为您提供所需的信息

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)

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

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

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

  • 在java端,在获得连接后,设置客户端信息

    Connection con=dbcpDs.getConnection(); con.setClientInfo(“E2E_CONTEXT.MODULE”、“threadid”)

  • 然后运行代码,在db端运行时,您可以像 从v$会话中选择模块、sid 我们知道哪个java线程、连接映射到哪个Oracle SID。现在,从java端,我们可以使用where module=“threadid”查询v$会话,并在java运行时获取它


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

  • 在java端,在获得连接后,设置客户端信息

    Connection con=dbcpDs.getConnection(); con.setClientInfo(“E2E_CONTEXT.MODULE”、“threadid”)

  • 然后运行代码,在db端运行时,您可以像 从v$会话中选择模块、sid 我们知道哪个java线程、连接映射到哪个Oracle SID。现在,从java端,我们可以使用where module=“threadid”查询v$会话,并在java运行时获取它


  • 谢谢我知道oracle有这个信息,如果我能够访问上面的视图,我可以通过查询获得这个信息。我想知道的是,是否有一种方法可以从jdbc/驱动端获得它。这可能是因为我的需求特定于oracle,并且数据库服务器上不存在连接进程id的通用定义。谢谢。我知道oracle有这个信息,如果我能够访问上面的视图,我可以通过查询获得这个信息。我想知道的是,是否有一种方法可以从jdbc/驱动端获得它。这可能是因为我的需求特定于oracle,数据库服务器上不存在连接进程id的通用定义