您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

内置库 SQLSCRIPT_SYNC

在某些场景中,您可能需要让某些流程等待一段时间(例如,在执行重复任务时)。手动实施此类等待可能会导致“繁忙”等待,并导致 CPU 在等待期间执行不必要的工作。为避免这种情况,SQLScript 提供了一个内置库 SYS.SQLSCRIPT_SYNC,其中包含过程 SLEEP_SECONDS 和 WAKEUP_CONNECTION。

过程 SLEEP_SECONDS

此过程将当前流程置于暂停状态。它具有一个类型为 DOUBLE 的输入参数,该参数以秒为单位指定等待时间。最大精度为一毫秒 (0.001),但实际等待时间可能略长于给定时间(约 1-2 毫秒)。 备注如果将 0 或 NULL 传递给 SLEEP_SECONDS,则 SQLScript 执行器将不执行任何操作(也不会写入任何日志)。如果传递负数,则会收到错误。

过程 WAKEUP_CONNECTION

此过程将恢复等待进程。它具有一个类型为 INTEGER 的输入参数,用于指定等待连接的标识。如果此连接因调用过程 SLEEP_SECONDS 而等待,则休眠将终止,进程将继续。如果给定连接不存在或由于 SLEEP_SECONDS 而没有等待,则会引发错误。

如果调用 WAKEUP_CONNECTION 的用户不是会话管理员,并且与等待连接的用户不同,则也会引发错误。

备注如果会话已取消(使用 ALTER SYSTEM CANCEL SESSION 或 ALTER SYSTEM DISCONNECT SESSION),则等待进程也会终止。会话管理员可以唤醒任何休眠连接。休眠进程在监控视图 M_SERVICE_THREADS 中列出。其 LOCK_WAIT_NAME 以 'SQLScript/SQLScript_Sync/Sleep/' 开头。

限制

库不能在函数(标量或表格函数)和计算视图中使用。

示例

示例代码监控器CREATE PROCEDURE MONITOR ASBEGIN USING SQLSCRIPT_SYNC AS SYNCLIB; WHILE 1 = 1 DO IF RECORD_COUNT(OBSERVED_TABLE) > 100000 THEN INSERT INTO LOG_TABLE VALUES (CURRENT_TIMESTAMP, 'Table size exceeds 100000 records'); END IF; CALL SYNCLIB:SLEEP_SECONDS(300); END WHILE;END 示例代码恢复所有休眠进程CREATE PROCEDURE RESUME_ALL ASBEGIN USING SQLSCRIPT_SYNC AS SYNCLIB; DECLARE CURSOR WAITING_CONNECTIONS FOR SELECT CONNECTION_ID FROM M_SERVICE_THREADS WHERE LOCK_WAIT_NAME LIKE 'SQLScript/SQLScript_Sync/Sleep/%'; FOR C AS WAITING_CONNECTIONS DO CALL SYNCLIB:WAKEUP_CONNECTION(C.CONNECTION_ID); END FOR;END