spring管理hibernate,事务配置的疑惑

luc_ne 2008-03-17 03:33:53
web应用,使用spring+hibernate,一般service和dao都设计为单例。那么dao中的session实例是如何管理的呢?
是每调用一次HibernateDaoSupport中的方法操作一次db都重新获取session呢?
还是一个dao实例中只有一个session实例呢?
...全文
752 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
westsum 2008-03-19
  • 打赏
  • 举报
回复
将Session绑定在jdbc事务上在配置文件里加上:
hibernate.transaction.factory.class = org.hibernate.transaction.JDBCTransactionFactory
hibernate.current_session_context_class=thread
这样当前的Session和关联的Hibernate事务被绑定到当前线程上

要绑定到JTA事务上
hibernate.transaction.factory.class = org.hibernate.transaction.JTATransactionFactory
hibernate.current_session_context_class=jta
睿音 2008-03-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 luc_ne 的帖子:]
web应用,使用spring+hibernate,一般service和dao都设计为单例。那么dao中的session实例是如何管理的呢?
是每调用一次HibernateDaoSupport中的方法操作一次db都重新获取session呢?
还是一个dao实例中只有一个session实例呢?
[/Quote]

Spring的Session是与线程绑定的,一个线程里面Session是共享的。


luc_ne 2008-03-18
  • 打赏
  • 举报
回复
呵呵,自己太懒,是该看看spring的源码了
favorite7w 2008-03-18
  • 打赏
  • 举报
回复
同一时刻不同的请求,必定是由不同的线程发起的。
而ThreadLocal的作用就是为不同的线程保存同一类的不同实例。
而在Lz上面描述的场景里,session就是这个需要为不同线程独立维护的实例。
luc_ne 2008-03-18
  • 打赏
  • 举报
回复
举个例子吧,service中调用dao的a,b两个方法去操作数据库。
那么对一个请求来说,a,b执行时应该是使用的一个session。
而同一时刻不同的请求所用到的session是不同的。
而service,dao都是单例的,spring是如何做到不同请求使用不同session的呢?
favorite7w 2008-03-18
  • 打赏
  • 举报
回复
上面少打一个字,应该是"看过Spring有关这方面的代码",晕。
favorite7w 2008-03-18
  • 打赏
  • 举报
回复
看过Spring有关这方面的代码,但我觉得是用ThreadLocal实现的,类似于HibernateUtil.java的实现,Lz可以在网上搜一下,挺简单又实用的一种方法。
luc_ne 2008-03-18
  • 打赏
  • 举报
回复
to tianyidan
使用spring的事务配置,没有必要去手动管理session。
我只是想知道spring内部是如何实现的。
ldgs 2008-03-18
  • 打赏
  • 举报
回复
在每个dao操作中使用SessionFactory.getCurrentSession()方法,该方法可以得到当前事务绑定的session。
tianyidan 2008-03-17
  • 打赏
  • 举报
回复
我觉得如果配置了事物管理,而且没有手动去创建session,那么应该是在事务管理那个bean里创建一个新的session。
oliwa 2008-03-17
  • 打赏
  • 举报
回复

我对这个问题也去研究过,不知道有没有研究透;
你如果配置了事务,它会对session的开启关闭进行管理,不需要你手工完成,session的开启关闭应该是在Service层的,你service里的方法有可能涉及到两次或者多次对数据库进行操作,完全可以共享同一个session,不需要每次对数据库操作都创建一个新的session
fulianglove 2008-03-17
  • 打赏
  • 举报
回复
session不是线程安全的,每个线程维护个session,至于什么时候创建好像是有个属性来设置的,不过我忘了。。。。。

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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