移植 Oracle DBMS_ALERT 功能至 DB2,實現多會話間異步消息傳遞:一會話發送(Signal),另一會話等待接收(WaitOne/WaitAny),支持超時、註冊/刪除警告。
ALERTS.DBMS_ALERT_INFO 存儲警告名、會話 ID、消息、狀態標誌REGISTER、SIGNAL、WAITONE、WAITANY、REMOVE、DELETEDELAY(秒) 實現輪詢間隔(Java 實現 Thread.sleep)、SESSION_ID() 獲取會話標識(C 實現)CREATE TABLE ALERTS.DBMS_ALERT_INFO (
NAME VARCHAR(60) NOT NULL,
SID VARCHAR(50) NOT NULL,
MESSAGE VARCHAR(1800),
CHANGED CHAR(1) NOT NULL DEFAULT 'N',
CONSTRAINT PK_DBMS_ALERT_INFO PRIMARY KEY (NAME),
CONSTRAINT CC_DBMS_ALERT_INFO CHECK (CHANGED IN ('Y','N','y','n'))
);
GRANT SELECT,INSERT,UPDATE,DELETE ON ALERTS.DBMS_ALERT_INFO TO PUBLIC;
| 過程 | 核心邏輯 |
|---|---|
| REGISTER(name) | 插入/更新記錄,設置 SID=SESSION_ID(),MESSAGE=NULL,CHANGED='N' |
| SIGNAL(name, msg) | 更新指定 NAME 記錄的 MESSAGE 與 CHANGED='Y' |
| WAITONE(name, timeout) | 輪詢檢查 CHANGED='Y',讀取 MESSAGE,清空並重置 CHANGED='N',默認 5 秒輪詢間隔 |
| WAITANY(timeout) | 掃描全表尋找 CHANGED='Y',返回首個匹配的 NAME/MESSAGE,指數退避輪詢(1s,2s,4s...) |
| REMOVE(name) | 僅創建者會話可刪除 |
| DELETE(name) | 任意會話可刪除 |
DELAY:Java FENCED UDF,調用 Thread.sleep,比 SQL 循環高效SESSION_ID:C UDF,讀取 SQLUDF_DBINFO 結構獲取會話標識alert.zip,編輯 alertsetup.bat 設置 DB2HOMEPATH 與 JAR 路徑alertsetup.bat SAMPLE user pwd-- 會話 A
CALL ALERTS.REGISTER('abc');
CALL ALERTS.SIGNAL('abc', 'Hello from A');
-- 會話 B
CALL ALERTS.WAITONE('abc', ?, ?, 30); -- 接收消息
-- 會話 A 註冊新警告
CALL ALERTS.REGISTER('xyz');
CALL ALERTS.SIGNAL('xyz', 'Msg via xyz');
-- 會話 B 等待任意
CALL ALERTS.WAITANY(?, ?, ?, 30);
-- 清理
CALL ALERTS.REMOVE('abc'); -- 僅 A 可成功
CALL ALERTS.DELETE('xyz'); -- B 可成功