DataSnap 2009 系列之三 (生命周期篇)

转载 2011年01月11日 15:41:00

(生命周期篇)

  DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置,当DSServer启动时从 DSServerClass组件读取LifeCycle属性的值。

  注意:LifeCycle的值由于在启动时就已经读取 启动后再修改LifeCycle的值将没有任何效果,LifeCycle属性的值可以是以下三种字符串之一。

   1.Session

  该选项为默认设置,每个连接都会建立一个独立的服务器对象为客户端提供服务,服务器对象在连接关闭后释放,因此多个客户端访问的是不同的服务器对象,是线程安全的。

  2.Invocation

  对于每次服务端方法调用建立一个独立的服务器对象为客户端提供服务,服务器对象在调用结束后释放,这个同样也是线程安全的,但是每次调用都创建和释放服务器对象对于频繁调用的系统影响很大,如果把服务端对象用对象池管理配合此种方式将是个非常不错的解决方案。

   3.Server

  所有的客户端使用同一个服务端对象,也就是该对象是单例的,需要开发人员自己来进行同步的控制,不是线程安全的。在服务端对象创建和释放时将触发DSServerClass的两个重要的事件OnCreateInstance和 OnDestroyInstance。在这里我们可以使用自定义创建和释放服务器对象 同样我们可以用于服务端对象池,下面我们把上一次的DEMO稍微改动下来观察下服务端对象的生命周期。

  我们先将DSServer组件的AutoStart设置为 False 然后拖上两个Button分别完成Start和Stop的调用

  在OnGetClass中记录服务启动时使用的生命周期

  LifeCycles是一个TRadioGroup存放了生命周期使用的三个字符串,最后在OnCreateInstance 和OnDestroyInstance事件中记录服务器对象的创建和释放。

  效果图

  通过Demo我们可以明显的看出三种生命周期的区别 注意切换生命周期需要先停止服务器再启动,但是在我们使用Invocation的时候 会造成内存泄露,打开服务端的 ReportMemoryLeaksOnShutdown 调用了两次方法后关闭服务端可以看到如下提示:

  可以看到服务端对象并没有释放,这里需要我们通过在OnDestroyInstance手动释放。

DSDestroyInstanceEventObject.ServerClassInstance.Free;

  但是我们会发现内存泄露依然存在TDSProviderDataModuleAdapter依然没有释放,这是由于 DataSnap2009中继承自TProviderDataModule的类都使用了适配器模式来支持旧的IAppServer接口,在服务端对象创建的过程TDSServerClass.CreateInstance中我们可以看到。

  因此在服务端释放的TDSServerClass.DestroyInstance中需要释放 TDSProviderDataModuleAdapter对象

  当使用Invocation生命周期时 传递的ServerClassInstance并不是TDSProviderDataModuleAdapter的对象

  所以尽管我们手动释放了我们的服务端对象 适配器对象任然造成了内存泄露

一句话、一张图记住Activity和Fragment之间错综复杂的生命周期关系

如果我们在Fragment和它的宿主Activity的生命周期中都加上Log日志,你能顺利写出他们的执行顺序吗?我们先来看一张Google官方的图片:咋一听,Activity生命周期有七个方法,Fra...
  • u012702547
  • u012702547
  • 2015年12月10日 21:03
  • 2300

5种项目生命周期模型(个人笔记)

1.项目生命周期定义参考网站:http://wiki.mbalib.com/wiki/%E9%A1%B9%E7%9B%AE%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F 2...
  • juliefish
  • juliefish
  • 2013年10月18日 17:23
  • 28266

Maven之——三套生命周期

摘要: 主要是Maven生命周期的概念、三套生命周期分别包含的各个阶段、以及各个阶段定义的目标。...
  • chenghuaying
  • chenghuaying
  • 2014年11月08日 11:44
  • 3995

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

Delphi2010中DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明
  • shuaihj
  • shuaihj
  • 2011年01月11日 15:29
  • 2332

maven学习日志之三 Maven的生命周期

1,生命周期的概念 Maven的生命周期就是为了对所有的构建过程进行抽象和统一。Maven的生命周期包括:项目清理、初始化、编译、测试、打包、集成测试、验证、部署和站点的生成等几乎全部的项目构建过程...
  • xuqiaobo
  • xuqiaobo
  • 2016年08月17日 09:16
  • 420

Spring 基础教程之三:JavaBean生命周期

 Spring中Bean的生命周期,在学习spring的过程中bean的生命周期理解对学习spring有很大的帮助,下面我就分别介绍在ApplicationContext和BeanFactory...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2014年03月28日 23:20
  • 413

《Android简单诠释系列》Activity生命周期简单诠释

  • 2012年08月12日 23:45
  • 51KB
  • 下载

Maven系列三:生命周期和插件

本文介绍持续集成
  • zdq0394
  • zdq0394
  • 2013年08月04日 17:09
  • 1076

Asp.Net生命周期系列三

Asp.Net生命周期系列三 上文讲到了HttpRunTime主要做了三个事情,我们先回忆一下。 第一:雇佣了项目经理(HttpApplication)。 第二:建立了HttpM...
  • lvjin110
  • lvjin110
  • 2013年10月30日 02:05
  • 595

会话EJB系列(三)SessionBean生命周期

EJB生命周期:指EJB在运行过程中经历的阶段和状态。 首先强调的是:SessionBean的生命周期是由容器控制的而不是应用程序!但是对于开发者而言,必须了解SessionBean在EJB中的运行规...
  • lantingxv_jing
  • lantingxv_jing
  • 2014年12月31日 15:59
  • 1581
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DataSnap 2009 系列之三 (生命周期篇)
举报原因:
原因补充:

(最多只允许输入30个字)