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类上是,执行一次连接;
2.利用AOP,指定方法执行前开启事务,指定方法执行后关闭事务。
AOP实现原理是动态代理,动态代理也有两种实现方法:一种是其代理类的为原来类的接口,一种是其代理类是原来类的子类。
3.session开启时会连接数据库
4.如果你使用的datasource是C3P0连接池,每次执行都会从数据池取连接然后放回;
如果你使用的是批量插入,只会是一次连接;
...
依照上述代码,
事务在Dao类上时,执行多次连接;
事务加在Service类上是,执行一次连接;
#3
#4
个人感觉应该是:
事务在Dao类上时,执行多次连接多次事务;
事务加在Service类上是,执行多次连接一次事务;
但还需实践测试。
事务在Dao类上时,执行多次连接多次事务;
事务加在Service类上是,执行多次连接一次事务;
但还需实践测试。
#5
我说下自己的看法,不对的请大家指出
在方法开始前spring通过动态代理,利用AOP的方式,为普通要调用的方法在方法开始处添加事务控制,如果在方法中要进行save操作,则进行getSession
在调用getSession()方法时,拿到数据库连接,如果在一个循环中多次调用save方法,因为Spring会控制在一个事务中只有同一个Session,所以跟数据库的连接也只有一次,所以如果循环保存一个list,在service层循环和在Dao层循环都是一样的(spring事务是加在service层的情况),不知道我的理解对不对,牛人给出宝贵意见
在方法开始前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类上是,执行一次连接;
2.利用AOP,指定方法执行前开启事务,指定方法执行后关闭事务。
AOP实现原理是动态代理,动态代理也有两种实现方法:一种是其代理类的为原来类的接口,一种是其代理类是原来类的子类。
3.session开启时会连接数据库
4.如果你使用的datasource是C3P0连接池,每次执行都会从数据池取连接然后放回;
如果你使用的是批量插入,只会是一次连接;
...
依照上述代码,
事务在Dao类上时,执行多次连接;
事务加在Service类上是,执行一次连接;
#3
#4
个人感觉应该是:
事务在Dao类上时,执行多次连接多次事务;
事务加在Service类上是,执行多次连接一次事务;
但还需实践测试。
事务在Dao类上时,执行多次连接多次事务;
事务加在Service类上是,执行多次连接一次事务;
但还需实践测试。
#5
我说下自己的看法,不对的请大家指出
在方法开始前spring通过动态代理,利用AOP的方式,为普通要调用的方法在方法开始处添加事务控制,如果在方法中要进行save操作,则进行getSession
在调用getSession()方法时,拿到数据库连接,如果在一个循环中多次调用save方法,因为Spring会控制在一个事务中只有同一个Session,所以跟数据库的连接也只有一次,所以如果循环保存一个list,在service层循环和在Dao层循环都是一样的(spring事务是加在service层的情况),不知道我的理解对不对,牛人给出宝贵意见
在方法开始前spring通过动态代理,利用AOP的方式,为普通要调用的方法在方法开始处添加事务控制,如果在方法中要进行save操作,则进行getSession
在调用getSession()方法时,拿到数据库连接,如果在一个循环中多次调用save方法,因为Spring会控制在一个事务中只有同一个Session,所以跟数据库的连接也只有一次,所以如果循环保存一个list,在service层循环和在Dao层循环都是一样的(spring事务是加在service层的情况),不知道我的理解对不对,牛人给出宝贵意见
#6
没人回啊,顶下
#7
顶一下,高手给说下