spring进行事务控制时,何时得到session,何时开启事务,何时打开链接

时间:2021-03-04 19:04:18
用了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);
}

7 个解决方案

#1


我也想知道。同求

#2


1.datasource注入hibernateTemplate的datasource属性后,session来自于hibernateTemplate内部的开启session方法
2.利用AOP,指定方法执行前开启事务,指定方法执行后关闭事务。
AOP实现原理是动态代理,动态代理也有两种实现方法:一种是其代理类的为原来类的接口,一种是其代理类是原来类的子类。
3.session开启时会连接数据库

4.如果你使用的datasource是C3P0连接池,每次执行都会从数据池取连接然后放回;
如果你使用的是批量插入,只会是一次连接;
...

依照上述代码,
事务在Dao类上时,执行多次连接;
事务加在Service类上是,执行一次连接;


#3


该回复于2012-07-02 08:23:42被版主删除

#4


个人感觉应该是:
事务在Dao类上时,执行多次连接多次事务;
事务加在Service类上是,执行多次连接一次事务;
但还需实践测试。

#5


我说下自己的看法,不对的请大家指出
在方法开始前spring通过动态代理,利用AOP的方式,为普通要调用的方法在方法开始处添加事务控制,如果在方法中要进行save操作,则进行getSession
在调用getSession()方法时,拿到数据库连接,如果在一个循环中多次调用save方法,因为Spring会控制在一个事务中只有同一个Session,所以跟数据库的连接也只有一次,所以如果循环保存一个list,在service层循环和在Dao层循环都是一样的(spring事务是加在service层的情况),不知道我的理解对不对,牛人给出宝贵意见

#6


没人回啊,顶下

#7


顶一下,高手给说下

#1


我也想知道。同求

#2


1.datasource注入hibernateTemplate的datasource属性后,session来自于hibernateTemplate内部的开启session方法
2.利用AOP,指定方法执行前开启事务,指定方法执行后关闭事务。
AOP实现原理是动态代理,动态代理也有两种实现方法:一种是其代理类的为原来类的接口,一种是其代理类是原来类的子类。
3.session开启时会连接数据库

4.如果你使用的datasource是C3P0连接池,每次执行都会从数据池取连接然后放回;
如果你使用的是批量插入,只会是一次连接;
...

依照上述代码,
事务在Dao类上时,执行多次连接;
事务加在Service类上是,执行一次连接;


#3


该回复于2012-07-02 08:23:42被版主删除

#4


个人感觉应该是:
事务在Dao类上时,执行多次连接多次事务;
事务加在Service类上是,执行多次连接一次事务;
但还需实践测试。

#5


我说下自己的看法,不对的请大家指出
在方法开始前spring通过动态代理,利用AOP的方式,为普通要调用的方法在方法开始处添加事务控制,如果在方法中要进行save操作,则进行getSession
在调用getSession()方法时,拿到数据库连接,如果在一个循环中多次调用save方法,因为Spring会控制在一个事务中只有同一个Session,所以跟数据库的连接也只有一次,所以如果循环保存一个list,在service层循环和在Dao层循环都是一样的(spring事务是加在service层的情况),不知道我的理解对不对,牛人给出宝贵意见

#6


没人回啊,顶下

#7


顶一下,高手给说下