Atomikos数据源配置方法有三种
Atomikos数据源配置方法有三种分别有:SimpleDataSourceBean,AtomikosDataSourceBean,AtomikosNonXADataSourceBean可任选一种
Simple表示基础数据库连接配置 <bean id="oracleJta" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <value>OracleXADataSourcevalue> property> <property name="xaDataSourceClassName"> <value>oracle.jdbc.xa.client.OracleXADataSourcevalue> property> <property name="xaDataSourceProperties"> <value>URL=jdbc:oracle:thin:@localhost:1521:orcl;user=orcl;password=value> property> <property name="exclusiveConnectionMode"> <value>truevalue> property> <property name="connectionPoolSize"> <value>3value> property> <property name="validatingQuery"> <value>SELECT 1value> property> bean> Atomikos表示必须要用到XA数据库驱动类,可设置连接池(经过测试推荐此方法) <bean id="oracleJta" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" lazy-init="true"> <property name="uniqueResourceName"> <value>OracleXADataSourcevalue> property> <property name="xaDataSourceClassName"> <value>oracle.jdbc.xa.client.OracleXADataSourcevalue> property> <property name="xaProperties"> <props> <prop key="URL">jdbc:oracle:thin:@localhost:1521:orclprop> <prop key="user">orclprop> <prop key="password">prop> props> property> <property name="poolSize"><value>1value>property> <property name="maxPoolSize"><value>30value>property> bean> AtomikosNon表示必须要用到普通数据库驱动类,可设置连接池 <bean id="oracleJta" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean"> <property name="uniqueResourceName"><value>OracleXADataSourcevalue>property> <property name="user"><value>orclvalue>property> <property name="password"><value>value>property> <property name="url"><value>jdbc:oracle:thin:@192.168.1.217:1521:orclvalue>property> <property name="driverClassName"><value>oracle.jdbc.OracleDrivervalue>property> <property name="poolSize"><value>1value>property> <property name="borrowConnectionTimeout"><value>60value>property> bean> 另外一个数据库在这就不在写了,设置同上只是mysql的驱动类名为:xaDataSourceClassName:com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
3.事务配置
Atomikos事务方法 <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown"> <value>truevalue> property> bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="240"/> bean> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager"> <ref bean="atomikosTransactionManager"/> property> <property name="userTransaction"> <ref bean="atomikosUserTransaction"/> property> bean> 接下来的代码和上例类同就不再写。
最近做的project中遇到要将数据库中的表分布到两台不同的服务器上的Mysql5.0中,project主要使用spring+ibatis。因此需要JTA的支持,但是tomcat不支持,所以就搜索开源的JTA实现。
最开始使用的是JOTM,但是使用中不能自动rollback,无论什么情况都commit。然后看到infoq上一篇文章提到Atomikos Transactions Essentials,Atomikos Transactions Essentials 3.0是Atomikos 开发的核心事务引擎,支持JDBC 以及JMS 的JTA/XA 事务。易于部署,轻量级,同时支持JDBC 以及JMS 。
Atomikos Transactions Essentials现在的版本是3.1.7,可以在http://www.atomikos.com/Main/TransactionsEssentialsDownloadForm 下载,在发布包里的examples文件夹下面有些例子,非常实用,我在使用中参考里面的例子很容易配置成功。先将发布包里面dist目录下的atomikos-util.jar,transactions.jar,transactions-api.jar,transactions-jta.jar copy到项目lib里面, 如果使用hibernate则需要将另外两个hibernate相关的jar页copy到项目里面,spring配置文件如下:
- < bean id = "dataSource" class = "com.atomikos.jdbc.SimpleDataSourceBean" init-method = "init" destroy-method = "close" >
- < property name = "uniqueResourceName" >
- < value > mysql/main value >
- property >
- < property name = "xaDataSourceClassName" >
- < value > com.mysql.jdbc.jdbc2.optional.MysqlXADataSource value >
- property >
- < property name = "xaDataSourceProperties" >
- < value > URL =${jdbc.url}; user =${jdbc.username}; password =${jdbc.password} value >
- property >
- < property name = "exclusiveConnectionMode" >
- < value > true value >
- property >
- < property name = "connectionPoolSize" >
- < value > 3 value >
- property >
- < property name = "validatingQuery" >
- < value > SELECT 1 value >
- property >
- bean >
- < bean id = "dataSourceB" class = "com.atomikos.jdbc.SimpleDataSourceBean" init-method = "init" destroy-method = "close" >
- < property name = "uniqueResourceName" >
- < value > mysql/news value >
- property >
- < property name = "xaDataSourceClassName" >
- < value > com.mysql.jdbc.jdbc2.optional.MysqlXADataSource value >
- property >
- < property name = "xaDataSourceProperties" >
- < value > URL =${jdbc.url.b}; user =${jdbc.username.b}; password =${jdbc.password.b} value >
- property >
- < property name = "exclusiveConnectionMode" >
- < value > true value >
- property >
- < property name = "connectionPoolSize" >
- < value > 3 value >
- property >
- < property name = "validatingQuery" >
- < value > SELECT 1 value >
- property >
- bean >
- < bean id = "lobHandler" class = "org.springframework.jdbc.support.lob.DefaultLobHandler" />
- < bean id = "sqlMapClient" class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >
- < property name = "configLocation" >
- < value > classpath:/sqlmap-config.xml value >
- property >
- < property name = "dataSource" ref = "dataSource" />
- < property name = "lobHandler" ref = "lobHandler" />
- bean >
- < bean id = "sqlMapClientB" class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >
- < property name = "configLocation" >
- < value > classpath:/sqlmap-configb.xml value >
- property >
- < property name = "dataSource" ref = "dataSourceB" />
- < property name = "lobHandler" ref = "lobHandler" />
- bean >
- < bean id = "atomikosTransactionManager" class = "com.atomikos.icatch.jta.UserTransactionManager" init-method = "init"
- destroy-method = "close" >
- < property name = "forceShutdown" >
- < value > true value >
- property >
- bean >
- < bean id = "atomikosUserTransaction" class = "com.atomikos.icatch.jta.UserTransactionImp" >
- < property name = "transactionTimeout" value = "240" />
- bean >
- < bean id = "transactionManager" class = "org.springframework.transaction.jta.JtaTransactionManager" >
- < property name = "transactionManager" >
- < ref bean = "atomikosTransactionManager" />
- property >
- < property name = "userTransaction" >
- < ref bean = "atomikosUserTransaction" />
- property >
- bean >
事务的配置, 使用了spring2.0的语法,所以将namesapce也帖出来了.
- 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"
- xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
- default-autowire = "byName" default-lazy-init = "true" >
- < aop:aspectj-autoproxy />
- < aop:config proxy-target-class = "true" >
- < aop:advisor pointcut = "execution(* *Facade.*(..))" advice-ref = "txAdvice" />
- < aop:advisor pointcut = "execution(* *Manager.*(..))" advice-ref = "txAdvice" />
- aop:config >
- < tx:advice id = "txAdvice" >
- < tx:attributes >
- < tx:method name = "get*" read-only = "true" />
- < tx:method name = "find*" read-only = "true" />
- < tx:method name = "has*" read-only = "true" />
- < tx:method name = "locate*" read-only = "true" />
- < tx:method name = "*" />
- tx:attributes >
- tx:advice >
- beans >
这样配置以后就可以使用分布式事务,测试中出现异常时事务也自动提交。和JOTM相比Atomikos Transactions Essentials更加稳定,它原来是商业项目,现在开源了。象mysql一样卖服务支持的。而且论坛页比较活跃,有问题很快可以解决。
使用XADatasource的数据源配置
-
"dataSource" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close"> -
"uniqueResourceName" > -
mysql/main -
"xaDataSourceClassName" > -
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource -
"xaDataSourceProperties" > -
URL=${jdbc.url};user=${jdbc.username};password=${jdbc.password} -
"exclusiveConnectionMode" > -
true -
"connectionPoolSize" > -
3 -
"validatingQuery" > -
SELECT 1 -
"dataSourceB" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close"> -
"uniqueResourceName" > -
mysql/news -
"xaDataSourceClassName" > -
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource -
"xaDataSourceProperties" > -
URL=${jdbc.url.b};user=${jdbc.username.b};password=${jdbc.password.b} -
"exclusiveConnectionMode" > -
true -
"connectionPoolSize" > -
3 -
"validatingQuery" > -
SELECT 1