用了spring也有一段时间了,在spring进行声明式事务管理时,对下面几个问题一直感到比较困惑
1.何时得到session,
2.何时开启事务,
3.何时打开数据库链接还有一个问题,就是我保存一个对象时,比如List<user>,在哪一层保存效率比较高,现在我常用的方法是在service层用循环调用dao层的保存方法,但是在这个循环中,我不知道是不是每一次循环都要开启一次数据库连接?那么事务是加在什么地方呢?session呢,这次循环中得到了几个session呢?对这些比较迷茫,高手给点解答,在网上也看了好多帖子,但是感觉还是比较迷茫?想下面这样,我通常都是这么做的
service层方法@Autowired
ISaveDao saveDaoImpl;public void saveUser(List<user> userList) throws Exception{
for(User user : userList){
saveDaoImpl.save(user);
}
}
dao层方法public void save(Object obj) throws Exception{
this.getHibernateTemplate().save(obj);
}
1.何时得到session,
2.何时开启事务,
3.何时打开数据库链接还有一个问题,就是我保存一个对象时,比如List<user>,在哪一层保存效率比较高,现在我常用的方法是在service层用循环调用dao层的保存方法,但是在这个循环中,我不知道是不是每一次循环都要开启一次数据库连接?那么事务是加在什么地方呢?session呢,这次循环中得到了几个session呢?对这些比较迷茫,高手给点解答,在网上也看了好多帖子,但是感觉还是比较迷茫?想下面这样,我通常都是这么做的
service层方法@Autowired
ISaveDao saveDaoImpl;public void saveUser(List<user> userList) throws Exception{
for(User user : userList){
saveDaoImpl.save(user);
}
}
dao层方法public void save(Object obj) throws Exception{
this.getHibernateTemplate().save(obj);
}
解决方案 »
- struts 刷新提交的问题
- ANT的jar包问题
- 用java来生成静态页面后,怎么霸生成的html页面。放到首页上去显示。
- 还是乱码问题?
- 关于Cookie的问题
- 一个小问题,帮忙解决一下!关于Tomcat
- 打算学java不知道该从什么地方开始。希望指点1,2.顺便问几个简单的问题
- hibernate实体映射自动将errorCode转成error_code到数据库查询问题
- <%@ page contentType="text/html; charset=GB2312" %> 提到mime指什么?
- (急)有没有用java或servlet开发出的从客户端上传到服务器上的可共享的bean
- 项目启动不起来,下边是错误信息
- 实现从severlet到分割页面的跳转
2.利用AOP,指定方法执行前开启事务,指定方法执行后关闭事务。
AOP实现原理是动态代理,动态代理也有两种实现方法:一种是其代理类的为原来类的接口,一种是其代理类是原来类的子类。
3.session开启时会连接数据库4.如果你使用的datasource是C3P0连接池,每次执行都会从数据池取连接然后放回;
如果你使用的是批量插入,只会是一次连接;
...依照上述代码,
事务在Dao类上时,执行多次连接;
事务加在Service类上是,执行一次连接;
事务在Dao类上时,执行多次连接多次事务;
事务加在Service类上是,执行多次连接一次事务;
但还需实践测试。
在方法开始前spring通过动态代理,利用AOP的方式,为普通要调用的方法在方法开始处添加事务控制,如果在方法中要进行save操作,则进行getSession
在调用getSession()方法时,拿到数据库连接,如果在一个循环中多次调用save方法,因为Spring会控制在一个事务中只有同一个Session,所以跟数据库的连接也只有一次,所以如果循环保存一个list,在service层循环和在Dao层循环都是一样的(spring事务是加在service层的情况),不知道我的理解对不对,牛人给出宝贵意见