WCF -在调用之间共享/缓存数据
本文关键字:缓存 数据 共享 之间 调用 WCF | 更新日期: 2023-09-27 18:13:19
我是WCF的新手;服务开发,有以下问题。
我想写一个服务,它依赖于一些数据(从数据库为例),以处理客户端请求和回复。我不想在数据库中查找每一个呼叫。我的问题是,是否有任何技术或方法,使我可以加载这些数据,要么提前或只一次,这样它就不需要去获取这个数据为每个请求?
我读到有InstanceContextMode到单可以是一个坏主意(不完全确定为什么)。谁能解释一下处理这种情况的最好办法是什么?
谢谢
BCL有一个专门用于此目的的Lazy
类。不幸的是,在发生短暂异常(网络问题、超时等)的情况下,它会永远存储异常。这意味着如果发生这种情况,您的服务将永远关闭。这是不可接受的。因此Lazy
类是不可用的。微软已经声明他们不愿意解决这个问题。
处理这个问题的最好方法是编写自己的lazy或使用等效的东西。
您也可以使用LazyInitializer
。参考文档
我不知道实例模式Single
在异常情况下的行为。在任何情况下,将惰性资源放入服务类在架构上都是不明智的。如果你想与多个服务共享这些资源,那就有问题了。这也不是服务类的责任
这完全取决于要加载的数据量和数据使用模式。
假设您的服务调用是独立的,并且可能需要不同部分的数据,那么您可以实现一些缓存(使用Lazy<T>
或类似的技术)。但是这个解决方案有一个重要的警告:一旦数据被加载到缓存中,它将永远存在,除非您定义一些过期策略(基于时间或写时刷新或其他)。如果您没有缓存条目过期策略,您的服务将随着时间的推移消耗越来越多的内存。
如果从数据库加载的数据量很小,或者大多数调用一次又一次地访问相同的数据,那么这可能不是太重要的问题。
另一种方法是使用WCF会话(将InstanceContextMode
设置为PerSession
)。这将确保您为会话的生命周期创建了服务对象(当特定的WCF客户端连接时,该服务对象将处于活动状态),并且来自该客户端的所有调用将被分派到相同的服务对象。从业务领域的角度来看,它可能合适,也可能不合适。如果这是合适的,那么您可以在第一次调用时从数据库加载数据,然后在同一会话中的后续调用将能够重用该数据。新的会话(另一个客户端或重新连接后的同一个客户端)必须重新加载数据。