MyException - 我的异常网
当前位置:我的异常网» 数据库 » Liferay同时连接多个数据库及其事务有关问题

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

www.MyException.Cn  网友分享于:2013-11-01  浏览:34次
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>

 

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>
接下去就不用多说了吧。早在以前的版本就可以实现的。如果大家有更好的办法请赐教!
2 楼 devilbaby 2007-03-13  
wenbin151 写道

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


我觉得有些问题不用描述得太详细,因为我给出的wiki(http://wiki.liferay.com/index.php/Connecting_to_Another_Datasource/Database)链接中已经有很详细的说明应该具体怎么做,我希望大家能从一些指导性的文章中学会看官方的文档来解决问题,而不是像小孩学说话一样。
而这篇文章的目的,可以说要点是阐述一个系统数据和业务数据分开的观点,另外一个要点就是想讨论如何解决事务问题,我希望大家能针对如何解决这个事务问题展开讨论
3 楼 devilbaby 2007-03-22  
改天有时间把事务改成JTA的方式,看能不能行
4 楼 lyo 2007-03-24  
改成 JTA肯定可以,但是如果不使用app server,就又要找其他工具来支持它了~
5 楼 pikachu 2007-03-25  
lyo 写道
改成 JTA肯定可以,但是如果不使用app server,就又要找其他工具来支持它了~


jotm咯
6 楼 devilbaby 2007-03-26  
jotm可以是可以,但是不建议引入,因为引入一个开源项目有一定的风险,要考虑他的活动性,稳定性,还有兼容性等等,而且要考虑他对性能的影响,所以我觉得首先应该从设计上避免两个不同数据库间的交互,如果不能避免的话,我觉得还是用app server也不愿意引入一个新的开源项目

文章评论

“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
如何成为一名黑客
如何成为一名黑客
程序员必看的十大电影
程序员必看的十大电影
旅行,写作,编程
旅行,写作,编程
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
我的丈夫是个程序员
我的丈夫是个程序员
那些争议最大的编程观点
那些争议最大的编程观点
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
每天工作4小时的程序员
每天工作4小时的程序员
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员都该阅读的书
程序员都该阅读的书
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
漫画:程序员的工作
漫画:程序员的工作
鲜为人知的编程真相
鲜为人知的编程真相
编程语言是女人
编程语言是女人
Java程序员必看电影
Java程序员必看电影
一个程序员的时间管理
一个程序员的时间管理
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
10个调试和排错的小建议
10个调试和排错的小建议
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
老程序员的下场
老程序员的下场
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员的鄙视链
程序员的鄙视链
程序员应该关注的一些事儿
程序员应该关注的一些事儿
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
我是如何打败拖延症的
我是如何打败拖延症的
代码女神横空出世
代码女神横空出世
中美印日四国程序员比较
中美印日四国程序员比较
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
为什么程序员都是夜猫子
为什么程序员都是夜猫子
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有