我使用Hibernate / Spring和MySQL数据库进行数据管理。
目前我在JTable中显示树结构。树可以有几个分支,反过来一个分支可以有几个分支(最多九个级别),或者有叶子。一旦我想在更深层次上创建新的分支,我最近就会遇到性能问题。
此时分支的父键有外键。 domainobject可以通过调用getParent()来访问其父对象,该对象返回父分支。级别越深,创建新分支所需的时间就越长。
创建新分支的Microbenchmark结果如下:
等级1:32毫秒。 等级3:80毫秒。 等级9:232毫秒。
显然,等级(这意味着父母的数量)是造成这种情况的原因。所以我想问,如果有任何附属物可以解决这类问题。我不明白为什么Hibernate在创建新分支时需要知道整个对象树(直到root的所有父级)。但据我所知,这可能是创建新分支时延迟的唯一原因,因为分支与任何其他对象没有任何其他关系。
我非常感谢任何变通办法或建议。
映入眼帘, ymene
答案 0 :(得分:2)
基本上你有一些多对一的关系结构吗? 在hibernate中,所有都取决于映射。调整映射,使用java.util.Set使用父对子之间的一对多关系。
不要使用ArrayList因为列表是有序的,所以hibernate将仅为该顺序添加额外的列。
还要检查你的懒惰财产。如果您加载父项并且在其子集属性上设置了lazy =“false”,那么将从DB加载所有子项,这可能会影响性能。
同时检查儿童的'反向'属性。如果子表中的inverse为true,则表示您可以单独管理子实体。否则你只能使用父母那样做。
谷歌周围反向,它一定会帮助你。感谢。
答案 1 :(得分:1)
我不知道Hibernate如何在内部处理它。但是,有多种方法可以在数据库中存储树结构。对在树上进行的许多查询非常有效的方法是使用“nested set”方法 - 但这基本上会产生您所看到的性能问题(例如昂贵的插入)。如果您需要快速插入或移除,我会选择您拥有的内容,例如:一个简单的父ID,并试着看看Hibernate一直在做什么。
答案 2 :(得分:1)
如果您不需要在SQL中报告数据,则可以将JTable序列化为数据库(可能使用类似XStream的内容)。这样您就不必担心处理树的昂贵数据库查询。
答案 3 :(得分:1)
您可以做的一件事是在MySQL中使用XML支持。这将为您提供支持层次结构的本机功能。我从来没有在MySQL中使用XML支持,所以我不知道它是否像其他DBMS一样功能齐全(SQL Server和DB2我知道有很大的支持,可能也是Oracle我猜)。
注意,我从来没有使用过hibernate,所以我不知道你是否可以与它接口,或者如果你必须在这种情况下编写自己的数据库代码(我的猜测是,你将会自己编写)查询)。