COM+ 实时激活概念

实时 (JIT) 激活服务促使 COM+ 能够停用对象,而客户端仍保留对该对象的活动引用。 下次客户端调用对象的方法时,并且客户端认为该方法仍然处于活动状态,COM+ JIT 激活服务会以透明方式实时将对象重新激活到客户端。

使用 COM + JIT 激活的主要优点是,客户端可以根据需要将对象引用保留任意时长,而不必占用宝贵的服务器资源(如内存)。 其他重要好处包括:

  • 使用 COM+ JIT 激活服务大幅简化了客户端的编程模型,因为客户端不必考虑编程模型如何使用昂贵的服务器对象和服务器资源。 如果没有 JIT 激活,当客户端经常需要调用和释放对象时,可能会招致严重的损失。

    注意

    可以使用 COM+ 对象池服务进一步优化此性能优势。 通过共用 JIT 激活的对象,可以极大地加快客户端对象重新激活的速度,同时重用它们可能保留的资源,从而可更精确地控制服务器上的给定对象使用的内存量。 有关更多详细信息,请参阅对象池和 COM+ JIT 激活

     

  • 对于分布式应用程序,创建每个对象都需要昂贵的网络往返,因此客户端离服务器越远,激活和封送服务器对象、打开声道以及设置代理和存根的成本就越大。 通过使用 COM+ JIT 激活服务,可以最大程度地减少创建对象的频率,从而显著提高应用程序的性能。

  • 使用 COM+ JIT 激活来激活客户端保留其长期引用但不一定总是使用的对象时,保持这些对象活动时并不一定会占用服务器内存。 这可以显著提升应用程序的可伸缩性。 客户端看到的唯一性能命中是重新激活对象所需的时间,通常只是比为对象分配内存所需的时间略多,而远低于远程对象创建产生的网络往返时间。

启用 COM+ JIT 激活

可以使用组件服务管理工具或 管理函数为组件启用 COM+ JIT 激活服务。 有关如何执行此操作的详细信息,请参阅为组件启用 JIT 激活

COM+ JIT 激活可以与其他 COM+ 服务交互,例如:

  • 当组件需要事务时,会自动为其启用 JIT 激活。 有关更多详细信息,请参阅事务和 COM+ JIT 激活
  • 为 JIT 激活启用组件后,会自动将同步设置为 Required。 这意味着,如果两个客户端同时调用激活 JIT 的组件,并返回其中一个组件的方法调用,导致对象被停用,那么另一个客户端不会陷入困境。

如何触发停用

COM+ 将根据对象上下文上的完成位的状态停用对象。 在给定的方法调用期间,对象可以使用此位来指示它是否已完成,即是否已准备好停用。 有关详细信息,请参阅设置完成位

使用自动完成属性

使用组件服务管理工具,可以配置方法,以便在方法返回时自动停用对象。 (请参阅为方法启用自动完成,以获取有关如何设置此属性的说明。)通过选择此选项,可以消除用于在事务中投票的重复方法调用。 由于一致性位的默认设置为 True,因此,如果已将完成位更改为 True,并且不执行任何操作来更改这些设置,则方法返回后会自动调用 IObjectContext::SetComplete

但是,此行为有一个注意事项:COM+ 将检查该方法返回的 HRESULT。 如果该 HRESULT 指示失败,则将一致性位设置为 False,并且结果与调用 IObjectContext::SetAbort 时的结果相同。

总之,如果为某个方法选择自动完成,并且不执行任何操作来设置任何位,并且返回 HRESULT(hr),则适用以下内容:

  • 如果 SUCCEEDS(hr),则就像调用 SetComplete 一样。
  • 如果 FAILED(hr),则就像调用 SetAbort 一样。

使用 IObjectControl 管理对象激活和停用

可以实现 IObjectControl 接口,以便 COM+ 运行时自动管理对象的停用和重新激活。 当对象实现此接口时,COM+ 会在停用对象时调用 IObjectControl::Deactivate,而在重新激活对象时调用 IObjectControl::Activate。 这些方法会在对象激活时启用自动上下文初始化,并在停用时启用状态清理。

如果正在共用使用 COM+ JIT 激活的对象,强烈建议实现 IObjectControl。 有关更多详细信息,请参阅对象池和 COM+ JIT 激活

无状态性和 JIT 激活

事务对象一定是无状态,因为不能跨事务边界共享状态。 因此,仅当对象不保留会在停用时丢失的状态时,才将使用 JIT 激活;否则,将违反事务隔离。 由于事务对象的自然使用模式,即事务对象会执行一些工作单元并在事务提交或中止时释放对象,因此 JIT 激活和自动事务紧密相关。 将对象配置为需要事务时,会自动启用 COM+ JIT 激活。

COM+ 实时激活任务

对象池和 COM+ JIT 激活

事务和 COM+ JIT 激活