日期:2014-05-18  浏览次数:20719 次

hibernate三种分页对性能有影响吗?
一法:
String sql = "select * from GoodsMessage g where g.gType="+"'"+gtype+"'"+" limit "+((curPage-1)*pageSize)+","+pageSize+"";
list = (List<GoodsMessage>)sessionFactory.openSession().createSQLQuery(sql).addEntity(GoodsMessage.class).list();
二法:
String sql = "from GoodsMessage g where g.gType="+"'"+gtype+"'";
list = (List<GoodsMessage>)sessionFactory.openSession().createQuery(sql).setFirstResult((curPage-1)*pageSize).setMaxResults(pageSize).list();
三法:
final String sql = "from GoodsMessage g where g.gType="+"'"+gtype+"'";
return (List<GoodsMessage>)this.getHibernateTemplate().execute(new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException,
SQLException {
Query query = session.createQuery(sql);
int beignRow = (curPage-1)*pageSize;
query.setFirstResult(beignRow);
query.setMaxResults(pageSize);
return query.list();
}
});

为什么之前用前两种方法试,每次都是不报错,但每次启动tomcat之后只能进行五次查询,然后就页面缓冲不过来了,需要重启tomcat,然后又只能进行五次查询,感觉像是内存泄漏,但加大内存后,还是之前那样。用了第三种方法后,一切正常了。求大侠指点一下,这是什么原因?
javaEE?hibernate?分页

------解决方案--------------------
你的问题出现在sessionFactory.openSession()这里。
------解决方案--------------------
hibernate 分页推荐使用第三种方法
------解决方案--------------------
引用:
大神就是大神,改成getCurrentSession()问题解决。我数据也不多,这差距也太大了!

题外话:
第一种分页方法限制了数据库方言,貌似适合mysql。
第二种和第三种使用hibernate封装的方法,适合大多数数据库的,建议采用后两种方法
------解决方案--------------------
第二种方法比较常用。在hibernate中,没有必要自己写分页的SQL语句。
------解决方案--------------------
opensSession永远新建一个session。getCurrentSession是从context中找,有就用没有create