Liferay运用的是spring框架,从早期版本开始,就可以同时连接多个数据库应用,但是在Liferay的文档还是代码中都没有关于同时连接多个数据库的说明,从<st1:chsdate isrocdate="False" w:st="on" year="1899" day="30" islunardate="False" month="12">
4.2.0</st1:chsdate>
的版本开始出现了连接多个数据库的文档(请参照liferay wiki:http://wiki.liferay.com/index.php/Connecting_to_Another_Datasource/Database),代码中也有相应的明确定义。<o:p></o:p>
首先我们来看他的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
<o:p></o:p> 由此可见,通过定义这两个属性,可以把自定义的某个entity指定不同的datasource和sessionfactory,从而实现连接不同的数据库。例如,我们按照wiki中的文章增加了一个ext-spring-training.xml的定义文件,然后我们就可以把entity的datasource指定为trainingDataSource,sessionfactory指定为trainingSessionFactory。<o:p></o:p>
指定了多个不同的数据库,取得了不同的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<o:p></o:p>
PlatformTransactionManager interface's methods is unchecked (i.e. it extends the<o:p></o:p>
java.lang.RuntimeException class). Transaction infrastructure failures are almost invariably fatal. In rare<o:p></o:p>
cases where application code can actually recover from a transaction failure, the application developer can still<o:p></o:p>
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中,就是说两个事务之间没有任何的联系。<o:p></o:p>
分布式事务,ejb方有个很好的解决方案,至于在liferay中如何运用,还需时间去研究。<o:p></o:p>
<o:p></o:p>
在liferay这样的活动性高的开源平台下做开发,未免升级时候会遇到种种问题,其中一个就是数据库的升级问题,所以一个很好的方案是把liferay的数据库和业务数据库分开。虽然事务没有按预期测试成功,但是对于多个没有事务关联的数据库来说,这个是个很好的解决方案,而且连接不同数据库是通过配置完成,对开发人员是透明的。希望这篇文章能对运用liferay的朋友有帮助。同时,欢迎大家针对连接多个数据库的方案特别是事务问题作出讨论。<o:p></o:p>
分享到:
相关推荐
Liferay(5.1.2)的数据库由自身绑定的HSQLDB转成oracle(10G)虽然步骤不多,但因英文的参考资料说的太笼统,而网上相关资料又太少,所以操作起来很费时费力,尤其是当某个错误的操作,出现一大堆的错误提示,可能误导...
Liferay连接数据库方案.doc
CAS4.2.4 连接Liferay6.2以上版本数据库用户表验证用户 project代码
Liferay Portal 数据库介绍
Liferay Portal数据库读写说明
全面的liferay表结构详细描述,为liferay开发提供支持
CAS4.2.4 连接Liferay6.2以上版本数据库用户表验证用户
描述了liferay的数据库表结构以及关联关系 示例: 社区、组织、地区、用户组、用户与角色之间的关系 1、表Groups_Roles 主要功能:存储社区与角色的关系; 存储组织与角色的关系; 存储地区与角色的关系; 存储用户...
Liferay+Portal_数据库结构介绍,详细描述了liferay portal的数据库。
Liferay+Portal+数据库介绍+.doc
关于liferay portal数据库配置,以我个人项目经验配置oracle,供各位参考
Liferay+Portal+数据库介绍+.doc Liferay+权限管理.doc liferay-portal-5-2-systems-development-sample-chapter-5-managing-pages[1].pdf LiferayPortal二次开发指南.pdf liferay常用模块的简介....
Liferay Portal Liferay IDE
避免了Liferay自身下载PDF和图片时在当前页面打开的问题,同时下载时可以多次点击下载的超链接,不用刷新页面。也算是绕开了一个Liferay大的Bug。 本实例的版本是基于:liferay-portal-6.2.10.1-ee-ga1,可能用的...
本教程详细的为大家介绍了Liferay的安装步骤以及Liferay的相关配置,如数据库的连接。
liferay 超级学习文档 liferay 框架 java hibernate liferay 不用多说
Liferay中的AUI框架,官方叫做Alloy,是一个UI超框架,能为浏览器的三方面,结构,风格和表现建立网络应用提供连续的简单的API。 它融合了三种设计语言:HTML, CSS 和 JAVA。 准确来说AUI是Liferay在YUI的基础上...
Liferay Portal框架基本表共82个具体表结构设计如下: 第一部分:Portal相关表结构(共32张表) 根据portal-hbm.xml中定义的Hibernate的定义顺序进行描述。
liferay学习 liferay页面 Noname2.jsp