Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中数据库设计方法的问题_Java_Database_Jakarta Ee - Fatal编程技术网

Java中数据库设计方法的问题

Java中数据库设计方法的问题,java,database,jakarta-ee,Java,Database,Jakarta Ee,我在数据库中有具有层次关系的数据(可以表示为树)。 现在,只要服务器中有请求,就会在数据库中执行递归查询,以创建内存中的列表(这是树的一个分支,从叶到根,实际上是存在的)和 使用该列表进行处理。 这不是很有效,但至少目前可以使用,而且它的优点是,如果数据库发生更改,更改会立即被注意到。 无论如何,我想改进它并寻找一种模式: 1) 不必一直访问数据库 2) 如果在数据库中进行了更改,它会立即得到反映 3) 它可以在服务器的所有位置使用。 有没有一个标准的设计模式常用于这种情况?或者只是让后端线程维

我在数据库中有具有层次关系的数据(可以表示为树)。
现在,只要服务器中有请求,就会在数据库中执行递归查询,以创建内存中的列表(这是树的一个分支,从叶到根,实际上是存在的)和 使用该列表进行处理。
这不是很有效,但至少目前可以使用,而且它的优点是,如果数据库发生更改,更改会立即被注意到。
无论如何,我想改进它并寻找一种模式:
1) 不必一直访问数据库
2) 如果在数据库中进行了更改,它会立即得到反映 3) 它可以在服务器的所有位置使用。
有没有一个标准的设计模式常用于这种情况?或者只是让后端线程维护一个数据结构,在数据库中的任何更新中,重新加载数据结构中的所有内容


谢谢

您可以使用缓存解决方案而不是线程。查询的结果将被缓存,并在每次请求时返回。如果查询中的任何表被修改,请使缓存无效,等待下一个请求检索新值并将其加载到缓存中。此解决方案满足必备条件1和2。“它可以在服务器的所有位置使用”是什么意思

如果您使用的是Hibernate,这可以很容易地通过完成,但需要注意的是,您必须保证只有您的应用程序更改数据库(没有外部进程)

如果您不使用Hibernate,您可以使用自己的解决方案。在查询数据库之前,您需要更改返回结构以检查缓存的方法。必须修改对涉及的表进行更改的方法以使缓存无效


Ehcache也有,但我从未尝试过。

您没有给出使用哪个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>

…其他属性。。。

不需要黑客背景线程-在节点更新时,Hibernate会处理并使相关缓存项无效。

对不起,我不明白这一点。您是否要求表示适合处理的层次结构(而不是每次在内存中构建结构)?该项目是一个使用自定义框架访问数据库的旧项目(它比Hibernate旧,并且尚未进行重构以使用更新的框架)因此,我正在寻找一种自定义解决方案,将实际数据缓存在内存中,并在需要时进行更新。我完全同意@iruediger。听起来您需要在数据库中插入/更新/删除时更新缓存。该项目是一个使用自定义框架访问数据库的旧项目(它比Hibernate旧,并且尚未进行重构以使用新框架)。因此,我正在寻找自定义解决方案DOH!您应该在一开始就这么说。IMHO,Spring没有缓存解决方案。但是他们有与EHCache的接口,我听说这很好。@Rudy你说得对,这不是一个缓存解决方案。我已经更正了我的帖子。