实现多个跨程序池共享Session [高效]
简要介绍,本文主要内容是实现通过自己的Sql Server的Session存储机制实现,通过存储过程实现忽略程序标识的区别,达到多程序池间Session数据共享的目的。
详细原文:
本文转载人数己经太多,所以不知道原文地址何处,敬请谅解!
大致思路:
采用SqlServer方式存储Session,分析数据库表结构、原理、流程,大致可以得到SqlServer存储Session的方法:表结构:
ASPStateTempApplications表存储应用程序Id及名称
ASPStateTempSessions表存储具体的Session值不同的应用程序会在ASPStateTempApplications中注册不同的数据,从而在ASPStateTempSessions中有不同的Session,如果要实现Session共享,可以用欺骗SqlServer的方法:用某种方法使得不同的应用程序访问数据库时用相同的App!为了达到
这个目的,分析[dbo].[TempGetAppID]这个存储过程,代码如下:1 ALTER PROCEDURE [dbo].[TempGetAppID]
2 @appName tAppName,
3 @appId int OUTPUT
4 AS
5 SET @appName = LOWER(@appName)
6 SET @appId = NULL
7
8 SELECT @appId = AppId
9 FROM
[Herald.Session].dbo.ASPStateTempApplications
10 WHERE AppName = @appName
11
12 IF @appId IS NULL BEGIN
13 BEGIN TRAN
14
15 SELECT @appId = AppId
16 FROM
[Herald.Session].dbo.ASPStateTempApplications WITH (TABLOCKX)
17 WHERE AppName = @appName
18
19 IF @appId IS NULL
20 BEGIN
21 EXEC GetHashCode @appName,
@appId OUTPUT
22
23 INSERT
[Herald.Session].dbo.ASPStateTempApplications
24 VALUES
25 (@appId, @appName)
26
27 IF @@ERROR = 2627
28 BEGIN
29 DECLARE @dupApp tAppName
30
31 SELECT @dupApp =
RTRIM(AppName)
32 FROM
[Herald.Session].dbo.ASPStateTempApplications
33 WHERE AppId = @appId
34
35 RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and
''%s''. Please rename the 1st application to resolve the problem.',
36 18, 1, @appName, @dupApp)
37 END
38 END
39
40 COMMIT
41 END
42
43 RETURN 0。