最近的项目中发现某些页面打开速度非常慢,最慢的情况下甚至到了30秒。
分析原因后发现是加载由于实体间配了1对1的双向关联,导致lazy加载失效,每次加载都会把关联实体的全部属性查询出来,对性能影响特别大。
分析原因后发现是加载由于实体间配了1对1的双向关联,导致lazy加载失效,每次加载都会把关联实体的全部属性查询出来,对性能影响特别大。
最终的解决方案是直接执行sql取得需要的字段,然后再转为对象。代码如下:
Session session = null;
String sql = "select o.ID as id, o.OFFICE_NO as officeNo from ASY_OFFICE_INFO o where o.OFFICE_SYSTEM='" + sys + "' and o.OFFICE_STATUS = '1' and o.DEPARTMENT_ID =" + company + " and o.ISEXISTS is null";
session = baseDao.getHibernate().getSessionFactory().openSession();
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("id", Hibernate.LONG).addScalar(
"officeNo", Hibernate.STRING);
query.setResultTransformer(Transformers
.aliasToBean(ManagerOfficeInfo.class));
List<ManagerOfficeInfo> list = query.list();
session.close();
===========另一种实现方式的分割线=========
private static DataSource dataSource = null;
/**
* 获取系列生成器数据库连接,无论哪种用户都取同一个连接,确保hibernate缓存正确;.
*
* @return the connection
* @throws SQLException the sQL exception
*/
private static Connection getConnection() throws SQLException {
if (da