尝试使用只读优化Hibernate查询

时间:2014-06-24 20:28:36

标签: java hibernate

我正在尝试优化目前比预期时间稍长的查询。该查询返回大约11000个实体,但由于它们有点复杂并且具有嵌套实体,因此它有点慢。由于我不打算修改实体,我尝试将查询/会话设置为只读,但它没有帮助,它仍然需要一段时间,也许我做错了。下面是一个简化的代码,抱歉它有点乱:

@Entity
@NamedQueries(value = {@NamedQuery(name = "demand.all", query = "select d from Demand d")})
public class Demand {
    private Long ID;
    private Division division;
    private Client client;
    private Product product;
    private String code;
    ...
}

@Transactional(readOnly=true)
public List<Demand> getAll() {
    SessionImpl sessionImpl = ((SessionImpl)em.getDelegate());
    Session session = sessionImpl.getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();
    try {
        sessionImpl.connection().setReadOnly(true);
        Query query = session.getNamedQuery("demand.all");
        List<Demand> resultList = query.setReadOnly(true).setCacheable(false).setFlushMode(FlushMode.MANUAL).list();
        sessionImpl.connection().setReadOnly(false);
        tx.commit();
    } catch(Exception e) {
        resultList = null;
    }
    session.close();
    return resultList;
}

我读到将查询设置为只读是不够的,所以我也尝试将连接和事务设置为只读,但我不确定是否有必要。无论如何,我做错了什么?还有哪些方法可以优化此查询?

1 个答案:

答案 0 :(得分:1)

更快地做到这一点的一种方法是以懒惰的方式获取对象,或者取决于哪些是必要的而哪些不是。也许你只需要在一个表中显示5列,而不是层次结构中的每一个对象,所以你创建DTO来获取它们。如果你需要关于其中一个的更多信息..让我们说用户点击一行,那么你将带来它的整个对象层次结构..

它可能不适用于您的情况,但它是一种有效获取数据的方法。