开心:解决一个osgi里hibernate事务transaction的问题
2010-10-04 22:37
405 查看
首先项目里有好多个bundle,简单的来说,我们分成两类,一类是业务方面的bundle,不同业务的放在不同bundle里;另一类是框架类的,比如hibernate,hibernate存在一个独立的bundle里,启动的时候会把所有Persistent Object读进去,然后发布出一个session factory服务,业务方面的bundle就用这个session factroy做db操作。事务管理使用的AOP在另外一个bundle里,这也算是一个框架bundle。所以来说,任何调用会先在这个AOP的bundle里会创建transaction,然后才调用业务bundle的服务。
session factory
|
---------------------------------
Call Service | |
----------------》AOP bunlde -————service bunlde
可能明白的一眼就看出来了,这是有问题的。
Spring里的hibernate在做事务控制的时候,在AOP里会创建事务管理器,这个事务管理器会被存在TransactionSynchronizationManager类的resources变量里,key就是前面的那个session factory,之后在hibernate template里,会去寻找这个事务管理器,还是用哪个session factory作为key。
如果在没有osgi的时候这是很好的,但是一上osgi就不行了,为什么呢?
原因就是,osgi发布出来的service,在不同bundl里得到的引用是不一样的,甚至来说,每次去试图调用service,得到的引用都是不一样的。这些引用之所以不一样,是因为被osgi包了一层,而且每次实时去包。
所以虽然AOP里创建了事务管理器,但是业务bundle里的session factory和AOP创建事务管理器时的session factory 是不一样的,造成hibernate template找不到东西,所以默认为没有事务了。
解决方法就是发布了一个session factory的factory(绕),每个bundle用这个新service去得到session factory。
session factory
|
---------------------------------
Call Service | |
----------------》AOP bunlde -————service bunlde
可能明白的一眼就看出来了,这是有问题的。
Spring里的hibernate在做事务控制的时候,在AOP里会创建事务管理器,这个事务管理器会被存在TransactionSynchronizationManager类的resources变量里,key就是前面的那个session factory,之后在hibernate template里,会去寻找这个事务管理器,还是用哪个session factory作为key。
如果在没有osgi的时候这是很好的,但是一上osgi就不行了,为什么呢?
原因就是,osgi发布出来的service,在不同bundl里得到的引用是不一样的,甚至来说,每次去试图调用service,得到的引用都是不一样的。这些引用之所以不一样,是因为被osgi包了一层,而且每次实时去包。
所以虽然AOP里创建了事务管理器,但是业务bundle里的session factory和AOP创建事务管理器时的session factory 是不一样的,造成hibernate template找不到东西,所以默认为没有事务了。
解决方法就是发布了一个session factory的factory(绕),每个bundle用这个新service去得到session factory。
相关文章推荐
- 解决一个Sping管理hibernate时的事务问题(No Hibernate Session bound to thread)
- Transaction事务注解和DynamicDataSource动态数据源切换问题解决
- pring3、hibernate4、JPA整合(包括很久未解决的事务管理问题)
- 解决Could not open Hibernate Session for transaction问题
- Hibernate延迟加载以及利用Spring事务完美解决延迟加载问题
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)
- hibernate中获取session和开启事务时遇到问题及解决
- 解决Hibernate查找视图有一个空值的时候返回的对象为null的问题
- Spring中事务管理与Hibernate自带事务管理冲突的一个问题
- 发现一个hibernate针对derby数据库的问题bug,及解决办法
- spring管理hibernate事务报异常--Transaction not successfully started解决方法
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- Proxool+hibernate+spring时事务自动回滚导致无法提交的问题解决
- 一个XA事务问题解决小结
- 用NSIS安装日志install。log解决了一个安装出现隐蔽的问题、不用看代码,可以节省大把时间!开心!
- 解决Could not open Hibernate Session for transaction问题
- 一个问题解决。开心。哈哈。。。
- 【Spring】spring-mvc hibernate druid jdbc等数据源事务配置详解(解决注解事务不生效问题)
- Spring中事务管理与Hibernate自带事务管理冲突的一个问题
- Spring-hibernate开发时遇到 Could not obtain transaction-synchronized Session for current thread的问题解决