Hibernate - 在检查对象是否存在时复制对象 - 性能缓慢 - 最佳方法?

时间:2012-02-02 18:16:35

标签: performance hibernate ehcache copying

我正在努力解决我的应用程序为用户提供的复制功能的性能问题。我不确定我是以正确的方式去做的。我在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集合
  3. 我不确定我能采取什么措施来加快速度。我假设首先做的所有检查都没有帮助。我不知道createFilter是否是检查目标项目中是否存在项/变量的最佳方法。

    我尝试改变将对象添加到集合的方式。我会一次一个地添加它们(targetProject.add(item)),现在我将它们存储在一个arraylist中,当所有项目都经过迭代时,我会做targetProject.addAll(items)。不过,我无法区分。

    有更好的方法吗?我正在使用Ehcache作为二级缓存。我还在使用Hibernate 3.2.5。

    感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

由于经常使用createFilter(),您的代码看起来会发出太多数据库查询。

最好通过一些查询将所有需要的对象提取到内存中,然后使用适当的内存数据结构(Map s,Set s)执行必要的检查。