我们将项目从Spring 3x / Hibernate 3x升级到Spring 4.1.5 / Hibernate 4.3.8。
最初我们使用的是Hibernate Tempate。在升级过程中,我们删除了Spring的Hibernate Template并使用了Spring的声明式事务管理。
早些时候,我们使用 hibernateTemplate 进行查询需要花费很长的时间来从DB中检索3500条记录。现在,当使用 query.list()时,运行时间以分钟为单位(约4-5分钟)。
旧代码
DAO Class:
---------
public List<LatestRecVO> getListRecs(String listId) {
HibernateTemplate ht = new HibernateTemplate(getSessionFactory());
List<LatestRecVO> listOfRecs = ht.find(" from LatestRecVO a where a.listId = ? order by a.listRecId asc", Long.valueOf(listId) );
return listOfRecs;
}
Service Class:
--------------
@Transactional
public List<LatestRecVO> getListRecs(String listId) {
List<LatestRecVO> listOfRecs = listDao.getListRecDetails(listId);
return listOfRecs;
}
新代码
DAO Class:
---------
public List<LatestRecVO> getListRecs(String listId) {
Query q = getSession().createQuery(" from LatestRecVO a where a.listId = (:listId) order by a.listRecId asc");
q.setParameter("listId", Long.valueOf(listId));
List<LatestRecVO> listOfRecs = q.list();
return listOfRecs;
}
Service Class:
--------------
@Transactional
public List<LatestRecVO> getListRecs(String listId) {
List<LatestRecVO> listOfRecs = listDao.getListRecDetails(listId);
return listOfRecs;
}
实体类 LatestRecVO 没有任何关联实体。
我检查了Hibernate Template的find()方法,看到它使用了一些缓存。
尝试二级缓存和查询缓存,但它没有帮助。我可能已经错误地配置了二级缓存,但是为了再次尝试,我想确保它的出路,否则我会浪费时间。
我将show_sql设为true,可以看到它只运行了一个单独的查询。在DB上,相同的查询需要几毫秒才能运行。似乎hibernate花费时间从结果中构建对象。
在其中一篇文章中提到了它在我们的实体中拥有默认构造函数的任务。我没有在我的实体类中创建任何构造函数,所以我假设我确实有java的默认构造函数。
我的表有36列,总共有4k记录要提取。
这里的任何指针都非常有用。
更新
抱歉,我无法在此发布完整代码,因此只需提供详细信息。我有LatestRecVO的复合主键。我为主键创建了一个 LatestRecPK 类,它实现了可序列化并具有 @Embeddable 注释。在LatestRecVO中,我已经给出了 @IdClass(LatestRecPK.class)来包含主键类。 LatestRecVO 具有CLOB属性以及String,Long和@Temporal(TemporalType.DATE)属性以及相应的setter / getters。