spring注入dao单例问题

fengwind1 2012-05-05 06:40:05
我们一般都是把service,dao,session设置成单例,有几个问题不明白
1、现在有两个访问请求。因为是单例,所以线程1的service等于线程2的service,dao,session也是同样的,这样的话,这些成员变量就不是线程安全的了,怎么解释
2、现在我把session设置成原型,service有一个业务方法,并且这个业务方法是受事务控制的
@Transactional
public void aa(){
dao1.insert(xx1);
dao2.insert(xx2);
}
根据我的测试dao1得到的session与dao2的到的session不相等,既然session不相等,那就不是同一个会话,也就是说如果dao2.insert(xx2)出错,dao1.insert(xx1);也不会回滚,因为事务控制的是同一个会话,而根据我的测试,结果是会回滚的,怎么解释
...全文
316 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ylp198296 2012-05-06
  • 打赏
  • 举报
回复
1、首先spring 对service、dao可以是单例模式来管理,但是session的产生是由sessionFactory来生成的,虽然spring对sessionFactory的管理也是单例的,但要保证每个线程拿到的sesion不同做到线程全,可以用threadLocal来控制;(session不应该是单例的)
2、我不知道你是怎么测试的,我这边是这样测试的
如果要用spring的事物管理器来管理transaction,就像你写的那样(在一个方法上加事务),在一个service方法里调用dao的两个方法来操作数据库,那么你的dao1得到session应该是sessionFactory.getCurrentSession()这种方式来产生,同样dao2的session也应该跟dao1一样,否则如果用openSesesion()这种方式来产生新的session,数据是插入不到数据库的(不抛runTimeException也插入不进去).
也就是说用spring的事务管理器来管理session,在执行service的一个方法时,spring已经打开一个session,开启一个事务,service里调的方法用到的session跟spring打开的应该是同一个,这样事务才能传播下去,service方法结束,事务提交,完成操作.其中只要有一个方法出错(throw new RuntimeException("error!")),所有的方法都会rollback.

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧