Wcf服务和Db设置?

问题描述:

我被要求构建不同的WCF服务,其中每个服务都是针对sql做其他工作的。Wcf服务和Db设置?

我们有 db's。所有db's +连接字符串都在 xml文件中。 (文件系统文件)

服务托管在WAS iis 7.5。

因为每个服务都应该从db中读取,所以每个服务都引用一个DAL dll文件。

因此,这里有我们的组件:

enter image description here

我想将XML数据读取到CACHE(在第一个请求),并从即日起 - 从缓存中读取。 (读取文件每个reqeust是出问题)。

  • 想法#1 =的dll,在他的构造函数,在第一个请求将读取XML文件并加载到缓存。

所以dal将这个样子:

enter image description here

所以现在每个服务可以通过属性来访问该DLL的缓存对象。 (一个好处是当在单个文件上处理cache dependency时 - 所以当它改变时,我们应该只重新加载到一个位置)。

  • 想法#2 =当服务已启动,则XML加载到cache

所以现在,每个服务将是这样的:

服务#1:

enter image description here

服务#2:

enter image description here

..

缺点是在同一个文件

问题很多缓存依赖:

通过最佳实践经验和设计模式POV:这是首选的方法是什么?

附:xml文件更改频率1 /(1个月)

+2

为什么要使用外部xml文件,而不是.config文件? Web.config也不会在每个请求上进行物理读取,而且它使用起来微不足道,不是吗? –

+0

@PabloRomeo在web.config中写入意味着:1)将有[n]个条目(重复)... 2)更改一个值将重新启动应用程序..... 3)放置缓存依赖项没有意义在web.config文件中。 –

+0

是的,我同意所有这些,除了可能1),因为它似乎你会有相同数量的条目,5 ConnectionStrings无论哪种方式。 但是,从我的经验来看,连接字符串通常只会在部署过程中发生变化,但这不是您可能每隔一天都会更改的内容。这就是为什么我不认为我会成为一个问题。我通常首先采用KIS方法,除非需求确实要求物理独立的服务,当5个连接符之一发生变化时,服务不会重新启动。 –

首先,当谈到文件系统时,在Windows Server OS上,磁盘上方有一个内置缓存层。所以你对磁盘读取可能不会有太大的区别。当然,一次又一次解析相同的输入并不是一个好习惯,所以解析(标记化)的xml应该被缓存。

设计需要进一步澄清:

  1. 有只有DAL类的一个实例,在5个 服务之间共享?或者,想法1中描述的财产是静态的?

  2. 在理念2:当文件的变化,并说,连接字符串4 改变(和其他一切保持不变) - 只服务4 应该重新加载?

  3. 如果重新加载特定服务 - 是否会导致某种与其他(非新鲜)服务的不一致?

更新:

我仍然不知道我完全理解的情况,但这里是我,据我了解这样做:

的DAL应公开所有的接口数据相关的操作。

比方说,这是IDataGateway

现在,每个服务都有应该有实现IDataGateway实例的引用。该服务不应该意识到缓存机制。它只是消耗接口中的数据。

所以所有的缓存都是在服务之外完成的,就类和代码组织而言。

现在,高速缓存层依次实现IDataGateway,并且还使用IDataGateway的非高速缓存实例。这就是所谓的修饰器模式。非缓存实例将被注入到构造函数中。

现在,我建议每个服务都有自己的缓存IDataGateway的实例。这比单身人士(至少对我来说)更简单。而且由于数据不在服务之间共享,所以我们很酷。但是,如果数据在服务之间共享,则应该使用单个实例。

回到那5个实例和xml文件。

我们希望监控这个文件,一旦它发生变化,对吧?我们可以轻松编写我们自己的文件监视器,或者使用框架附带的文件监视器,或者我们可以看到CacheDependency类的源代码。

最简单的方法是让5个监视器看着同一个文件。这不算什么性能损失,因为定时器相当“便宜”。

但是,如果您希望减少系统所使用的资源,那么您可以使用单个显示器,让其发生事件FileChanged或类似事件。IDataGateway的5个缓存实现(这5个实例)中的每一个都应在其构造函数中注入此监视器,并将其自己的事件侦听器连接到FileChanged事件。
一旦触发了此事件,IDataGateway的所有5个缓存实例都将使其内部缓存无效,因此它们应清除它们的内存条目。

在下次调用时,IDataGateway的高速缓存实现将尝试从其内存缓存中取出非现有数据,但显然没有任何数据存在,因此应该继续执行非缓存中的相同方法执行IDataGateway,并填充其缓存。

那是我的设计,HTH ...

+0

嗨@龙谢谢你的回答。 #1)DAL是由这些服务引用的常规非静态类。如果我会选择解决方案1,那么是的 - 将会有一个静态属性,这将允许所有服务访问它的缓存.....#2)没有。当文件更改时,所有[n]服务都应该重新加载缓存(如果我们选择解决方案2)。每个服务都有缓存文件依赖性.......#3)没有。当服务被重新加载时 - 它只涉及到它的数据......以及什么连接信息**他**应该从无数据库访问数据库。 –

对于我的问题归结到谁真正需要了解的连接字符串:DAL层或服务?显然这是DAL。该服务没有(或不应该)关心DAL正在使用什么类型的数据存储 - 可能是磁盘上的一串CSV(对于所有关心的问题)。所以,把连接字符串放在服务中是没有意义的。 DAL需要连接信息,因此DAL应该注意找到并缓存它。