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()); 求解决方案、
解决方案 »
- 求助,myeclipse连接数据库问题。
- JAVA同僚们.救命啊!快快帮帮我...
- ssh开发中遇到一个奇怪的问题 谁能帮我解释一下
- 在Hibernian中java.sql.Blob强制转换为Oracle.sql.BLOB的方法中下面的内容都有什么作用啊
- 散分!明天就可以和慧通的南京分公司签约了,有了解的谈谈这个公司的情况吧!
- 急!! 各位大侠帮帮忙,如何实现目录访问控制
- 新手请教一个xml链接xsl文件的问题!
- 最近中兴通讯的全国招聘会一天面试结束后,下面还有没有面试?下面会干什么?
- ■■高薪诚聘J2EE程序员(5000-10000元)可兼职,限上海,北京,深圳!!!
- 使用Spring提供的OpenSessionInViewFilter如何等待网页完全加载完毕再关闭Session
- 求教:为什么改了servlet,浏览器显示的仍然访问原来的
- 关于附件上传的垃圾文件的问题
this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException,
SQLException {
return session.createQuery(hql).list();
}
});
这个方式使用了Session,这个就不需要我们去处理,这样叫给容器管理去了
this.getHibernateTemplate().find()
通过自己的方法(反射取字段、值)来处理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;
}
});
}
给你传送门:http://blog.csdn.net/qq183293/article/details/7884127
公用的baseDao有的、这关系到了拆分表问题、而只有一个dto做为映射domain、存到不同的子表中去、使用了反射机制去获取属性和字段值、拼接成可以公用的native sql语句、用一般的baseDao无法实现、session的获取的方式有很多种、正确关闭后、但是大多都释放不了、数据库的连接数一直在涨幅、我看步入传递我拼接好的sql去baseDao执行我的native sql了、不过跟1楼的方式一样、
// 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环境)!
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();
}
});
}
}