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实例的过程时更容易形成好的逻 ...
随机推荐
- test20181006 石头剪刀布
题意 分析 考场做法同题解一样. std代码. #include<bits/stdc++.h> using namespace std; template <typename T&g ...
- MySQL Disk--NAND Flash原理
====================================================== NAND Flash最小存储单元: 写数据操作: 通过对控制闸(Control Gate) ...
- leetcode:Reverse Words in a String【Python版】
class Solution: # @param s, a string # @return a string def reverseWords(self, s): ss = s.split(&quo ...
- knowledge 开源知识管理系统
knowledge 是一个不错的知识管理系统,基于markdown 我们可以方便的进行知识的标签 以及展示 使用docker-compose 运行 环境准备 docker-compose 文件 ver ...
- Ritchie Lawrence 批处理函数库中英文版
可以到这个网址去看看,如果你是注册用户,还可以下载到bat的很多函数库,具体地址如下: http://www.bathome.net/viewthread.php?tid=3056&extra ...
- JVM(下)
持久代:不会被 gc 给轻易回收的,创建后一直存在,持久代在堆内存里面,但是不归 java 程序使用.持久代是 动态 load 的那些 class,局部变量,去 gc 其实也 gc 不了啥 1.8 之 ...
- hadoop框架结构介绍
近年,随着互联网的发展特别是移动互联网的发展,数据的增长呈现出一种爆炸式的成长势头.单是谷歌的爬虫程序每天下载的网页超过1亿个(2000年数据,)数据的爆炸式增长直接推动了海量数据处理技术的发展.谷歌 ...
- ML(3): 贝叶斯方法
对于分类问题,我们每个人每天都在执行分类操作,只是我们没有意识到罢了.例如,当你看到一个陌生人,你的脑子下意识判断TA是男是女:你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱.那边有个非主流” ...
- 大数据工具篇之flume1.4-安装部署指南
一.引言 flume-ng是一个分布式.高可靠和高效的日志收集系统,flume-ng是flume的新版本的意思,其中“ng”意为new generate(新一代),目前来说,flume-ng 1.4是 ...
- windows平台安装配置Gitblit
1 安装配置jdk环境变量 2下载GitBlit,下载地址:http://www.gitblit.com或者http://gitblit.com 解压即可 3修改gitblit\data下defau ...