有状态组件与无状态组件

有状态组件还是无状态组件

在讨论状态使用的选择之前,让我们从服务组件开始。如前面所述,服务组件可以有状态也可以没有。无状态提供了更好的可伸缩性,因为调用之后不会继续占用服务器资源。

要创建一个无状态组件,你可以使用[JustInTimeActivation]特性,同时在方法上应用[AutoComplete]特性。

支持事务的组件总是无状态的。这样它们可以在事务正在运行时保持状态,而在事务完成或者中止后,这些组件都会被终止,这样状态也就随之丢之了。

要创建有状态的组件,你不用做任何其他特别的工作,只是不要应用[JustInTimeActivation]即可。

(译注:应用了[Transaction]特性之后,即时激活(JustInTimeActivation)会自动启用。所以无论是否应用了[JustInTimeActivation]特性,只要应用了[Transaction]特性,组件都是无状态的。)

如果你使用.NET Remoting来访问服务组件,那么组件是否有状态应该在.NET Remoting的配置文件中定义。客户端激活的(client-activated)对象是有状态的,而well-known对象是无状态的。

使用有状态组件,你将得到以下这些特性:

●   有状态组件不是持久的。在组件终止时状态会被丢失。支持事务的组件在事务结束后会失去状态。

●   如果状态经常改变,有状态组建可能是个好的选择。有状态组建允许极高速的状态改变,只要没有垮越进程边界——也就是说,如果调用者运行于同一个进程(如果服务组件被配置为类库激活,或者调用者是服务组件本身)。如果调用者在另一个机器中,那么访问状态信息需要更多的时间。

●   有状态组件的生存周期受制于那些对它的引用。只要存在一个引用,它就存活着,状态就会保持着。如果你使用.NET Remoting来访问服务组件,那么引用的保持受一个租约机制的控制。

●   有状态组件,与对它有引用的每个调用者都是相关联的。这种关联可以是与一个客户端应用程序;或者,如果引用被传递的话,那么这种关联也可以是与多个客户端应用程序。如果引用是共享的,需要注意同步问题。如果一个组件为多个客户端所共享,也许最好是设置同步选项[NotSupported],然后提供自定义的同步机制。这样,多个客户端就能并发访问该组件。当然,这么做的缺点是,你需要自己处理同步问题。

●   状态数据的大小受进程的制约。在32位的操作系统上,你只有2GB的用户空间可用。一个进程内的所有对象的状态都受这个上限的制约,不过,在远未达到这个上限之前,你得考虑下是否应该把状态数据放在数据库里面。

●   在使用组件的负载均衡(load-balancing)服务时,应该不使用有状态组件。使用组件的负载均衡服务时,对象分布在多个系统中以增强可伸缩性。由于状态不能在多个系统中共享,所以必须保证只访问相同系统上的有状态组件。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

honkerhero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值