spring集成了sessionFactory  和hibernatetemplate、 该如何正确获取到session、  问题来源: 原来项目的service接口上有事务注解、
 session都是从当前的事务中获取的、
 如:接口上的注解
@Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class)
 获取的代码:
 //hibernateTemplate 从spring中获取的、
 SessionFactory sf = hibernateTemplate.getSessionFactory();
 //创建session  、从当前事务中获取session
 Session session = SessionFactoryUtils.getSession(sf, false); //true是找不到事务允许新建个session,false是必须从当前事务中获取
 
//dosomething(); //释放是这样释放的
 session.clear();
 SessionFactoryUtils.releaseSession(session, sf); 这以前的做法是肯定不会连接数涨幅的、
 
 因为事务这东西会造成锁表和锁行(mysql -- innoDB)、
 造成了不必要的麻烦、
 老大后来给去掉了、比如查询就不需要事务、 而这部分获取session的代码就全不行了、而且又是必须拿session来操作dao的、
 具体错误就是  :hibernate认为当前没有事务给分配、而我又强制从当前事务中获取的错误、 
  
  【现在session获取是能获取到、只不过无论我怎么释放都不能释放、连接数量猛涨、】
  
  现在想问下究竟在这种配置环境下该如何获取和释放session、让连接数稳定在一个范围内、
  我现在的获取方法试了很多种、但是都是猛涨连接数那种的、  //能获取session的方法我都试了些、
  SessionFactory sf = hibernateTemplate.getSessionFactory();//sf
  Session session =  sf.openSession();//session1
  Session session =  SessionFactoryUtils.getSession(sf,true);//session2
  Session session =  SessionFactoryUtils.getNewSession(sf);//session3
  Session session =  SessionFactoryUtils.doGetSession(sf, true);//session4
  Session session =  sf.getCurrentSession(); //session5  //do somethin ..
  
  session.clear();
  //无论怎么样关闭,我都无法释放session
  session.close();
  //甚至连这样释放的都一并用上了
  SessionFactoryUtils.closeSession(session);
  SessionFactoryUtils.releaseSession(session, hibernateTemplate.getSessionFactory());  求解决方案、
   

解决方案 »

  1.   

    LZ这个问题我也出现过,我配置连接池的时候,死活不知道怎么的,数量一下子就没有了。后来才发生在hibernate中去拿都有问题,这个问题,请牛人给解释一下。后来我使用
    this.getHibernateTemplate().execute(new HibernateCallback() {
    public Object doInHibernate(Session session) throws HibernateException,
    SQLException {
    return session.createQuery(hql).list();
    }
    });
    这个方式使用了Session,这个就不需要我们去处理,这样叫给容器管理去了
      

  2.   

    ActionContext.getContext().getSession();有request,也可以通过request 获取 request.getSession()
      

  3.   

    继承HibernateDaoSupport 的类,注入了sessionFactory,也可以直接this.getSession()获得
      

  4.   

    重点问题在这里:session无论怎么样关闭,我都无法释放session、造成了mysql数据库的连接数猛涨、
      

  5.   

    回3楼:是org.hibernate的session 不是HttpSession 那个、这倆不能等价的、而且重要是无法释放session了、造成了连接满了------------------------------------------------回5楼:上面有写这个session获取、
      

  6.   

    既使用了spring,就可以把对应的dao注入到相应的业务类中,然后就可以用调用dao的操作数据库方法了。dao的话,把sessionFactory注入进去,然后继承extends HibernateDaoSupport ,调用this.getHibernateTemplate()执行相应的数据库操作。比如查询就是
    this.getHibernateTemplate().find()
      

  7.   

    回10楼:先谢谢、不过主要这涉及到了拆分表、一个母体表(相当于DTO、用来封装呈现给前台view的、)、其他都是子表(用来存数据的)、如果用了DAO层的东西会找不到数据的、所以要自己写、
    通过自己的方法(反射取字段、值)来处理CRUD动作、在根据传递的表名来处理数据
    增删改查都会涉及到子表的、-----------------------------------如果用1楼的方法的话、hibernatecallback里面内部匿名类如何调用类的私有方法?private void mine(){
       //do something();
    }public void hibernateTest(){
      super.getHibernateTemplate().execute(new HibernateCallBack(){
       
         public Object doInHibernate(Session session) throws HibernateException, SQLException {
             //这里如何调用 上面的私有 mine()方法?
             return 1;
         }
    });
    }
      

  8.   

    建议楼主去我的csdn博客看看我的dao层怎么写就知道怎么集成了~其实很简单,多余的也不多了~
    给你传送门:http://blog.csdn.net/qq183293/article/details/7884127
      

  9.   

    在spring的配置文件中可以配置那个数据库连接不被占用时释放的参数啊,我用了效果还挺好的。
      

  10.   


    公用的baseDao有的、这关系到了拆分表问题、而只有一个dto做为映射domain、存到不同的子表中去、使用了反射机制去获取属性和字段值、拼接成可以公用的native sql语句、用一般的baseDao无法实现、session的获取的方式有很多种、正确关闭后、但是大多都释放不了、数据库的连接数一直在涨幅、我看步入传递我拼接好的sql去baseDao执行我的native sql了、不过跟1楼的方式一样、
      

  11.   

    http://blog.csdn.net/zmhinzaghi/article/details/7091629
      

  12.   

    // 这样访问上面的私有 mine()方法?private Object mine() {
    // do something();
    return null;
    }public void hibernateTest() {
    super.getHibernateTemplate().execute(new HibernateCallback<Object>() { public Object doInHibernate(Session session)
    throws HibernateException, SQLException {
    // 这样访问上面的私有 mine()方法?
    return Student.this.mine();
    }
    });
    }
    在Spring+Hibernate环境中,应该用这种方式来获取session(1楼所诉)。
    此时,你不需要对session进行维护,会由Spring进行管理。
    就像接口名那样,它就是一个回调接口,由其为你提供执行环境(session环境)!
      

  13.   


    public class Student extends HibernateDaoSupport { private Object mine() {
    // do something();
    return null;
    } public void hibernateTest() {
    super.getHibernateTemplate().execute(new HibernateCallback<Object>() { public Object doInHibernate(Session session)
    throws HibernateException, SQLException {
    return Student.this.mine();
    }
    });
    }
    }