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事件自定义服务器对象的创建和自毁。这可以用来实现服务器端对象池。
DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明的更多相关文章
- Delphi2010中DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明
Lifecycle 三种属性: Session.Invocation.Server 这三种属性都用在什么情况,有什么要注意的事项,Delphi2010中罕有说明. 如果乱用这三种属性,你的服务程序有可 ...
- Hibernate实体对象的生命周期(三种状态)
瞬时状态(Transient) 通过new创建对象后,对象并没有立刻持久化,它并未与数据库中的数据有任何关联,此时Java对象的状态为瞬时状态. Session对于瞬时状态的Java对象是一无所知的, ...
- Delphi2010中DataSnap高级技术(转)
一. 为DataSnap系统服务程序添加描述 这几天一直在研究Delphi 2010的DataSnap,感觉功能真是很强大,现在足有理由证明Delphi7该下岗了. DataSnap有三种服务模式,其 ...
- 《React Native 精解与实战》书籍连载「React Native 中的生命周期」
此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...
- Jetpack 架构组件 Lifecycle 生命周期 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Java对象在JVM中的生命周期
当你通过new语句创建一个java对象时,JVM就会为这个对象分配一块内存空间,只要这个对象被引用变量引用了,那么这个对象就会一直驻留在内存中,否则,它就会结束生命周期,JVM会在合适的时 ...
- [转] IOS中AppDelegate中的生命周期事件的调用条件
IOS中AppDelegate中的生命周期事件的调用条件 //当应用程序将要进入非活动状态执行,在此期间,应用程序不接受消息或事件,比如来电 - (void)applicationWillResign ...
- Vue 实例中的生命周期钩子
Vue 框架的入口就是 Vue 实例,其实就是框架中的 view model ,它包含页面中的业务处理逻辑.数据模型等,它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻 ...
- 详解Vue 实例中的生命周期钩子
Vue 框架的入口就是 Vue 实例,其实就是框架中的 view model ,它包含页面中的业务处理逻辑.数据模型等,它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻 ...
随机推荐
- SQLite数据库学习小结——native层实现
1. SQlite概述 SQLite是一款轻量.快速.跨平台的嵌入式数据库,是遵守ACID(注:ACID指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consi ...
- SQL 存储过程入门(五)
好久没来博客园留下点东西,忙到找工作,最近把工作落实了. 最近公司的业务都是存储过程开发,发现去维护起来相当困难. 由于是维护项目,产品很久前都发布了,然而有一些修改,让我们去修改现在的逻辑,去看懂人 ...
- Linux 下V4l2摄像头采集图片,实现yuyv转RGB,RGB转BMP,RGB伸缩,jpeglib 库实现压缩RGB到内存中,JPEG经UDP发送功(转)
./configure CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld --host=arm-linux --prefix=/usr/loca ...
- Joyoi公路乘车(原tyvj1015)
题目:http://www.joyoi.cn/problem/tyvj-1015 水题.连优化都不用. #include<iostream> #include<cstdio> ...
- View绘制基本知识点
!通过阅读Android开发艺术探索整理 底层工作原理:测量流程.布局流程.绘制流程 常见回调方法:构造方法 onAttach onVisiblityChanged onDetach Vi ...
- Django 书籍分享(PDF)
轻量级Django 链接:https://pan.baidu.com/s/1FD5zdRIkzHI44SZ54fjt6Q 密码:6z50 精通Django 链接:https://pan.baidu.c ...
- ALGO-7_蓝桥杯_算法训练_逆序对
出处:http://blog.csdn.net/enjoying_science/article/details/44114035 (有难度,以后回来填坑) 阅读代码中: #include<st ...
- R语言学习——欧拉计划(11)Largest product in a grid
Problem 11 In the 20×20 grid below, four numbers along a diagonal line have been marked in red. 08 0 ...
- 小甲鱼-013元组tuple:上了枷锁的列表
1.创建和访问一个元组 1.1创建元组 元组的标志性符号是 , tuple1 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) #定义单个元素的元组,要加 , tuple2 = (1 ...
- tornado系列文章
http://www.nowamagic.net/academy/detail/13321030