DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

From http://blog.csdn.net/sunstone/article/details/5282666

DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

Lifecycle 三种属性: Session、Invocation、Server

这三种属性都用在什么情况,有什么要注意的事项,Delphi2010中罕有说明。

如果乱用这三种属性,你的服务程序有可能崩溃,数据混乱,内存占用大,效率低等问题!

下面我对这三种属性的使用环境逐一介绍:

1. Session

说明:这是delphi2010中默认属性,也是delphi推荐设置。Session会为每个来自客户端的链接,建立一个线程来实例化。实例化是 什么概念呢?就是这个线程把所有你将要用到的类、函数等等都建立好了,等待你客户端直接使用。这个线程和实例化并不释放,直到客户端中断连接。如果有 300个客户端,那么你的服务器将会有300线程和实例,对服务器硬件和内存是个考验。

 这表示服务器将为每一个客户端Socket链接创建不同的对象,即,每个客户端将有一个独立的服务器对象。服务器对象将在连接关闭时被释放。当服务器对象是一个数据模块时每个客户端将有独自的状态和单独的数据库访问,或许有自己的数据库链接组件。这是默认的设置。

适用环境:这个设置是线程安全的!

  • 客户端数量少,每台服务器不超过连接数量: 200 x CPU个数 x (每个CPU核数x0.7) (这是经验值,稳定连接的数量,不是极限数量,别误解^_^),内存现在很便宜了,想加多大就多大!
  • 客户端频繁调用服务器数据,无论连接数量是多少,最好都用这种设置。如果客户端很多,建议采用负载平衡和多台服务器来解决。

如果是HTTP调用方式,那么没一次调用函数,一次get一次post,都会完成create到destory的过程。

如果是tcp连接方式,那么才有意义。登录系统时创建,退出系统时销毁,中间调用函数一直保持连接。

2. Invocation

说明:服务器只是建立连接,但是先不做实例化,只有当客户端请求功能的时候,服务器才开线程并实例化,当客户端用完后,服务器就释放线程和实例。

 表示每次调用服务器方法时将创建一个新的服务器对象(和销毁)。这是一个典型的无状态行为,这是服务器有极高的可扩展性,但相同的数据将被多次重复读取。

 适用环境:这个设置是线程安全的!

  • 如果客户端调用服务器数据频率低,这种方法很不错,会节约很多内存。

3. Server

说明:服务器对所有客户端连接使用一个实例,不是线程安全的。所以要自己控制客户端并发调用的问题(可以使用互斥、原子量等方法),让客户端的调用排成一队使用服务器资源。

 表示一个单独的共享服务器。每个客户端将使用同一个服务器对象实例,相同数据,可能会引起数据同步的问题(不同的客户端调用是由不同的服务器线程执行)。访问共享服务器对象必须由同步技术所保护(例如使用TMonitor记录)。

 适用环境:这个设置不是线程安全的!!

  • 配置较低的服务器
  • 服务器连接的另一端只能是单线程工作的模式

除了使用这些默认设置,你可以使用DSServerClass的OnCreateInstance和OnDestroyInstance事件自定义服务器对象的创建和自毁。这可以用来实现服务器端对象池。

原文地址:https://www.cnblogs.com/cb168/p/4235415.html