我正在使用Apache的TWebModule。如果我理解正确,如果以前创建的所有对象都忙于处理请求,Apache将生成我的TWebModule对象的另一个实例。这是对的吗?
我创建了自己的SessionObject,并创建了一个TStringList来存储它们。 StringList是在我的源代码文件底部的初始化部分中创建的,其中包含TWebModule对象。我发现可以多次调用初始化(大概是当Apache必须生成另一个进程时)。
有没有办法让全局“Sessions”TStringlist来保存我的所有会话对象?或者是“安全”,正确的方法将会话信息存储在数据库中并根据每个请求的cookie检索它?
我想要的原因是减少数据库访问,而是将会话信息保存在内存中。
感谢。
答案 0 :(得分:2)
正如Stijn建议的那样,使用单独的存储来保存会话数据确实是最好的方法。更好的方法是尝试编写应用程序,以便Web浏览器在设计中包含固有的状态。这将大大提高将应用程序扩展到数千或数万个并发用户的能力,而硬件更少。
Intraweb是一个很好的选择,但是在更多并发用户(甚至是IDLE用户)需要更多硬件支持的意义上,存在规模问题。从一开始就设计一个尽可能内部无状态运行的服务器的方法要好得多。当然,如果您拥有固定数量的用户并且不期望任何增长,那么这不是一个问题。
答案 1 :(得分:1)
这很奇怪。如果初始化部分被多次调用,可能是因为DLL被加载到不同的进程空间中。我能想到的一个选项是在初始化时创建它时检查“Sessions”对象是否已经存在。如果DLL真的被加载到单独的进程中,这将无济于事,然后我建议编写一个中央会话存储过程并使用TWebModule中的进程间通信(有几种方法:消息,命名管道,COM。 ..)
答案 2 :(得分:0)
Intraweb可以非常顺利地处理会话管理和数据库访问,并且可以很好地扩展。 I've commented on it previously。虽然这并没有直接回答你问的问题,但当我遇到同样的问题时,Intraweb为我解决了这些问题。