TDSServerClass有一个属性LifeCycle,这个属性有三个值,很好理解
1.Session,这是默认值。说明:这是默认属性,也是delphi推荐设置。Session会为每个来自客户端的链接,建立一个线程来实例化。实例化是什么概念呢?就是这个线程把所有你将要用到的类、函数等等都建立好了,等待你客户端直接使用。这个线程和实例化并不释放,直到客户端中断连接。如果有300个客户端,那么你的服务器将会有300线程和实例,对服务器硬件和内存是个考验。适用环境:这个设置是线程安全的!
- 客户端数量少,每台服务器不超过连接数量: 200 x CPU个数 x (每个CPU核数x0.7) (这是经验值,稳定连接的数量,不是极限数量,别误解^_^),内存现在很便宜了,想加多大就多大!
- 客户端频繁调用服务器数据,无论连接数量是多少,最好都用这种设置。如果客户端很多,建议采用负载平衡和多台服务器来解决。
2.Server
顾名思义,就是全局就一个PersistentClass的实例,所有的连接Call上来的ServerMethod都是这唯一实例的调用,单例模式,当然,这也就不是线程安全的,需要自己来实现线程安全。说明:服务器对所有客户端连接使用一个实例,不是线程安全的。所以要自己控制客户端并发调用的问题(可以使用互斥、原子量等方法),让客户端的调用排成一队使用服务器资源。
适用环境:这个设置不是线程安全的
- 配置较低的服务器
- 服务器连接的另一端只能是单线程工作的模式
3.Invocation
这个更细,每次ServerMethod的Call,都将创建和销毁一PersistentClass的实例。由于创建销毁比较耗资源,可以操作TDSServerClass的OnCreateInstance和OnDestroyInstance事件,在这两个事件里面做缓存池。代码如下procedure TServerContainer1.DSServerClass1CreateInstance( DSCreateInstanceEventObject: TDSCreateInstanceEventObject); begin DSCreateInstanceEventObject.ServerClassInstance := 缓存池取一个实例 end; procedure TServerContainer1.DSServerClass1DestroyInstance( DSDestroyInstanceEventObject: TDSDestroyInstanceEventObject); begin 将DSCreateInstanceEventObject.ServerClassInstance的实例还给缓存池 end;
缓存池的实现见DATASNAP对象池章节。
说明:服务器只是建立连接,但是先不做实例化,只有当客户端请求功能的时候,服务器才开线程并实例化,当客户端用完后,服务器就释放线程和实例。
适用环境:这个设置是线程安全的!
- 如果客户端调用服务器数据频率低,这种方法很不错,会节约很多内存。