壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1360|回复: 1

Liferay同时连接多个数据库及其事务问题 (转)

  [复制链接]
发表于 2010/5/14 11:00:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
Liferay运用的是spring框架,从早期版本开始,就可以同时连接多个数据库应用,但是在Liferay的文档还是代码中都没有关于同时连接多个数据库的说明,从4.2.0的版本开始出现了连接多个数据库的文档(请参照liferay wiki:http://wiki.liferay.com/index.php/Connecting_to_Another_Datasource/Database),代码中也有相应的明确定义。
       首先我们来看他的liferay-service-builder_4_2_0.dtd,在Element column中增加了两项属性data-source CDATA #IMPLIED和    session-factory CDATA #IMPLIED,对于这两个属性文档中是这样描述的:
The data-source value specifies the the data source target that is set to the   
persistence class. The default value is the Liferay data source. This is used in   
conjunction with session-factory.   
   
The session-factory value specifies the the session factory that is set to the   
persistence class. The default value is the Liferay session factory. This is   
used in conjunction with data-source   
由此可见,通过定义这两个属性,可以把自定义的某个entity指定不同的datasource和sessionfactory,从而实现连接不同的数据库。例如,我们按照wiki中的文章增加了一个ext-spring-training.xml的定义文件,然后我们就可以把entity的datasource指定为trainingDataSource,sessionfactory指定为trainingSessionFactory。
       指定了多个不同的数据库,取得了不同的connection,那从不同的sessionfactory得到了不同的transaction instance,大家担心的就是分段式事务问题,而liferay的事务处理是由spring support的,我们可以先看看spring中的PlatformTransactionManager
java 代码
public interface PlatformTransactionManager ...{   
  TransactionStatus getTransaction(TransactionDefinition definition)   
  throws TransactionException;   
  void commit(TransactionStatus status) throws TransactionException;   
  void rollback(TransactionStatus status) throws TransactionException;   
}   
当程序由于事务问题抛出异常的时候,spring文档是这样描述的:
  
Again in keeping with Spring's philosophy, the TransactionException that can be thrown by any of the
PlatformTransactionManager interface's methods is unchecked (i.e. it extends the
java.lang.RuntimeException class). Transaction infrastructure failures are almost invariably fatal. In rare
cases where application code can actually recover from a transaction failure, the application developer can still
choose to catch and handle TransactionException. The salient point is that developers are not forced to do so.
看spring的源码,你会发现当程序在运行过程中抛出unchecked exception的时候,transaction会设为rollback only的status从而回滚事务。所以我们设想只要抛出unchecked exception的时候,事务很同时回滚。通过测试,事务不能同时回滚。主要原因是因为处于不同的sessionfactory中,就是说两个事务之间没有任何的联系。
分布式事务,ejb方有个很好的解决方案,至于在liferay中如何运用,还需时间去研究。
       在liferay这样的活动性高的开源平台下做开发,未免升级时候会遇到种种问题,其中一个就是数据库的升级问题,所以一个很好的方案是把liferay的数据库和业务数据库分开。虽然事务没有按预期测试成功,但是对于多个没有事务关联的数据库来说,这个是个很好的解决方案,而且连接不同数据库是通过配置完成,对开发人员是透明的。希望这篇文章能对运用liferay的朋友有帮助。同时,欢迎大家针对连接多个数据库的方案特别是事务问题作出讨论。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ansonchan/archive/2007/11/08/1872969.aspx
 楼主| 发表于 2010/5/14 11:01:45 | 显示全部楼层
更多相关的说明,请到作者博客!!!

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 14:37 , Processed in 0.010661 second(s), 15 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表