Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere Web 服务 » 使用 HTTP 会话

 

管理

Web 应用程序可能需要一种用于跟踪数据库服务器内活动会话使用情况的方法。使用 NEXT_CONNECTION 函数调用遍历活动数据库连接,并检查与会话相关的属性(如 SessionID)即可找到会话数据。以下 SQL 代码演示了此方法:

CREATE VARIABLE conn_id LONG VARCHAR;
CREATE VARIABLE the_sessionID LONG VARCHAR;
SELECT NEXT_CONNECTION( NULL, NULL ) INTO conn_id;
conn_loop:
LOOP
    IF conn_id IS NULL THEN
        LEAVE conn_loop;
    END IF;
    SELECT CONNECTION_PROPERTY( 'SessionID', conn_id ) 
        INTO the_sessionID;
    IF the_sessionID != '' THEN
        PRINT 'conn_id = %1!, SessionID = %2!', conn_id, the_sessionID;
    ELSE
        PRINT 'conn_id = %1!', conn_id;
    END IF;
    SELECT NEXT_CONNECTION( conn_id, NULL ) INTO conn_id;
END LOOP conn_loop;
PRINT '\n';

如果查看数据库服务器消息窗口,可能会看到类似以下的输出。

conn_id = 30
conn_id = 29, SessionID = session_63315442223323
conn_id = 28, SessionID = session_63315442220088
conn_id = 25, SessionID = session_63315441867629

显式删除属于某会话的连接会导致连接关闭并删除该会话。如果要被删除的连接当前正用于为 HTTP 请求提供服务,则将对该请求设置删除标记,并向其发送一个取消信号以终止该请求。当请求终止时,会话即被删除,并且连接关闭。如删除或更改会话 ID中所述,删除该会话会导致该会话队列上的待执行请求进行重新排队。如果连接当前处于非活动状态,则对会话设置删除标记,并将其重新排队为会话超时队列的起点。在下一个超时周期中(通常在 5 秒内)将删除该会话和连接。新 HTTP 请求不可以使用具有删除标记的任何会话。

在无条件停止数据库运行时,会删除每个数据库连接,这将导致该数据库上下文中的所有会话都被删除。这种情况是肯定要发生的,因为对于一个会话上下文必须存在一个有效的数据库连接,并且一个数据库连接一次仅可与一个会话相关联。会话和数据库连接必须在同一个数据库上下文内。

有关数据库上下文中会话的详细信息,请参见创建 HTTP 会话中对会话密钥的说明。