`
devilbaby
  • 浏览: 68389 次
  • 性别: Icon_minigender_1
  • 来自: 珠海->上海
社区版块
存档分类
最新评论

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

阅读更多
    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,对于这两个属性文档中是这样描述的:

  1. The data-source value specifies the the data source target that is set to the   
  2. persistence class. The default value is the Liferay data source. This is used in   
  3. conjunction with session-factory.   
  4.   
  5. The session-factory value specifies the the session factory that is set to the   
  6. persistence class. The default value is the Liferay session factory. This is   
  7. used in conjunction with data-source   

<o:p></o:p> 由此可见,通过定义这两个属性,可以把自定义的某个entity指定不同的datasourcesessionfactory,从而实现连接不同的数据库。例如,我们按照wiki中的文章增加了一个ext-spring-training.xml的定义文件,然后我们就可以把entitydatasource指定为trainingDataSourcesessionfactory指定为trainingSessionFactory<o:p></o:p>

       指定了多个不同的数据库,取得了不同的connection,那从不同的sessionfactory得到了不同的transaction instance,大家担心的就是分段式事务问题,而liferay的事务处理是由spring support的,我们可以先看看spring中的PlatformTransactionManager

java 代码
  1. public interface PlatformTransactionManager {   
  2.   TransactionStatus getTransaction(TransactionDefinition definition)   
  3.   throws TransactionException;   
  4.   void commit(TransactionStatus status) throws TransactionException;   
  5.   void rollback(TransactionStatus status) throws TransactionException;   
  6. }   

当程序由于事务问题抛出异常的时候,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 onlystatus从而回滚事务。所以我们设想只要抛出unchecked exception的时候,事务很同时回滚。通过测试,事务不能同时回滚。主要原因是因为处于不同的sessionfactory中,就是说两个事务之间没有任何的联系。<o:p></o:p>

分布式事务,ejb方有个很好的解决方案,至于在liferay中如何运用,还需时间去研究。<o:p></o:p>

<o:p></o:p>

       liferay这样的活动性高的开源平台下做开发,未免升级时候会遇到种种问题,其中一个就是数据库的升级问题,所以一个很好的方案是把liferay的数据库和业务数据库分开。虽然事务没有按预期测试成功,但是对于多个没有事务关联的数据库来说,这个是个很好的解决方案,而且连接不同数据库是通过配置完成,对开发人员是透明的。希望这篇文章能对运用liferay的朋友有帮助。同时,欢迎大家针对连接多个数据库的方案特别是事务问题作出讨论。<o:p></o:p>

 

分享到:
评论
6 楼 devilbaby 2007-03-26  
jotm可以是可以,但是不建议引入,因为引入一个开源项目有一定的风险,要考虑他的活动性,稳定性,还有兼容性等等,而且要考虑他对性能的影响,所以我觉得首先应该从设计上避免两个不同数据库间的交互,如果不能避免的话,我觉得还是用app server也不愿意引入一个新的开源项目
5 楼 pikachu 2007-03-25  
lyo 写道
改成 JTA肯定可以,但是如果不使用app server,就又要找其他工具来支持它了~


jotm咯
4 楼 lyo 2007-03-24  
改成 JTA肯定可以,但是如果不使用app server,就又要找其他工具来支持它了~
3 楼 devilbaby 2007-03-22  
改天有时间把事务改成JTA的方式,看能不能行
2 楼 devilbaby 2007-03-13  
wenbin151 写道

不错,但是没有说到点上。具体怎么做呢?一个很好的方案是把liferay的数据库和业务数据库分开


我觉得有些问题不用描述得太详细,因为我给出的wiki(http://wiki.liferay.com/index.php/Connecting_to_Another_Datasource/Database)链接中已经有很详细的说明应该具体怎么做,我希望大家能从一些指导性的文章中学会看官方的文档来解决问题,而不是像小孩学说话一样。
而这篇文章的目的,可以说要点是阐述一个系统数据和业务数据分开的观点,另外一个要点就是想讨论如何解决事务问题,我希望大家能针对如何解决这个事务问题展开讨论
1 楼 wenbin151 2007-03-12  
不错,但是没有说到点上。具体怎么做呢?一个很好的方案是把liferay的数据库和业务数据库分开。看代码:
<bean id="lingeasyDataSourceTarget" class="com.liferay.portal.spring.jndi.JndiObjectFactoryBean" lazy-init="true">
<property name="jndiName">
<value>jdbc/ErpBoPool</value>
</property>
</bean>
<bean id="ErpBoDataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy" lazy-init="true">
<property name="targetDataSource">
<ref bean="ErpBoDataSourceTarget" />
</property>
</bean>
<bean id="ErpBoSessionFactory" class="com.liferay.portal.spring.hibernate.HibernateConfiguration" lazy-init="true">
<property name="dataSource">
<ref bean="ErpBoDataSource" />
</property>
</bean>
接下去就不用多说了吧。早在以前的版本就可以实现的。如果大家有更好的办法请赐教!

相关推荐

    Liferay Database Configuration

    Liferay 是一个开源的企业...总之,Liferay 数据库配置是一个涉及多个层面的过程,需要对 Liferay、数据库以及应用服务器的配置都有一定了解。正确配置后,Liferay 将能充分利用你选择的数据库,提供稳定且高效的服务。

    Liferay技术文档

    本技术文档主要关注 Liferay 的系统架构、核心技术、Portlet 开发、部署、数据库配置以及系统的定制化能力,同时也支持多语言环境。 1. **Liferay 系统架构** Liferay 的架构基于标准的 J2EE(Java 企业版)框架,...

    maven liferay spring hibernate

    在IT行业中,构建大型企业级应用常常涉及到多个技术框架的集成使用。本项目结合了"Maven"、"Liferay"、"Spring"和"Hibernate"这四大核心组件,旨在搭建一个高效、稳定且可扩展的Web应用程序。接下来,我们将详细探讨...

    liferay + struts2 + spring + ibatis整合开发案例

    **Spring** 是一个全面的Java企业级应用开发框架,涵盖了依赖注入、面向切面编程、事务管理、数据访问等多个方面。在本案例中,Spring主要负责服务层的实现,通过IoC容器管理对象的生命周期和依赖关系,以及通过AOP...

    liferay + struts2 + spring + ibatis 修改版

    【标题】"liferay + struts2 + spring + ibatis 修改版"是一个基于特定技术栈构建的Liferay门户平台的定制版本。这个项目整合了四个关键的Java Web开发框架,即Liferay、Struts2、Spring和iBatis,旨在提供更高效、...

    liferay代码研读

    综上所述,Liferay代码研读涵盖了从基础的项目构建、调试技巧,到核心业务逻辑解析,再到数据持久化、多语言支持以及前端界面的设计等多个方面,是一次全面深入的探索之旅。通过对这些知识点的学习,开发者不仅能...

    LiferayPortal二次开发指南

    这本书详尽地探讨了如何利用Liferay Portal提供的工具和技术来构建自定义的企业级应用,涵盖了用户策略、内容布局等多个核心主题。通过结合Struts、Hibernate和Spring等框架的实践案例,为读者提供了丰富的实战经验...

    十个java项目

    这些项目涵盖了Java编程在实际应用中的多个领域,展示了Java作为多用途编程语言的强大功能。以下是对每个项目的详细说明,以及它们涉及的关键知识点: 1. **BBS论坛**:这是一个基于Web的讨论平台,用户可以发布...

    JavaEE5_API

    JavaEE5_API是Java企业版5的API规格说明书,它为开发者提供了在...这些接口涵盖了从数据库连接、会话管理到用户界面渲染等多个方面,是开发JavaEE5应用程序的基础。熟悉和掌握这些API将极大地提升开发效率和软件质量。

    spring-modules-0.8.zip

    综上所述,`spring-modules-0.8.zip` 压缩包是 Spring 框架的一个重要扩展,它涵盖了 Web 开发中的多个关键领域,为开发者提供了丰富的工具和功能,以便在 Spring 上构建复杂、高效且易于维护的 Web 应用。...

    Spring 2.0 中文用户指南+核心技术文档 .rar

    Spring由多个模块组成,如Core Container、Data Access/Integration、Web、AOP、Instrumentation等,开发者可以根据项目需求选择合适的模块,实现轻量级的部署。 综上所述,"Spring 2.0 中文用户指南+核心技术文档...

    spring2.0源码

    同时,Spring 2.0还支持编程式事务管理,允许更精细的控制。 五、MVC(Model-View-Controller)框架 Spring 2.0引入了Spring MVC,这是一个轻量级的Web应用程序框架,用于处理HTTP请求和响应。DispatcherServlet是...

    总结Java部分的框架和开源项目.pdf

    13. Liferay:Liferay是一个Java EE的Web应用程序平台,用于创建企业级的Web应用程序,特别是在企业内容管理和协作的场景下。 14. Apache Lucene:Apache Lucene是一个高效的全文搜索引擎库,它提供了完整的搜索...

    Spring2.0 最新中文帮助文档

    Spring 2.0进一步加强了对AOP的支持,允许开发者定义和执行切面,实现跨越多个对象的功能,如日志记录、事务管理等。这使得业务逻辑和系统服务分离,代码结构更清晰。 三、数据访问集成 Spring 2.0提供了对各种数据...

    double-key-portlet:带有双字段主键 PoC 的 PoC ServiceBuilder 用于测试集群设置

    在数据库中,主键是用于唯一标识记录的一列或多列数据,而“双字段主键”意味着它使用两个字段来确保记录的唯一性,这在处理分布式环境或者集群设置时可能很有用。 描述中提到的“PoC (Proof of Concept)”是一种...

    portlets in action

    开发者通过Portlets可以创建动态web页面的片段,而整个页面可能包含来自多个源的内容。本书涉及到的Portlet 2.0标准,是Java Portlet规范的一个版本,它规定了Portlets在Portal环境中如何工作,包括生命周期管理、...

    spring2.0.6jar包

    Spring 2.0.6 是一个历史悠久但仍然具有重要意义的版本,它是Spring框架发展过程中的一个重要里程碑。这个版本发布于2007年,引入了许多关键特性,为开发者提供了更强大的工具来构建企业级Java应用。以下是关于...

    spring2.0 中文教程

    它提供了一致的编程模型和事务管理策略,简化了数据库操作。 4. **Web MVC框架**:Spring 2.0的Web MVC框架提供了一个分层的架构,用于处理Web请求。它支持多种视图技术,如JSP、FreeMarker等,并且通过...

Global site tag (gtag.js) - Google Analytics