首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

spring+jotm 多数据源事务管理(1)jdbc

2012-08-24 
spring+jotm 多数据源事务管理(一)jdbcspring+jotm 多数据源事务管理系列spring+jotm 多数据源事务管理(一

spring+jotm 多数据源事务管理(一)jdbc

spring+jotm 多数据源事务管理系列

spring+jotm 多数据源事务管理(一)jdbcspring+jotm 多数据源事务管理(二)hibernatespring+jotm 多数据源事务管理(三)JNDI+Tomcat

?

JOTM (Java Open Transaction Manager)是由ObjectWeb协会开发的功能完整的且资源开放的独立的事务管理器。

它提供了 JAVA 应用程序的事务支持,而且与 JTA( JAVA 事务 API)兼容。您可以在JOTM home page了解到更多的详细信息。

?

?

本文介绍如何在spring配置文件中加入jotm来实现多数据源事务控制。

?

先看一个没有加入jotm的例子

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:util="http://www.springframework.org/schema/util"xmlns:jee="http://www.springframework.org/schema/jee"xmlns:security="http://www.springframework.org/schema/security"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd            http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd"default-lazy-init="true">?<bean id="dataSource1"/><bean id="jdbcTemplate2" /><aop:config proxy-target-/><aop:advisor pointcut-ref="servicePoint1" id="txAdvisor1"advice-ref="txAdvice1" /></aop:config><tx:advice id="txAdvice1" transaction-manager="transactionManager1"><tx:attributes><tx:method name="find*" read-only="true" /><tx:method name="get*" read-only="true" /><tx:method name="query*" read-only="true" /><tx:method name="load*" read-only="true" /><tx:method name="add*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="create*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="save*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="update*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="modify*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="delete*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="remove*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="apply*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="handle*" propagation="REQUIRED"rollback-for="java.lang.Exception" /></tx:attributes></tx:advice><bean id="transactionManager1"ref="dataSource1" /></bean>       <aop:config proxy-target-/><aop:advisor pointcut-ref="servicePoint2" id="txAdvisor2"advice-ref="txAdvice2" /></aop:config><tx:advice id="txAdvice2" transaction-manager="transactionManager1"><tx:attributes><tx:method name="find*" read-only="true" /><tx:method name="get*" read-only="true" /><tx:method name="query*" read-only="true" /><tx:method name="load*" read-only="true" /><tx:method name="add*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="create*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="save*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="update*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="modify*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="delete*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="remove*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="apply*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="handle*" propagation="REQUIRED"rollback-for="java.lang.Exception" /></tx:attributes></tx:advice><bean id="transactionManager2"ref="dataSource2" /></bean>?</beans>

? 这样的配置不能够将两个数据源放到同一个事务中,一个事务回滚不会使另一个事务同时回滚,这样就会造成脏数据。

?

? spring本身提供了对jotm的支持,所以spring整合jotm很方便,下面看加入jotm的例子

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:util="http://www.springframework.org/schema/util"xmlns:jee="http://www.springframework.org/schema/jee"xmlns:security="http://www.springframework.org/schema/security"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd            http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd"default-lazy-init="true"><bean id="jotm" /><bean id="transactionManager"ref="jotm" /></bean><bean id="dataSource1" ref="jotm" /><property name="driverName" value="${datasource1.driver}" /><property name="url" value="${datasource1.url}" /></bean></property><property name="user" value="${datasource1.username}" /><property name="password" value="${datasource1.password}" /></bean><bean id="dataSource2" ref="jotm" /><property name="driverName" value="${datasource2.driver}" /><property name="url" value="${datasource2.url}" /></bean></property><property name="user" value="${datasource2.username}" /><property name="password" value="${datasource2.password}" /></bean><bean id="jdbcTemplate" ref="dataSource1" /></bean><bean id="jdbcTemplateDas" ref="dataSource2" /></bean>       <aop:config proxy-target-/><aop:advisor pointcut-ref="servicePoint" id="txAdvisor"advice-ref="defaultTxAdvice" /></aop:config><tx:advice id="defaultTxAdvice"><tx:attributes><tx:method name="find*" read-only="true" /><tx:method name="get*" read-only="true" /><tx:method name="query*" read-only="true" /><tx:method name="load*" read-only="true" /><tx:method name="add*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="create*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="save*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="update*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="modify*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="delete*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="remove*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="apply*" propagation="REQUIRED"rollback-for="java.lang.Exception" /><tx:method name="handle*" propagation="REQUIRED"rollback-for="java.lang.Exception" /></tx:attributes></tx:advice></beans>

?ok,这样两个数据源就会统一由jotm进行管理,代码层面不需要任何修改。

?

?

?另外,在使用jotm时,可能会抛如下异常:

java.lang.NoSuchMethodError at:sun.rmi.transport.ObjectTable.getStub(Ljava/rmi/Remote;)Ljava/rmi/server/RemoteStub;

?

此时,在项目编译路径下新建一个属性文件,名称:carol.properties,即可解决问题。

# JNDI (Protocol Invocation)carol.protocols=jrmp# Local RMI Invocationcarol.jvm.rmi.local.call=true# do not use CAROL JNDI wrappercarol.start.jndi=false# do not start a name servercarol.start.ns=falsecarol.start.rmi=false# Naming Factorycarol.jndi.java.naming.factory.url.pkgs=org.apache.naming

热点排行