<!--Atomikos JTA 事務(wù) begin-->
<bean id="dataSource1" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">
<property name="uniqueResourceName">
<value>mysql/main</value>
</property>
<property name="xaDataSourceClassName">
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
</property>
<property name="xaDataSourceProperties">
<value>URL=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8;user=root;password=123456</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="dataSource2" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">
<property name="uniqueResourceName">
<value>mysql/secondary</value>
</property>
<property name="xaDataSourceClassName">
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
</property>
<property name="xaDataSourceProperties">
<value>URL=jdbc:mysql://localhost:3306/aotsf?useUnicode=true&characterEncoding=utf-8;user=root;password=123456</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="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="300"/>
</bean>
<bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="atomikosTransactionManager"/>
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction"/>
</property>
</bean>
<bean id="atomikosTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager">
<ref bean="springTransactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
<bean id="jdbcBookDAO" class="dao.jdbc.BookDAO">
<property name="dataSource">
<ref bean="dataSource1"/>
</property>
</bean>
<bean id="jdbcTestDAO" class="dao.jdbc.TestDAO">
<property name="dataSource">
<ref bean="dataSource2"/>
</property>
</bean>
<bean id="atomikosJTAServiceDemo" parent="atomikosTransactionProxy">
<property name="target">
<bean class="service.AtomikosJTAServiceDemo">
<property name="jdbcBookDAO">
<ref bean="jdbcBookDAO"/>
</property>
<property name="jdbcTestDAO">
<ref bean="jdbcTestDAO"/>
</property>
</bean>
</property>
</bean>
<!--Atomikos JTA 事務(wù) end -->
<bean id="dataSource1" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">
<property name="uniqueResourceName">
<value>mysql/main</value>
</property>
<property name="xaDataSourceClassName">
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
</property>
<property name="xaDataSourceProperties">
<value>URL=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8;user=root;password=123456</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="dataSource2" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">
<property name="uniqueResourceName">
<value>mysql/secondary</value>
</property>
<property name="xaDataSourceClassName">
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
</property>
<property name="xaDataSourceProperties">
<value>URL=jdbc:mysql://localhost:3306/aotsf?useUnicode=true&characterEncoding=utf-8;user=root;password=123456</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="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="300"/>
</bean>
<bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="atomikosTransactionManager"/>
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction"/>
</property>
</bean>
<bean id="atomikosTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager">
<ref bean="springTransactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
<bean id="jdbcBookDAO" class="dao.jdbc.BookDAO">
<property name="dataSource">
<ref bean="dataSource1"/>
</property>
</bean>
<bean id="jdbcTestDAO" class="dao.jdbc.TestDAO">
<property name="dataSource">
<ref bean="dataSource2"/>
</property>
</bean>
<bean id="atomikosJTAServiceDemo" parent="atomikosTransactionProxy">
<property name="target">
<bean class="service.AtomikosJTAServiceDemo">
<property name="jdbcBookDAO">
<ref bean="jdbcBookDAO"/>
</property>
<property name="jdbcTestDAO">
<ref bean="jdbcTestDAO"/>
</property>
</bean>
</property>
</bean>
<!--Atomikos JTA 事務(wù) end -->
DAO層代碼
package dao.jdbc;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import domain.Book;
public class BookDAO extends JdbcDaoSupport{
public void addBook(Book book){
try{
JdbcTemplate jt=getJdbcTemplate();
String str_sql="insert into Book(isbn,bookname,author,note)VALUES(?,?,?,?)";
String[] args={book.getIsbn(),book.getBookname(),book.getAuthor(),book.getNote()};
jt.update(str_sql, args);
}catch(RuntimeException e){
System.out.println("添加Book失敗
");
e.printStackTrace();
throw e;
}
}
}
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import domain.Book;
public class BookDAO extends JdbcDaoSupport{
public void addBook(Book book){
try{
JdbcTemplate jt=getJdbcTemplate();
String str_sql="insert into Book(isbn,bookname,author,note)VALUES(?,?,?,?)";
String[] args={book.getIsbn(),book.getBookname(),book.getAuthor(),book.getNote()};
jt.update(str_sql, args);
}catch(RuntimeException e){
System.out.println("添加Book失敗

e.printStackTrace();
throw e;
}
}
}
package dao.jdbc;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class TestDAO extends JdbcDaoSupport{
public void addBook(Integer id, String email){
try{
JdbcTemplate jt=getJdbcTemplate();
String str_sql="insert into test(id,email)VALUES(?,?)";
Object[] args={id,email};
jt.update(str_sql, args);
}catch(RuntimeException e){
System.out.println("添加Test失敗
");
e.printStackTrace();
throw e;
}
}
}
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class TestDAO extends JdbcDaoSupport{
public void addBook(Integer id, String email){
try{
JdbcTemplate jt=getJdbcTemplate();
String str_sql="insert into test(id,email)VALUES(?,?)";
Object[] args={id,email};
jt.update(str_sql, args);
}catch(RuntimeException e){
System.out.println("添加Test失敗

e.printStackTrace();
throw e;
}
}
}
事層代碼
package service;
import dao.jdbc.BookDAO;
import dao.jdbc.TestDAO;
import domain.Book;
public class AtomikosJTAServiceDemo {
private BookDAO jdbcBookDAO;
private TestDAO jdbcTestDAO;
public String ok(){
System.out.println("開始
.");
jdbcTestDAO.addBook(Integer.valueOf("2"), "pdw2009 tom.com");
Book book=new Book();
book.setIsbn("ccdada66");
book.setAuthor("小東");
book.setNote("JTA測試");
book.setBookname("Atomikos學(xué)習(xí)");
jdbcBookDAO.addBook(book);
System.out.println("結(jié)束
.");
return "ok";
}
public BookDAO getJdbcBookDAO() {
return jdbcBookDAO;
}
public void setJdbcBookDAO(BookDAO jdbcBookDAO) {
this.jdbcBookDAO = jdbcBookDAO;
}
public TestDAO getJdbcTestDAO() {
return jdbcTestDAO;
}
public void setJdbcTestDAO(TestDAO jdbcTestDAO) {
this.jdbcTestDAO = jdbcTestDAO;
}
}
測試用例import dao.jdbc.BookDAO;
import dao.jdbc.TestDAO;
import domain.Book;
public class AtomikosJTAServiceDemo {
private BookDAO jdbcBookDAO;
private TestDAO jdbcTestDAO;
public String ok(){
System.out.println("開始

jdbcTestDAO.addBook(Integer.valueOf("2"), "pdw2009 tom.com");
Book book=new Book();
book.setIsbn("ccdada66");
book.setAuthor("小東");
book.setNote("JTA測試");
book.setBookname("Atomikos學(xué)習(xí)");
jdbcBookDAO.addBook(book);
System.out.println("結(jié)束

return "ok";
}
public BookDAO getJdbcBookDAO() {
return jdbcBookDAO;
}
public void setJdbcBookDAO(BookDAO jdbcBookDAO) {
this.jdbcBookDAO = jdbcBookDAO;
}
public TestDAO getJdbcTestDAO() {
return jdbcTestDAO;
}
public void setJdbcTestDAO(TestDAO jdbcTestDAO) {
this.jdbcTestDAO = jdbcTestDAO;
}
}
package services;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.AtomikosJTAServiceDemo;
public class AtomikosJTAServiceDemoTest {
ApplicationContext acx=null;
AtomikosJTAServiceDemo atomikosJTAServiceDemo=null;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
acx=new ClassPathXmlApplicationContext("applicationContext.xml");
atomikosJTAServiceDemo=(AtomikosJTAServiceDemo) acx.getBean("atomikosJTAServiceDemo");
}
@After
public void tearDown() throws Exception {
}
@Test
public void notnullTest()throws Exception{
assertNotNull(atomikosJTAServiceDemo);
}
@Test
public void okTest()throws Exception{
assertEquals(atomikosJTAServiceDemo.ok(),"ok");
}
}
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.AtomikosJTAServiceDemo;
public class AtomikosJTAServiceDemoTest {
ApplicationContext acx=null;
AtomikosJTAServiceDemo atomikosJTAServiceDemo=null;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
acx=new ClassPathXmlApplicationContext("applicationContext.xml");
atomikosJTAServiceDemo=(AtomikosJTAServiceDemo) acx.getBean("atomikosJTAServiceDemo");
}
@After
public void tearDown() throws Exception {
}
@Test
public void notnullTest()throws Exception{
assertNotNull(atomikosJTAServiceDemo);
}
@Test
public void okTest()throws Exception{
assertEquals(atomikosJTAServiceDemo.ok(),"ok");
}
}