Предоставляет ли jdbc способ чтения идентификатора процесса/сеанса базы данных для данного соединения?

Я пытаюсь использовать liquibase для изменений базы данных (мы используем oracle), и одним из требований, выдвинутых нашим администратором баз данных, было регистрировать идентификатор сеанса ospid и db соединения jdbc, чтобы они могли убить его вручную, если возникнет необходимость. Я просмотрел интерфейс java.sql.Connection, и, похоже, нет возможности получить эти значения из соединения jdbc. Я что-то пропустил ? Буду очень признателен, если кто-нибудь подскажет, как это сделать. заранее спасибо


person Jiss Janardhanan    schedule 08.09.2017    source источник


Ответы (4)


Вы можете получить SID и идентификатор процесса ОС текущего сеанса с помощью запроса:

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

Ваш администратор базы данных должен предоставить вам доступ к V$SESSION и V$PROCESS.

Однако я не очень понимаю требования. Если сеанс вызывает проблемы, администратор базы данных первым узнает, какой из них, через Oracle Enterprise Manager.

person fhossfel    schedule 08.09.2017

Насколько я понимаю, если вы выполните следующий запрос из своего соединения 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)
person nitin.sharma0180    schedule 08.09.2017
comment
Спасибо. Я знал, что у оракула есть эта информация, и я мог получить эту информацию с помощью запроса, если у меня был доступ к представлениям выше. Я хотел знать, есть ли способ получить его со стороны jdbc/драйвера. Возможно, мое требование относится к оракулу, и общего определения идентификатора процесса подключения на сервере базы данных не существует. - person Jiss Janardhanan; 08.09.2017

В самом JDBC API нет ничего, чтобы получить эту информацию. Вам нужно будет использовать либо расширения для конкретного драйвера, либо запросить информацию, как показано в других ответах.

person Mark Rotteveel    schedule 09.09.2017

Сегодня я тоже попал в ситуацию, чтобы найти, какой поток работает с каким идентификатором сеанса Oracle. По сути, я использую пул соединений, чтобы получить соединение в многопоточном режиме, и выполнял ввод-вывод записи в глобальную временную таблицу (GTT) в каждом потоке. Данные, записанные в одном потоке, не будут видны другому потоку, если идентификаторы сеанса отличаются. Итак, при этом мне нужно было знать, какой поток (имеющий собственное соединение) использует какой SID. Я обнаружил, что это возможно, отправив тег со стороны Java в setClientInfo, а затем мы увидим модуль выбора запроса БД, sid из v$session. Фактические шаги будут такими:

  1. На стороне java после получения соединения установите информацию о клиенте

    Соединение con = dbcpDs.getConnection(); con.setClientInfo(E2E_CONTEXT.MODULE,threadid);

  2. Затем запустите код, и на стороне базы данных во время его работы вы можете запросить, например, выбрать модуль, sid из v$session. И мы знаем, какой поток Java, соединение сопоставлено с каким SID Oracle. Теперь со стороны java мы можем запросить сеанс v$ с помощью where module =threadid и получить его во время выполнения в java!

person user3072859    schedule 17.10.2020