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 是一个开源的企业...总之,Liferay 数据库配置是一个涉及多个层面的过程,需要对 Liferay、数据库以及应用服务器的配置都有一定了解。正确配置后,Liferay 将能充分利用你选择的数据库,提供稳定且高效的服务。
本技术文档主要关注 Liferay 的系统架构、核心技术、Portlet 开发、部署、数据库配置以及系统的定制化能力,同时也支持多语言环境。 1. **Liferay 系统架构** Liferay 的架构基于标准的 J2EE(Java 企业版)框架,...
在IT行业中,构建大型企业级应用常常涉及到多个技术框架的集成使用。本项目结合了"Maven"、"Liferay"、"Spring"和"Hibernate"这四大核心组件,旨在搭建一个高效、稳定且可扩展的Web应用程序。接下来,我们将详细探讨...
**Spring** 是一个全面的Java企业级应用开发框架,涵盖了依赖注入、面向切面编程、事务管理、数据访问等多个方面。在本案例中,Spring主要负责服务层的实现,通过IoC容器管理对象的生命周期和依赖关系,以及通过AOP...
【标题】"liferay + struts2 + spring + ibatis 修改版"是一个基于特定技术栈构建的Liferay门户平台的定制版本。这个项目整合了四个关键的Java Web开发框架,即Liferay、Struts2、Spring和iBatis,旨在提供更高效、...
综上所述,Liferay代码研读涵盖了从基础的项目构建、调试技巧,到核心业务逻辑解析,再到数据持久化、多语言支持以及前端界面的设计等多个方面,是一次全面深入的探索之旅。通过对这些知识点的学习,开发者不仅能...
这本书详尽地探讨了如何利用Liferay Portal提供的工具和技术来构建自定义的企业级应用,涵盖了用户策略、内容布局等多个核心主题。通过结合Struts、Hibernate和Spring等框架的实践案例,为读者提供了丰富的实战经验...
这些项目涵盖了Java编程在实际应用中的多个领域,展示了Java作为多用途编程语言的强大功能。以下是对每个项目的详细说明,以及它们涉及的关键知识点: 1. **BBS论坛**:这是一个基于Web的讨论平台,用户可以发布...
JavaEE5_API是Java企业版5的API规格说明书,它为开发者提供了在...这些接口涵盖了从数据库连接、会话管理到用户界面渲染等多个方面,是开发JavaEE5应用程序的基础。熟悉和掌握这些API将极大地提升开发效率和软件质量。
综上所述,`spring-modules-0.8.zip` 压缩包是 Spring 框架的一个重要扩展,它涵盖了 Web 开发中的多个关键领域,为开发者提供了丰富的工具和功能,以便在 Spring 上构建复杂、高效且易于维护的 Web 应用。...
Spring由多个模块组成,如Core Container、Data Access/Integration、Web、AOP、Instrumentation等,开发者可以根据项目需求选择合适的模块,实现轻量级的部署。 综上所述,"Spring 2.0 中文用户指南+核心技术文档...
同时,Spring 2.0还支持编程式事务管理,允许更精细的控制。 五、MVC(Model-View-Controller)框架 Spring 2.0引入了Spring MVC,这是一个轻量级的Web应用程序框架,用于处理HTTP请求和响应。DispatcherServlet是...
13. Liferay:Liferay是一个Java EE的Web应用程序平台,用于创建企业级的Web应用程序,特别是在企业内容管理和协作的场景下。 14. Apache Lucene:Apache Lucene是一个高效的全文搜索引擎库,它提供了完整的搜索...
Spring 2.0进一步加强了对AOP的支持,允许开发者定义和执行切面,实现跨越多个对象的功能,如日志记录、事务管理等。这使得业务逻辑和系统服务分离,代码结构更清晰。 三、数据访问集成 Spring 2.0提供了对各种数据...
在数据库中,主键是用于唯一标识记录的一列或多列数据,而“双字段主键”意味着它使用两个字段来确保记录的唯一性,这在处理分布式环境或者集群设置时可能很有用。 描述中提到的“PoC (Proof of Concept)”是一种...
开发者通过Portlets可以创建动态web页面的片段,而整个页面可能包含来自多个源的内容。本书涉及到的Portlet 2.0标准,是Java Portlet规范的一个版本,它规定了Portlets在Portal环境中如何工作,包括生命周期管理、...
Spring 2.0.6 是一个历史悠久但仍然具有重要意义的版本,它是Spring框架发展过程中的一个重要里程碑。这个版本发布于2007年,引入了许多关键特性,为开发者提供了更强大的工具来构建企业级Java应用。以下是关于...
它提供了一致的编程模型和事务管理策略,简化了数据库操作。 4. **Web MVC框架**:Spring 2.0的Web MVC框架提供了一个分层的架构,用于处理Web请求。它支持多种视图技术,如JSP、FreeMarker等,并且通过...