我们有一个应用程序(规则引擎),它在内存中有很多表来执行某些业务规则。此引擎还用于在需要时写回数据库。
数据库结构是非规范化的,我们有5个事务表,有时也需要查询报告。
这里的问题是,我们希望在app中缓存数据,因此它会在App启动时加载,然后只有在DB更改时才会更改。
有什么建议吗?
我们倾向于创建一个数据库服务,它将处理所有插入,更新和删除,并将它们排队以减少数据库服务器上的负载(事务表也有大量索引)。此外,我们正在考虑启用数据库服务,并为所有需要直接访问数据库的报表/其他应用程序提供服务。
此处的目的是减少每个请求的Select查询的DB命中数,并确定事务的优先级。另外,为了确保人们访问应用程序,请不要关闭数据库服务器。
Rules Engine是一个C#桌面应用,报告和其他应用是基于网络的。
最好的方法是什么?我还考虑从事务表中删除所有索引,并将触发器插入到新表中,该表是一个副本,但是为报表检索编制索引。
答案 0 :(得分:1)
我做过类似于一个非常复杂的规则引擎。最终,我进行了设置,以便集中序列化数据(使用一个进程来发布新的更改,导致新的副本被序列化并且blob存储在某处可访问)。在加载期间,每个应用服务器都会检查它们是否具有最新版本的blob,如果没有获取它(并将其存储在本地)。
然后它所要做的就是将数据反序列化到内存中。没有db命中,除了偶尔抓住新的blob。这也意味着app-server可以在db服务器脱机时工作(只要它具有blob的缓存副本)。当然,它还会在运行时定期轮询新的更新 - 但仅限于“是否有新的blob”代码(它仍然不需要访问主表)。
答案 1 :(得分:1)
您应该查看分布式缓存解决方案(从性能和可伸缩性的角度来看)。简而言之,我正在采用由分布式缓存支持的可伸缩数据库服务(以便多个数据库服务由相同的缓存提供服务)。
这是讨论分布式缓存的article,包括各种数据库同步方法。这里是blog帖子,列出了.NET中用于分布式缓存的几个选项。
答案 2 :(得分:0)
您可能对this article感兴趣它使用xml来存储数据库的只读副本(在内存中)。和XPath来查询。现在你更喜欢用linq查询。