日期:2014-05-16  浏览次数:20411 次

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(Tra