我在数据库中有数据具有层次关系(可以表示为树)
现在,每当请求进入服务器时,在DB中进行递归查询以创建内存列表(这是树的一个分支,从实际存在的叶到根)和
使用该列表进行处理
这不是很有效,但至少它现在有效,并且具有如下优点:如果更改了DB,则会立即注意到更改。
无论如何,我想改进它并寻找一种模式:
1)不必一直访问DB
2)如果在DB中进行了更改,则会立即立即反映
3)它可以在服务器的所有地方使用
是否有通常用于此类案例的标准设计模式?或者只是拥有一个由后端线程维护的数据结构以及数据库中的任何更新,重新加载数据结构中的所有内容?
谢谢
答案 0 :(得分:2)
您可以使用缓存解决方案代替线程。查询的结果将被缓存并在每个请求中返回,如果查询中的任何表被修改,则使缓存无效,等待下一个请求检索新值并将其加载到缓存上。此解决方案符合必要条件1和2.“您可以在服务器的所有位置使用它”是什么意思?
如果你正在使用Hibernate,可以使用second level cache轻松完成,需要注意的是你必须保证只有你的应用程序才能更改数据库(没有外部进程)。
如果您没有使用Hibernate,可以使用Ehcache推出自己的解决方案。在查询数据库之前,您需要更改返回结构的方法以检查缓存。必须修改对所涉及的表进行更改的方法,以使缓存无效。
Ehcache也有integration with Spring,但我从未尝试过。
答案 1 :(得分:1)
您没有提供您使用的ORM工具的详细信息,但在Hibernate中,这可以通过声明子列表来实现。以下内容来自生产代码:
<hibernate-mapping>
<class name="YourTreeClass" table="tree_table" dynamic-insert="true" dynamic-update="true">
...other properties...
<list name="children" cascade="save-update" inverse="false" >
<cache usage="nonstrict-read-write"/>
<key column="parent_id"/>
<one-to-many class="YourTreeClass" />
</list>
</class>
</hibernate-mapping>
不需要hacky后台线程 - 在节点更新时,Hibernate会小心并使相关的缓存条目无效。