我有一个普通的Windows服务,处理大型数据集并将其存储到数据库。这个Windows服务还用于托管一个WCF服务,该服务将处理的数据提供给一个或多个GUI。如何在WCF服务和托管服务的进程之间共享缓存的数据?
目前WCF服务必须至少打一次数据库才能获取客户端的数据,但数据集的大小非常慢,并且由于重复而消耗了大量内存数据的。理想情况下,我想直接(在内存中)与WCF服务共享数据处理的结果。有没有办法做到这一点?
我有一个普通的Windows服务,处理大型数据集并将其存储到数据库。这个Windows服务还用于托管一个WCF服务,该服务将处理的数据提供给一个或多个GUI。如何在WCF服务和托管服务的进程之间共享缓存的数据?
目前WCF服务必须至少打一次数据库才能获取客户端的数据,但数据集的大小非常慢,并且由于重复而消耗了大量内存数据的。理想情况下,我想直接(在内存中)与WCF服务共享数据处理的结果。有没有办法做到这一点?
是的,使用分布式缓存引擎。
基本上,分布式缓存引擎是运行在一台或多台机器上的独立进程,用于管理缓存。在它自己的进程这缓存站点,通常缓存引擎提供了一个API,用于访问数据
主要选项
是的。您需要在singleton mode中创建您的WCF主机。看到这个related question。
其实,我的一个同事发现有可能通过静态方法从主机访问WCF服务,而且你甚至不需要拥有se单身模式下的服务。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyWcfService : IMyWcfService
{
private static string messageFromHost;
public static void PassMessageFromHostToService(string message)
{
messageFromHost = message;
}
// Other methods fulfilling the service contract here...
}
从主机进程,那么你可以做到这一点要调用的方法:
MyWcfService.PassMessageFromHostToService("I'm a message from your host");
我不知道,如果这被认为是不好的做法,或是否会引起任何问题,我们的天堂”但是它似乎在为我工作:)
但请注意:以单例模式运行要么需要你编写大量的多线程安全代码(不容易!),或者你基本上需要序列化您的请求,在任何给定的时间只处理一个 - 都是**不是非常好的选择,真的...... – 2011-05-05 15:45:36
是的,虽然它不能很好地扩展,但我认为这是一个临时解决方案。缓存可能是更好的长期解决方案。 – Franchesca 2011-05-05 16:27:10