针对简单查询和庞大数据的Hibernate性能改进



有很多关于Hibernate性能改进的文章,但我仍然无法解决这个问题。

  1. 我们目前正在生成一个包含大量记录(约5万条记录)的报告(CSV)
  2. 首先hibernate获取数据,然后Java代码使用获取的数据创建CSV文件
  3. 查询仅在一个表上完成,该表具有4到5个where条件和几个order by列。没有联接,没有子查询,什么都没有。例如,生成的查询如下所示:select col1, col2, col3,.. col20 from table_name where condition1 and condition2 and condition3
  4. 表已根据所需列正确编制索引
  5. 每次导出前都会生成数据。缓存不适用
  6. 另一点需要注意的是,映射到数据库表的Java实体大约有70个字段,因为该表具有相同数量的列

目前,仅获取和返回5万张唱片大约需要3到4分钟。这意味着,下面的代码大约需要3-4分钟。

final Criteria criteria = getSession().createCriteria(EntityName.class);
criteria.addOrder(Property.forName("property1").asc().ignoreCase());
criteria.addOrder(Property.forName("property2").asc().ignoreCase());
criteria.add(Restrictions.eq("condition1", condition1value));
criteria.add(Restrictions.in("condition2", condition2value));
criteria.add(Restrictions.in("condition2", condition3value));
criteria.add(Restrictions.in("condition4", condition4value));
return findByCriteria(criteria);

如前所述,我在网上参考了多篇参考文献,也尝试过使用Spring JDBCTemplate

我能在这里做些什么来提高获取数据的时间吗?

获取时间可能不是因为如何使用hibernate,更可能是因为如何设置数据库。为数据库中使用的列创建一个索引,(获取数据的)性能将得到提高。

如果您的应用程序设置为可以缓存特定的模型实例(即实体),则可以通过这种方式提高性能。例如,你需要用一个"狗"的列表来做一些事情。如果你知道你只需要简单地使用一次最初提取的列表,你可以缓存结果集并继续使用它。当然,这涉及到一些其他配置,这样你就可以在必要时重新提取列表。我使用了一个专有的ORM(不是Hibernate)和模型框架(不是SPring),但它更多地与框架有关,而不是与ORM层有关。如果Spring有一种方法来进行这种缓存,那么您可能可以使用它。

最新更新