【问题标题】:Hibernate - Copying Objects while checking if they exists first - performance slow - best approach?Hibernate - 在检查对象是否存在时复制对象 - 性能缓慢 - 最佳方法?
【发布时间】:2012-02-25 10:09:46
【问题描述】:

我的应用程序向用户提供的复制功能存在性能问题。我不确定我会以正确的方式去做。我在 Hibernate 方面没有太多经验。

过度简化的布局是:

Project ---> (One to Many) Items ---> (One to Many) Tasks
Project ---> (One to Many) Variables
Items <---> Variables (Many to Many)

所以,一个项目可以有很多项目,每个项目可以有很多任务。一个项目可以有变量(不能重复),并且项目和变量之间存在多对多(它们相互关联)。

每个项目可能有数百个项目,每个项目有几个 (20-30) 个任务,每个项目有数百个变量。我添加了一个功能,允许用户检查他们想要从一个项目复制到另一个项目的项目和任务。不能有任何重复。

这是我为每个检查项目执行的过程:

  1. 检查项目是否存在于目标项目中,如果存在则添加,否则不添加。我使用 session.createFilter 来查询目标项目(按项目名称)。如果该项目不存在,我添加它。 (object.save()),并将其添加到目标项目的项目集合中。
  2. 如果项目附加了变量,我会检查目标项目中的这些变量(再次session.createFilter()),如果不存在则添加它们,然后将它们添加到 item.variables 集合中

我不确定我能做些什么来加快速度。我假设先做所有检查并没有帮助。我不知道 createFilter 是否是检查目标项目中是否存在项目/变量的最佳方法。

我尝试改变对象添加到集合的方式。我会一次添加它们(targetProject.add(item)),现在我将它们存储在一个数组列表中,当所有项目都被迭代时,我然后做一个targetProject.addAll(items)。不过,我看不出有什么区别。

有没有更好的方法来做到这一点?我使用 Ehcache 作为二级缓存。我还在使用 Hibernate 3.2.5。

感谢任何帮助。

【问题讨论】:

    标签: performance hibernate ehcache copying


    【解决方案1】:

    由于频繁使用createFilter(),您的代码似乎发出了过多的数据库查询。

    最好通过几个查询将所有需要的对象提取到内存中,然后使用适当的内存数据结构(Maps、Sets)执行必要的检查。

    【讨论】:

    • 所以,我可以遍历通过targetProject().getItems().iterator() 检索到的项目列表,而不是执行许多查询,然后检查那里的重复项目?
    • @EricV:是的,基本上是这样。只需确保使用最少的查询即可完成此操作,也许join fetch 会有所帮助。
    猜你喜欢
    • 2011-05-24
    • 2011-03-20
    • 2019-09-09
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多