创建 Delphi DataSnap 程序的问题集萃(2)

来源:互联网 发布:寒武纪科技知乎 编辑:程序博客网 时间:2024/05/17 00:12
(本文所讨论的开发环境,为 Delphi XE5)
    我们来看一看 DataSnap 服务器端各单元的创建顺序。
    以一个标准的 VCL 服务器端为例,创建方法如下:
    1.打开 XE5 的菜单 File - New - Other,选择 Datasnap Server - Datasnap Server,“下一步”中分别选择 “VCL Forms Application” - “默认” - “默认” - “TDSServerModule”,建好后,项目中一共 3 个单元,如下图:
    
    其中,ServerMethodsUnit1 提供了服务的实现方法。它由 ServerContainerUnit1 容器中的 DSServerClass1 代理,默认的生命周期是:Session。
    该服务器端运行时,首先创建了 Unit2 对应的 Form2,接着创建了 ServerContainerUnit1 容器。记住, ServerContainerUnit1 容器是在服务器端一开始运行时就创建,直到服务器端关闭、停止服务时才结束。
    ServerContainerUnit1 容器如下图所示,含 DSServer1、 DSServerClass1、DSTCPServerTransport1 三个控件:
当客户端连接上服务器并调用 ServerMethodsUnit1 中的方法时,按以下顺序执行:
    1.客户端连接到 DSTCPServerTransport1
2.连接到 DSServer1
    3.通过 DSServerClass1 创建一个新实例:ServerMethodsUnit1,然后执行相关方法。
    客户端断开时,按以下顺序断开:
    4.断开 DSServer1
    5.断开连接 DSTCPServerTransport1
    这里要说明的是,ServerMethodsUnit1 的生命周期。
    在服务端可以不止一个 ServerMethodsUnit,每个 ServerMethodsUnit 在 ServerContainerUnit1 容器中分别指定一个 DSServerClass 代理,可以为每个 ServerMethodsUnit 单独指定一种生命周期。对于 3 种不同生命周期的服务方法,调用时的执行方法也略有不同。
    (一) LifeCycle = Server
    执行到第 3 步时有变化。 3.如果 ServerMethodsUnit1 实例不存在,则通过 DSServerClass1 创建一个新实例,然后执行相关方法;否则,直接调用该实例的相关方法。该实例一直到服务停止才释放。
    (二) LifeCycle = Session
    第 1 步的变化:如果第一次连接,则连接到 DSTCPServerTransport1 ;否则跳过该步骤
    第 2 步的变化:如果第一次连接,则连接到 DSServer1 ;否则跳过该步骤
    第 3 步的变化:3.如果当前连接的 ServerMethodsUnit1 实例不存在,则通过 DSServerClass1 为当前连接创建一个新实例,然后执行相关方法;否则,直接调用该实例的相关方法。该实例一直到当前连接断开时释放。
    (三) LifeCycle = Invotation
    第 3 步的变化:3.通过 DSServerClass1 为当前连接创建一个新实例,然后执行相关方法。执行结束后释放该实例。

研究不同生命周期的执行顺序,对我们实现数据库连接以及对象池技术,有着重要的指导作用。
                                             
0 0
原创粉丝点击