(生命周期篇)
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的对象
所以尽管我们手动释放了我们的服务端对象 适配器对象任然造成了内存泄露
分享到:
相关推荐
Invocation生命周期,Session生命周期,Server生命周期
Delphi XE7开发入门教程之DataSnap三层架构篇 主要是delphi 开发datasnap的案列 以前积分太多了,现在降下来 5个积分
DataSnap 2009学习范例.rar
Delphi XE7开发入门教程之DataSnap三层架构篇-第一部分
用Delphi2010的DATASNAP开发三层数据库应用源码。
客户端自定义SQL语句查询,服务器对客户端连接数的限制,获取客户端连接IP地址,对客户端的控制关闭,还有其他一些DATASNAP常用功能,没有使用第三方控件,服务端使用firedac控件,自带sqlite数据库,打开程式修改IP...
Delphi XE7开发入门教程之DataSnap三层架构篇
分8个章节讲述了如何用Delphi XE8 DataSnap开发系统
delphi XE8编写的DataSnap三层框架,可用于多平台开发Androd,iOS
Delphi XE7开发入门教程之DataSnap三层架构
《Delphi XE3 DATASNAP 开发实战篇》 附书源码
2.保证无毒 3.简单,方便,实用 4.实例可以自行改用 5.如有非法,本人无法律责任,由改动代码人负责! 6.需要更多本人作品,查找标签“朱建强” 7.请下载,杀毒后再使用!
对应delphi xe10.1的datasnap 三层结构完整服务端代码,两者配套为整体系统,适合初学者学习。
delphi xe10.1的datasnap 三层结构完整服务端开发源码,适合新手学习使用,我个人在网上找了很多资料,搭建起来的平台
XE datasnap实现三层文件传输。DELPHI源代码实例
delphi xe10的datasnap 三层结构完整服务端+源码 (测试可用) 适合新手学习使用,我个人在网上找了很多资料,搭建起来的平台
业务池,多账套,日记等功能多有 基于FMX 为后面跨平台做准备
花了一个星期的时间把Delphi 2010 Datasnap的三层架构搭了起来,对初学Datasnap非常有帮助,只需构搭了起来剩下的就是发挥你的工发大脑了。代码为分服务端和客户端
delphi2010中使用datasnap构建三层结构的简单示例