2011-08-14 73 views
0

我有一些相关的实体支持级联修正方面/缺失(用户,用户角色,用户和角色的权限)。
应用服务器经常使用它,我需要实现快速访问。为此,我将它放到应用程序缓存中。
问题是如何在数据执行级联操作时提供数据库和高速缓存之间的同步?例如,如果我放弃某个角色,我还需要删除所有角色权限,或者如果我放弃用户,则需要删除其所有角色和权限。
我看到了许多方法来支持缓存中的实际数据,但我也看到了一些缺点。请告诉我什么是最佳解决方案。缓存相关数据

  1. 所有级联操作都是在数据库中使用触发器进行的。该应用程序通过SqlCacheDependency机制接收通知。问题:服务器负载过重怎么办?数据库/应用程序服务器会提供很多精确的依赖关系,例如“select SomeField from DataTable where id = @x”,会延迟通知吗?
  2. 所有级联操作都是在应用程序的业务层进行的。每个数据库更新/删除操作之后都是高速缓存失效操作。问题:增加了一倍逻辑和高网络流量(许多更新,而不是一个)
  3. 在DB级联操作,在高速缓存中的级联废票使用CacheDependency。问题是:逻辑加倍。

有什么好的解决办法? 谢谢!

+0

> 2)所有级联操作都在应用程序的业务层作出>>我的意思是数据接取层 – Jim

+0

确实实体框架提供了这样的功能,因此它会自动做级联的变化呢? – sll

回答

0

如何使用ORM?
我个人使用nHibernate,附带caching和级联内置,所以你甚至不必担心这个问题(当然+,许多许多其他功能,使您的生活轻松许多)。

否则,我绝对不会用选项#1或#3去,因为他们引入了应用程序逻辑到您的存储层。
选项#2的巧妙实现 - 应用程序向数据库发送删除命令不应妨碍您的性能。

+0

感谢您的回复。在选项#2中,无论如何,我需要通过网络为每个相关实体执行许多单个更新/删除操作。你认为这是一个好主意吗? – Jim

+0

为什么每个相关实体?如果你删除了一个角色,那么你的查询就是'从权限中删除,其中role_id = ...'只是一个查询。无论如何 - 直到你证明它是一个性能问题,你不应该把它看作一个整体。 *'过早优化是所有邪恶的根源'* http://c2.com/cgi/wiki?PrematureOptimization –

+0

我得到了你:)所以...我的RolePermission实体将同时具有Delete和DeleteByRole业务层方法,它们必须包含缓存条目invaldations。对? – Jim