用了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.   

    1.datasource注入hibernateTemplate的datasource属性后,session来自于hibernateTemplate内部的开启session方法
    2.利用AOP,指定方法执行前开启事务,指定方法执行后关闭事务。
    AOP实现原理是动态代理,动态代理也有两种实现方法:一种是其代理类的为原来类的接口,一种是其代理类是原来类的子类。
    3.session开启时会连接数据库4.如果你使用的datasource是C3P0连接池,每次执行都会从数据池取连接然后放回;
    如果你使用的是批量插入,只会是一次连接;
    ...依照上述代码,
    事务在Dao类上时,执行多次连接;
    事务加在Service类上是,执行一次连接;
      

  2.   

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

  3.   

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