对于非常简单的查询,Hibernate Criteria.list()需要很长时间

问题描述:

我正在寻找的一个应用程序有一段代码需要大约20,000毫秒才能执行。这真的妨碍了网站的性能。这是因为Criteria.list?这是负责缓慢的代码。我有一个样本数据库表,我试图检索表中的所有值。我该如何改进此查询的性能?我正在使用SQL服务器作为我的数据库。对于非常简单的查询,Hibernate Criteria.list()需要很长时间

public Map<Integer, Sample> getAllSamples() { 
    Map<Integer, Sample> Sample = transactionTemplate 
      .execute(new TransactionCallback<Map<Integer, Sample>>() { 
       @Override 
       public Map<Integer, Sample> doInTransaction(TransactionStatus arg0) { 
        Criteria criteria = hibernateTemplate 
          .getSessionFactory().getCurrentSession() 
          .createCriteria(Sample.class); 
        criteria.add(Restrictions.isNull("deleted")); 
        @SuppressWarnings("unchecked") 
        List<Sample> Samples = (List<Sample>) criteria.list(); 
        HashMap<Integer, Sample> mSamples = new HashMap<Integer, Sample>(); 
        for (Sample sample: Samples){ 
         if (sample != null && sample.getsampleId() != null){ 
          //hibernateTemplate.initialize(sample); 
          mSamples.put(sample.getsampleId(), sample); 
          hibernateTemplate.initialize(sample.getsampleCountry()); 
         } 
        } 
        return mSamples; 
       } 
      }); 
    return Sample; 
} 

现在,我的示例类还有另外两个叫做Account和Deposit的类。 Sample和另外两个之间的关系是一一对应的。但是,fetchType是懒惰的。下面是示例类的代码,

@OneToOne(fetch = FetchType.LAZY, mappedBy = "sample", cascade = CascadeType.ALL) 
public deposit getDeposit() { 
    return this.deposit; 
} 

我查了日志,并在样品每一行,还有在存款生成一个查询。我如何确定情况并非如此?由于Sample中有大约400行;为了取回存款,有400个查询运行。这很奇怪。我不确定在这里可以做些什么来提高性能。任何指针都会有很大的帮助。

在此先感谢。

+0

只是使用预先抓取 –

这就是我所做的。我将该协会设为强制性(可选= false),它相信对于每个样本记录,都会有一个存款记录。因此,在加载Sample时,Hibernate也不会加载Deposit表。

这是底层代码,

@OneToOne(optional = false, fetch = FetchType.LAZY, mappedBy = "sample",   cascade = CascadeType.ALL) 
    public deposit getDeposit() { 
     return this.deposit; 
    }