天天看點

PostgreSQL Oracle相容性之 session_id

PostgreSQL , session id

資料庫有會話的概念,用于區分每一個會話。會話ID是會話的唯一辨別。

PostgreSQL的基于程序的模型,每個連接配接會配置設定一個backend process,是以使用process id也可以作為會話ID來使用。

但是process id是會變的(在同一時間點唯一,但是會話退出後,其他會話建立的process 可能ID會與之前斷開的會話的process id一緻),實際上就是程序ID。

為了得到更真切的在整個時間跨度上全局唯一的session id,PostgreSQL是怎麼做的呢?

同一時刻是不可能出現兩個一樣的process id的,是以使用“會話啟動時間+PROCESS ID”可以作為一個叢集唯一的session id。

實際上PostgreSQL的log中也是這麼來表示session id的。

<a href="https://www.postgresql.org/docs/9.6/static/file-fdw.html">https://www.postgresql.org/docs/9.6/static/file-fdw.html</a>

LOG的例子

其中"59c0b9c0.1e2b1"就是session id。

對應的代碼如下:

src/backend/utils/error/elog.c

我們可以通過這種方法,定義一個擷取會話ID的函數

注意以上方法依舊有可能在時間跨度上出現重複的SESSION ID,比如在同一秒(建立、斷開過若幹個連接配接),因為前面隻精确到秒,是以還可能重複。

那麼可以改成這樣,就精确了。

如果你希望得到一個INT類型的SESSION ID,可以使用如下方法。

例子:

建立一個序列,擷取序列值,作為SESSION ID。因為序列值絕對不會重複,是以是可行的方法。

如下

這種方法獲得的session id,是庫級唯一的session id,如果你需要擷取整個叢集唯一的SESSION ID,請使用第一種方法。

PostgreSQL的其他Oracle相容性文檔: