【问题标题】:Does jdbc provide a way to read the database process id/session id for a given connection?jdbc 是否提供了一种方法来读取给定连接的数据库进程 ID/会话 ID?
【发布时间】:2018-02-17 18:52:03
【问题描述】:

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

【问题讨论】:

    标签: oracle jdbc oracle11g liquibase ojdbc


    【解决方案1】:

    可以通过查询得到当前会话的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 知道是哪一个。

    【讨论】:

      【解决方案2】:

      据我了解 如果您从 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)
      

      【讨论】:

      • 谢谢。我知道 oracle 有这个信息,如果我可以访问上面的视图,我可以通过查询获得这个信息。我想知道的是是否有办法从 jdbc/驱动程序端获取它。可能是我的要求特定于 oracle,并且数据库服务器上的连接进程 ID 的通用定义不存在
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        2. 然后运行代码并在运行时在 db 端进行查询 选择模块,来自 v$session 的 sid 而且我们知道哪个java线程,连接映射到哪个Oracle SID。现在从 java 端我们可以使用 where module ="threadid" 查询 v$session 并在运行时在 java 中获取它!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-26
          • 2019-02-18
          • 1970-01-01
          • 2012-04-04
          • 1970-01-01
          • 2019-09-22
          • 1970-01-01
          • 2011-01-16
          相关资源
          最近更新 更多