简单查询和大量数据的Hibernate性能改进

时间:2016-05-04 11:45:59

标签: java spring performance hibernate

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

  1. 我们目前正在生成一份包含大量记录(约50k记录)的报告(CSV)。
  2. 首先,hibernate获取数据,然后Java代码使用获取的数据创建CSV文件。
  3. 查询仅在1个表格上完成,包含4到5个where条件和几个order by列。没有连接,没有子查询,没有。例如,生成的查询如下所示:select col1, col2, col3,.. col20 from table_name where condition1 and condition2 and condition3
  4. 根据所需的列正确索引表。
  5. 每次导出前都会生成数据。缓存不适用。
  6. 需要注意的另一点是,映射到数据库表的Java实体大约有70个字段,因为该表具有相同的列数。
  7. 目前,只需要3到4分钟即可获取并返回50k记录。 这意味着,以下代码大约需要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

    我可以在这做任何事情来缩短获取数据的时间吗?

2 个答案:

答案 0 :(得分:0)

获取的时间可能不是由于你如何使用hibernate,而是更可能是如何设置数据库。为您在数据库中使用的列创建索引,并且将改进性能(提取数据)。

答案 1 :(得分:0)

如果您具有应用程序设置,以便可以缓存特定的模型实例(即实体),则可以通过这种方式提高性能。例如,您需要使用" Dog" s列表执行某些操作。如果您知道需要简单地使用最初获取的列表一次,则可以缓存结果集并继续使用它。当然,这涉及一些其他配置,以便您可以在必要时重新获取列表。我使用专有的ORM(不是Hibernate)和模型框架(不是SPring),但它更多地与框架而不是ORM层有关。如果Spring有办法进行此类缓存,您可以使用它。