Spring---多个数据库的事务操作配置(JNDI)

一,当有记录需要操作两个以上数据库时,这时就会引发事务问题,,,jndi能解决此类问题

context.xml

<Context path="/spring-all" docBase="spring-all" debug="5" reloadable="true"
	crossContext="true">

	<Resource name="jdbc/mysql" auth="Container"
		type="javax.sql.DataSource" maxActive="100" maxIdle="50"
		maxWait="10000" 
		driverClassName="com.mysql.jdbc.Driver"
		url="jdbc:mysql://127.0.0.1:3306/orange1"
		username="root"
		password="kgddxsksk"
		testOnBorrow="true" testWhileIdle="true"/>	
		
		<Resource name="jdbc/sqlserver" auth="Container"
		type="javax.sql.DataSource" maxActive="100" maxIdle="50"
		maxWait="10000" 
		driverClassName="net.sourceforge.jtds.jdbc.Driver"
		url="jdbc:jtds:sqlserver://192.168.7.83:1433/test"
		username="sa"
		password="kgddxsksk"
		testOnBorrow="true" testWhileIdle="true"/>	
</Context>

 

二,spring中的事务配置

 

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xsi:schemaLocation="
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/tx
     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
     http://www.springframework.org/schema/jee 
     http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">

	<!-- 
		<bean id="dataSource1"
		class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName">
		<value>com.mysql.jdbc.Driver</value>
		</property>
		<property name="url">
		<value>jdbc:mysql://127.0.0.1:3306/orange1</value>
		</property>
		<property name="username">
		<value>root</value>
		</property>
		<property name="password">
		<value>kgddxsksk</value>
		</property>
		</bean>
		
	-->
	<jee:jndi-lookup id="dataSource1"
		jndi-name="java:/comp/env/jdbc/mysql">
	</jee:jndi-lookup>
	
	<jee:jndi-lookup id="dataSource2"
		jndi-name="java:/comp/env/jdbc/sqlserver">
	</jee:jndi-lookup>
	
	<bean id="jotm"
		class="com.spring.web.controller.JotmFactoryBean" />
	<!-- 
		当使用jta时,说明使用隔离级别
	-->
	<bean id="txManager"
		class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="allowCustomIsolationLevels" value="true" />
		<property name="userTransaction">
			<ref local="jotm" />
		</property>
	</bean>

	<!-- "person" table in mysql and "user" table in sqlserver -->
	<bean id="person" class="com.spring.web.model.Person"></bean>
	<bean id="personDao" class="com.spring.web.dao.PersonDao">
		<property name="dataSource" ref="dataSource1"></property>
	</bean>
	<bean id="user" class="com.spring.web.model.User"></bean>
	<bean id="userDao" class="com.spring.web.dao.UserDao">
		<property name="dataSource" ref="dataSource2"></property>
	</bean>

	<bean id="userService"
		class="com.spring.web.services.UserService">
		<property name="userDao" ref="userDao"></property>
		<property name="personDao" ref="personDao"></property>
	</bean>

	<!-- 事务配置 -->
	<!-- 非检查型(RuntimeException)默认才会回滚 -->
	<!-- 
		对txManager进行了事务控制,,,所以在代码中使用持久化api时,也要是定制的,如
		JdbcTemplate、HibernateTemplate和JdoTemplate,,,也可用相应的
		DataSourceUtils(针对JDBC),SessionFactoryUtils(针对Hibernate),PersistenceManagerFactoryUtils(针对JDO)
		因为这些类都会引用manager中的事务
	-->
	<tx:annotation-driven transaction-manager="txManager" />
	<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<!-- the transactional semantics... -->
		<tx:attributes >
			<!-- propagation  只有在嵌套事务(service调用了service里面的方法)存在时,几种机制才有意义 -->
			<tx:method name="insert*" propagation="REQUIRED" isolation="REPEATABLE_READ"/>
		</tx:attributes>
	</tx:advice>

	<!-- ensure that the above transactional advice runs for any execution
		of an operation defined by the Service interface -->
	<aop:config>
		<aop:pointcut id="daoOperation"
			expression="execution (* com.spring.web.services.*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="daoOperation" />
	</aop:config>


</beans>

 

 

JotmFactoryBean在新版本中已实移除,需自己加入才可以.

public class JotmFactoryBean implements FactoryBean, DisposableBean {

	private Current jotmCurrent;

	private Jotm jotm;


	public JotmFactoryBean() throws NamingException {
		// Check for already active JOTM instance.
		this.jotmCurrent = Current.getCurrent();

		// If none found, create new local JOTM instance.
		if (this.jotmCurrent == null) {
			// Only for use within the current Spring context:
			// local, not bound to registry.
			this.jotm = new Jotm(true, false);
			this.jotmCurrent = Current.getCurrent();
		}
	}

	/**
	 * Set the default transaction timeout for the JOTM instance.
	 * <p>Should only be called for a local JOTM instance,
	 * not when accessing an existing (shared) JOTM instance.
	 */
	public void setDefaultTimeout(int defaultTimeout) {
		this.jotmCurrent.setDefaultTimeout(defaultTimeout);
	}

	/**
	 * Return the JOTM instance created by this factory bean, if any.
	 * Will be <code>null</code> if an already active JOTM instance is used.
	 * <p>Application code should never need to access this.
	 */
	public Jotm getJotm() {
		return this.jotm;
	}


	public Object getObject() {
		return this.jotmCurrent;
	}

	public Class getObjectType() {
		return this.jotmCurrent.getClass();
	}

	public boolean isSingleton() {
		return true;
	}


	/**
	 * Stop the local JOTM instance, if created by this FactoryBean.
	 */
	public void destroy() {
		if (this.jotm != null) {
			this.jotm.stop();
		}
	}

}

 还得加入jotm中相应的一些包..http://androidguy.blog.51cto.com/974126/216454

carol.jar

carol-iiop-delegate.jar

carol-interceptors.jar

howl.jar

jotm.jar

xapool.jar

 

你可能感兴趣的:(spring,AOP,bean,mysql,jdbc)