我有一个用 C# (ServicedComponent) 编写的 COM+ 应用程序。在所有情况下,应用程序池大小 > 1。我正在使用 SharedPropertyGroups 来保留和共享数据。根据我的测试,尚不清楚应用程序的所有正在运行的实例是否共享相同的值。
存储在 SharedPropertyGroup 中的属性是否在同一个 COM+ 应用程序的所有实例之间共享?
我有一个用 C# (ServicedComponent) 编写的 COM+ 应用程序。在所有情况下,应用程序池大小 > 1。我正在使用 SharedPropertyGroups 来保留和共享数据。根据我的测试,尚不清楚应用程序的所有正在运行的实例是否共享相同的值。
存储在 SharedPropertyGroup 中的属性是否在同一个 COM+ 应用程序的所有实例之间共享?
每个应用程序池(DLLHost 进程)都将获得它自己的共享属性管理器。来自COM+ 共享属性管理器概念:
“存储在 SPM 中的共享属性仅对在同一进程中运行的对象可用。”
因此,共享属性管理器将让您在一个应用程序(池实例)内共享瞬态。
如果您想在多个进程之间共享状态,那么您可能希望查看进程外缓存方法(例如,Windows Server AppFabric 缓存或数据库,具体取决于要求)。
另请参阅.NET Enterprise Services 和 COM+ 1.5 Architecture,其中描述了使用应用程序池时的一些问题:
共享属性管理器 (SPM) 使用的内存是特定于进程的。应用程序池可能会影响任何假定它正在使用该机器上的唯一 SPM 实例的应用程序。对于使用应用程序池的 COM+ 组件的所有实例,不再有任何通用的最高级别数据存储(因为组件可以跨越进程)。或者,您可以使用缓存的中间层数据库来存储公共状态,这些状态不仅会跨越进程中的实例,还会跨越进程。执行此操作时,您可能需要考虑使用一个池化组件来保持与数据库的持久连接,专门用于中间层序列化操作。实际上,由于 SPM 的锁定和性能问题,即使没有应用程序池,这也是一个更好的选择。