1).在结合Spring时,在DAO层通过使用HibernatTemplate已经封装session的操作。如果在项目中仅仅使用Hibernate框架的话,那么在DAO层对每一个PO对象总是需要对Sesson进行open和close的操作。这样岂不是很会影响性能?请问,有没有什么方法可以改进?
2).关于使用Hibernate进行分页,能不能使用一个通用性的分页功能!这样就可以针对每一个PO对象进行相应的分页查询!!

解决方案 »

  1.   

    1、每个session代表一个会话,比作一次连接,每次的open和close是保证事务的完整性2、使用通用性分页是在你用session操作时,既然你与spring结合使用,大多数情况下我们会用spring提供的HibernateTemplate来操作,这时你使用什么setFirstResult会有些麻烦
      

  2.   

    个人认为1楼大哥说的不错
    1.如果对Sesson不进行open和close的操作,那么容易将数据库连接池的资源耗尽,导致对数据库的操作失败。
    2.同意一楼意见。
      

  3.   

    这是我经常 用的分页功能通用工具类(如果你不使用struts,就得手动的把pageResult对象放入request)
    public class CommonDAOHibImpl extends HibernateDaoSupport implements CommonDAO {

    /**
     * 传一个hql语句过来,把结束存进pageResult
     */
    public void listByPage(String hql, PageResult pageResult) {
    if (null==hql || pageResult== null ){
    return ;
    }
    Query query = this.getSession().createQuery(hql);
    query.setFirstResult(pageResult.getFirstRec());
    query.setMaxResults(pageResult.getPageSize());
    List ret = query.list();
    pageResult.setList(ret); String queryString = "";
    if (hql.toUpperCase().indexOf("SELECT") != -1) {
    int i = query.getQueryString().toUpperCase().indexOf("FROM");
    queryString = "Select count(*) " + hql.substring(i,hql.length());
    } else {
    queryString = "Select count(*) " + hql;
    }
    // 去掉ORDER BY 的部分
    int j = queryString.toUpperCase().lastIndexOf("ORDER");
    if (j!=-1){
    queryString = queryString.substring(0, j);
    }
    Query cquery = this.getSession().createQuery(queryString);
    cquery.setCacheable(true);
    int recTotal = ((Integer)cquery.iterate().next()).intValue();
    pageResult.setRecTotal(recTotal);
    }
    }/**
    * 让FormBean继承之BaseForm,因为通过struts访问的FormBean是自动存放在request里面的,这样就可* 以直接在页面通过以下标签循环出来
    * <logic:iterate id="item" name="FormBean"property="pageResult.list"></logic:iterate>
    */
    public class BaseForm extends ActionForm { private PageResult pageResult = new PageResult();

    public PageResult getPageResult() {
    return pageResult;
    }

    public void setPageResult(PageResult pageResult) {
    this.pageResult = pageResult;
    }

    }        /**
     * Action页面
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     */
    public ActionForward queryLists(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
    FormBean myForm = (FormBean) form; // 获取当前页
    int pageNo = 1;
    if (Util.isNotNullOrEmpty(request.getParameter("pageNo"))) {
    pageNo = Util.parseInt(request.getParameter("pageNo"));
    }
    PageResult pageResult = myForm.getPageResult();
    pageResult.setPageNo(pageNo);
    /**
     * 这是PageResult的实体类
     * @author 
     */
    public class PageResult<E> {
    private String orderBy = "";
    private String sort = "asc";
    private List<E> list = new ArrayList<E>(); //查询结果
    private int pageNo = 1; //实际页号
    private int pageSize = 16; //每页记录数
    private int recTotal = 0; //总记录数
    private int pageTotal=1; //总页数

    public List getList() {
    return list;
    }
    public void setList(List<E> list) {
    this.list = list;
    }
    public int getPageNo() {
    if(pageNo<=0){
    pageNo = 1;
    }
    return pageNo;
    }
    public void setPageNo(int pageNo) {
    this.pageNo = pageNo;
    }
    public int getPageSize() {
    return (0==pageSize)?10:pageSize;
    }
    public void setPageSize(int pageSize) {
    this.pageSize = pageSize;
    }
    public int getRecTotal() {
    return recTotal;
    }
    public void setRecTotal(int recTotal) {
    this.recTotal = recTotal;
    }
    public int getPageTotal() {
    int ret = (this.getRecTotal() - 1) / this.getPageSize() + 1;
    ret = (ret<1)?1:ret;
    return ret;
    }


    public int getFirstRec()
    {
    int ret = (this.getPageNo()-1) * this.getPageSize();// + 1;
    ret = (ret < 1)?0:ret;
    return ret;
    }
    public String getOrderBy() {
    return orderBy;
    }
    public void setOrderBy(String orderBy) {
    this.orderBy = orderBy;
    }
    public String getSort() {
    return sort;
    }
    public void setSort(String sort) {
    this.sort = sort;
    }

    public void setPageTotal(int pageTotal) {
    this.pageTotal = pageTotal;
    }

    }
      

  4.   

    4楼的请问你用的是什么技术。hibernate?public class CommonDAOHibImpl extends HibernateDaoSupport implements CommonDAO 继承HibernateDaoSupport类有什么作用啊?CommonDAO接口是不是定义的listByPage(String hql, PageResult pageResult)方法啊?query.setFirstResult(pageResult.getFirstRec());
    query.setMaxResults(pageResult.getPageSize());
    这两句是什么意思 啊?
    Query cquery = this.getSession().createQuery(queryString);这个得到的是什么啊?
    cquery.setCacheable(true);什么意思啊?
    int recTotal = ((Integer)cquery.iterate().next()).intValue(); 什么意思啊?
    FormBean myForm = (FormBean) form;
    这句话是不是写错了啊?
    应该是BaseForm myForm =new BaseForm();       
      

  5.   

    自己感觉四楼代码非常好,重用性很高!不知道为什么五楼这样说,对他是否理解认真看待此贴对hibernate的理解感觉到怀疑!四楼的这段可以称得上是最优雅的代码!
      

  6.   


    我不用Spring 所以也不知道那是什么机制的 不过 如果你用的连接池的话 Hibernate总是维持一定的连接数 并将这些SESSION对象放到线程池里 所以这个时候的close不是关闭连接 而是 释放连接 另 用的时候从没用过open...2.可以使用通用的 参数可以为Query 这样就可以保证他的通用了 不过 用这个通用会有很多不必要的麻烦 比如对于分页的时候获得总数的语句? 查询条件? 乱七八糟的 你自己想想吧 其他技术区的高手..
      

  7.   

    另外 4L的同学 如果有条件查询的话 您咋整? 传个LIST形式的参数挨个加?..
      

  8.   

    1.不对呀,hibernate是自带测试级别的连接池的,无论是默认使用还是改配c3p0,连接都是由连接池管理的,所以开发时只对事务进行操作,不会开关连接。
      

  9.   

    用HibernateTemplate来操来处理吧,你不用自己管理session的open和close,如果光是分页查询也不用管理事物,HibernateTemplate提供了很多接口让你实现,只需要注入你的datasource就行啦
      

  10.   

    高效程序通用分页最小功能集合:{动态sql生成功能,环境上下文存储区,连接管理功能}高效DB通用分页最小功能集合:{动态sql生成功能,数据字典功能,通用接口标识调用功能}
      

  11.   

    4L的的确有参数问题没考虑,不过可以传进LIST一个个加.
    不过要注意参数的类型,需要进行类型判断.Example: Integer, Double, String, Date等常用类型的参数设置是不一样的
      

  12.   


    我没说要和Spring结合啊!!!!!
      

  13.   

    大家好,我是楼主。
    如果仅仅使用Hibernate的话,在dao层使用HibernateSessionFactory.getSessionFactory()得到会话工厂的这种方式好不好?我指的是效率或性能方面的问题!!
      

  14.   


    默认生成的SESSION工厂你调用他的getSession就行了 要SESSIONFactory干嘛呢?
      

  15.   

    session是轻量级的,允许随用随建,session的open和close,未必就意味着connection的关闭和链接。
    建议使用bbcp管理connection
      

  16.   

    你程序中出现了HibernateDaoSupport,如果仅有Hibernate的话,是没有这个的。。
    你是结合了Spring时才有的撒。
      

  17.   

    如果,你只用Hibernate,参考org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter等(用Hibernate也会有类似的一个Filter)
    其实,Spring会有一个Filter,当一个Request过来时,会打开一个Session,当Servlet处理结束时,这个Filter又可以把Hibernate的Session关闭。
    你只需要造这个类似的Filter即可至于分页,大楖如上面那些朋友写的。
    不过,我很烦不停的写这些,自己写了个东西,把hql放在配置文件里,类似如
    <page id="queryServiceGroup1" maxRecords="1" maxIndexPages="2">         
    <sql><![CDATA[
              select (selct * from abc)  from Entity where id=:id and name like :name and ?1 and 0=1
           ]]>
    </sql>
    <reps id="1" default="a=b">
      <rep test="${id=='20'}"><![CDATA[abc${name}]]></rep>
      <rep test="${id=='1'}"><![CDATA[b=c]]></rep>   
    </reps>
    </page>
      

  18.   

    Hibernate配合连接池使用,不会有什么影响使用的的性能问题的,Hibernate自己实现了很多缓存机制,除非进行海量数据操作,Hibernate配置好了,和JDBC效能不相上下。而分页,每次只会取出少量数据而已。
      

  19.   

    学习。第一次使用HibernateDaoSupport
      

  20.   

    学习  刚开始看hibernate