分布式事务 sqlsessionresttemplate session支持多数据源吗

6206人阅读
数据层(3)
最近这几天一直在整 怎么实现分布式事务。找了很多资料,不过大都相近类同。对Oracle、SQL Server、Mysql数已做过测试,其中Mysql5.0以上的才支持分布式事务。
对于这些,主要是之前根本没有接触过分布式事务,还错找了一些分布式事数据库的资料,呵呵,结果不是我目前所需要的。
测试过程中出现了很多错误,一直都通不过,以为是用户权限还有数据库服务的问题,但一切都配置良好的情况下还一直都通不过。结果发现,我导入的都是一些普通的JDBC连接包,于是狂搜实现XA事务的jar包。
Mysql:&&&&&&&&&&& mysql-connector-java-5.1.6-bin.jar
SQL Server:&&&&&& sqljdbc.jar
Oracle:&&&&&&&&&& ojdbc14.jar
用的是这些包才顺利通过运行。后面会附上这几个jar包。
好了,把源代码也附上:
import com.microsoft.sqlserver.jdbc.SQLServerXADataS
import com.mysql.jdbc.jdbc2.optional.MysqlXADataS
import java.sql.*;
import java.util.logging.L
import java.util.logging.L
import javax.sql.*;
import javax.transaction.xa.*;
import oracle.jdbc.xa.client.OracleXADataS
public class Mutil_DataSource_Test {
&&& public static void main(String[] args){
&&&&&&& Mutil_DataSource_Test mdt = new Mutil_DataSource_Test();
&&&&&&& try {
&&&&&&&&&&& mdt.test1();
&&&&&&& } catch (Exception ex) {
&&&&&&&&&&& System.out.println(&除SQLException、XAException之外的异常: \n&);
&&&&&&&&&&& Logger.getLogger(Mutil_DataSource_Test.class.getName()).log(Level.SEVERE, null, ex);
&&& class MyXid implements Xid{
&&&&&&& int formatId;
&&&&&&& byte globalTransactionId[];
&&&&&&& byte branchQualifier[];
&&&&&&& public MyXid(){
&&&&&&& public MyXid(int formatId,byte[] globalTransactionId,byte[] branchQualifier){
&&&&&&&&&&& this.formatId = formatId;
&&&&&&&&&&& this.globalTransactionId = globalTransactionId;
&&&&&&&&&&& this.branchQualifier = branchQ
&&&&&&& public int getFormatId() {
&&&&&&&&&&& return this.formatId;
&&&&&&& public void setFormatId(int formatId){
&&&&&&&&&&& this.formatId = formatId;
&&&&&&& public byte[] getGlobalTransactionId() {
&&&&&&&&&&& return this.globalTransactionId;
&&&&&&& public void setGlobalTransactionId(byte[] globalTransactionId){
&&&&&&&&&&& this.globalTransactionId = globalTransactionId;
&&&&&&& public byte[] getBranchQualifier() {
&&&&&&&&&&& return this.branchQ
&&&&&&& public void setBranchQualifier(byte[] branchQualifier){
&&&&&&&&&&& this.branchQualifier = branchQ
&&& //多数据库测试
&&& public void test1() {
&&&&&&& //定义所需用到的变量
&&&&&&&& Connection mysqlCn =
&&&&&&& Connection sqlCn =
&&&&&&& Connection mysqlCn2 =
&&&&&&& Connection oraCn =
&&&&&&& MysqlXADataSource mysqlDs =
&&&&&&& SQLServerXADataSource sqlDs =
&&&&&&& MysqlXADataSource mysqlDs2 =
&&&&&&& OracleXADataSource oraDs =
&&&&&&& XAConnection xamysqlCn =
&&&&&&& XAConnection xasqlCn =
&&&&&&& XAConnection xamysqlCn2 =
&&&&&&& XAConnection xaoraCn =
&&&&&&& XAResource xamysqlRes =
&&&&&&& XAResource xasqlRes =
&&&&&&& XAResource xamysqlRes2 =
&&&&&&& XAResource xaoraRes =
&&&&&&& Xid mysqlXid =
&&&&&&& Xid sqlXid =
&&&&&&& Xid mysqlXid2 =
&&&&&&& Xid oraXid =
&&&&&&& Statement mysqlpst =
&&&&&&& Statement sqlpst =
&&&&&&& Statement mysqlpst2 =
&&&&&&& Statement orapst =
&&&&&&& //获得数据源
&&&&&&& mysqlDs = new MysqlXADataSource();
&&&&&&& mysqlDs.setURL(&jdbc:mysql://localhost:3306/test&);
&&&&&&& mysqlDs2 = new MysqlXADataSource();
&&&&&&& mysqlDs2.setURL(&jdbc:mysql://10.10.10.119:3306/test&);
&&&&&&& sqlDs = new SQLServerXADataSource();
&&&&&&& sqlDs.setURL(&jdbc:sqlserver://10.10.10.119:1433;DatabaseName=RTC;loginTimeout=20;user=password=chgpwd122105&);
//&&&&&&& sqlDs.setUser(&sa&);
//&&&&&&& sqlDs.setPassword(&chgpwd122105&);
//&&&&&&& sqlDs.setServerName(&10.10.10.119&);
//&&&&&&& sqlDs.setPortNumber(1433);
//&&&&&&& sqlDs.setDatabaseName(&RTC&);
&&&&&&& oraDs = new OracleXADataSource();
&&&&&&& oraDs.setURL(&jdbc:oracle:thin:@10.10.10.119:1521:WMS&);
&&&&&&& //获得连接
&&&&&&& xamysqlCn = mysqlDs.getXAConnection(&root&, &9999&);
System.out.println(&xamysqlCn: &+xamysqlCn);
&&&&&&& xasqlCn = sqlDs.getXAConnection();
System.out.println(&xasqlCn: &+xasqlCn);
&&&&&&& xamysqlCn2 = mysqlDs2.getXAConnection(&root&, &9999&);
System.out.println(&xamysqlCn2: &+xamysqlCn2);
&&&&&&& xaoraCn = oraDs.getXAConnection(&tiger&, &tiger&);
System.out.println(&xaoraCn: &+xaoraCn);
&&&&&&& mysqlCn = xamysqlCn.getConnection();
&&&&&&& sqlCn = xasqlCn.getConnection();
&&&&&&& mysqlCn2 = xamysqlCn2.getConnection();
&&&&&&& oraCn = xaoraCn.getConnection();
&&&&&&& mysqlpst = mysqlCn.createStatement();
&&&&&&& sqlpst = sqlCn.createStatement();
&&&&&&& mysqlpst2 = mysqlCn2.createStatement();
&&&&&&& orapst = oraCn.createStatement();
&&&&&&& //定义XAResource
&&&&&&& xamysqlRes = xamysqlCn.getXAResource();
&&&&&&& xasqlRes = xasqlCn.getXAResource();
&&&&&&& xamysqlRes2 = xamysqlCn2.getXAResource();
&&&&&&& xaoraRes = xaoraCn.getXAResource();
&&&&&&& //定义Xid
&&&&&&& mysqlXid = new MyXid(0, new byte[]{0x01}, new byte[]{0x02});
&&&&&&& sqlXid = new MyXid(0, new byte[]{0x01}, new byte[]{0x03});
&&&&&&& mysqlXid2 = new MyXid(0, new byte[]{0x01}, new byte[]{0x04});
&&&&&&& oraXid = new MyXid(0, new byte[]{0x01}, new byte[]{0x05});
&&&&&&& //执行Mysql
&&&&&&& xamysqlRes.start(mysqlXid, XAResource.TMNOFLAGS);&&&&&&&
&&&&&&& mysqlpst.executeUpdate(&insert into test values(4,'XA','F','Class4')&);
&&&&&&& xamysqlRes.end(mysqlXid, XAResource.TMSUCCESS);
&&&&&&& //执行SQLServer
&&&&&&& xasqlRes.start(sqlXid, XAResource.TMNOFLAGS);
&&&&&&& sqlpst.executeUpdate(&insert into test values('444')&);
&&&&&&& xasqlRes.end(sqlXid, XAResource.TMSUCCESS);
&&&&&&& //执行Mysql
&&&&&&& xamysqlRes2.start(mysqlXid2, XAResource.TMNOFLAGS);
&&&&&&& mysqlpst2.executeUpdate(&insert into test values(4,'XA','F','Class4')&);
&&&&&&& xamysqlRes2.end(mysqlXid2, XAResource.TMSUCCESS);
&&&&&&& //执行Oracle
&&&&&&& System.out.println(&xaoraRes: &+xaoraRes);
&&&&&&& xaoraRes.start(oraXid, XAResource.TMNOFLAGS);
&&&&&&& orapst.executeUpdate(&insert into test123 values('4','44','444')&);
&&&&&&& System.out.println(&oraXid: &+oraXid);
&&&&&&& xaoraRes.end(oraXid, XAResource.TMSUCCESS);
&&&&&&& //准备
&&&&&&& int mysqlRea = xamysqlRes.prepare(mysqlXid);
&&&&&&& int sqlRea = xasqlRes.prepare(sqlXid);
&&&&&&& int mysqlRea2 = xamysqlRes2.prepare(mysqlXid2);
&&&&&&& int oraRea = xaoraRes.prepare(oraXid);
&&&&&&& //判断准备就绪与否& 提交或回滚
&&&&&&& if(mysqlRea == xamysqlRes.XA_OK && mysqlRea2 == xamysqlRes.XA_OK && oraRea == xaoraRes.XA_OK && sqlRea == xasqlRes.XA_OK){
//&&&&&&& if(mysqlRea == xamysqlRes.XA_OK && mysqlRea2 == xamysqlRes.XA_OK && oraRea == xaoraRes.XA_OK){
//&&&&&&& if(mysqlRea == xamysqlRes.XA_OK && sqlRea == xasqlRes.XA_OK && mysqlRea2 == xamysqlRes.XA_OK){
//&&&&&&& if(mysqlRea == xamysqlRes.XA_OK && mysqlRea2 == xamysqlRes.XA_OK){
&&&&&&&&&&& mit(mysqlXid, false);
System.out.println(&Mysql 事务提交成功!&);
&&&&&&&&&&& mit(sqlXid, false);
System.out.println(&SQLServer 事务提交成功!&);
&&&&&&&&&&& mit(mysqlXid2, false);
System.out.println(&Mysql2 事务提交成功!&);
&&&&&&&&&&& mit(oraXid, false);
System.out.println(&Oracle 事务提交成功!&);
&&&&&&& }else{
&&&&&&&&&&& xamysqlRes.rollback(mysqlXid);
&&&&&&&&&&& xasqlRes.rollback(sqlXid);
&&&&&&&&&&& xamysqlRes2.rollback(mysqlXid2);
&&&&&&&&&&& xaoraRes.rollback(oraXid);
System.out.println(&事务回滚成功!&);
&&& }catch(SQLException ex){
&&&&&&& Logger.getLogger(Mutil_DataSource_Test.class.getName()).log(Level.SEVERE, null, ex);
&&&&&&& try{
&&&&&&&&&&& xamysqlRes.rollback(mysqlXid);
&&&&&&&&&&& xasqlRes.rollback(sqlXid);
&&&&&&&&&&& xamysqlRes2.rollback(mysqlXid2);
&&&&&&&&&&& xaoraRes.rollback(oraXid);
&&&&&&& }catch(XAException e){
&&&&&&&&&&& System.out.println(&回滚也出错咯!~&);
&&&&&&&&&&& e.printStackTrace();
&&& }catch(XAException ex){
&&&&&&& Logger.getLogger(Mutil_DataSource_Test.class.getName()).log(Level.SEVERE, null, ex);
&&& }finally{
&&&&&&& try {
&&&&&&& //关闭
&&&&&&& mysqlpst.close();
&&&&&&& mysqlCn.close();
&&&&&&& xamysqlCn.close();
&&&&&&& sqlpst.close();
&&&&&&& sqlCn.close();
&&&&&&& xasqlCn.close();
&&&&&&& mysqlpst2.close();
&&&&&&& mysqlCn2.close();
&&&&&&& xamysqlCn2.close();
&&&&&&& orapst.close();
&&&&&&& oraCn.close();
&&&&&&& xaoraCn.close();
&&&&&&& } catch (SQLException ex) {
&&&&&&&&&&& Logger.getLogger(Mutil_DataSource_Test.class.getName()).log(Level.SEVERE, null, ex);
分布式事务分为两个阶段,第一个阶段相当于是一个预提交,第二阶段才是正真的提交。
首先要实现的是Xid接口,formatId可以理解为一个全局事务的ID,不过我上面的代码没有去做一些异常的处理,还有正确的链接的关闭,只是自己做的一个小小的测试,以后项目中再去处理这些。第一阶段如果出错或是不顺利则不会提交,需要做一些回滚处理。如果顺利则准备提交,进入第二阶段,在第二阶段可能会出现问题,如果第一个分支事务提交成功了,而后有一个分支事务提交失败,这样则会造成数据不准确,目前还不知道有没有方法可以解决些问题,好像XAResource.recover()可以处理,但具体怎么解决,在项目中自己还是可以想到办法解决。
对XA分布式事务& 我是初学者,而且也没有谁指点,只是在网上找些资料。我上面的理解可能也还有些不足或是错误。希望高手看到后能指点指点。
下载次数: 106
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:416280次
积分:5510
积分:5510
排名:第3572名
原创:128篇
转载:111篇
评论:58条
(1)(1)(1)(3)(1)(3)(1)(1)(2)(5)(1)(5)(4)(5)(5)(2)(5)(8)(4)(4)(4)(1)(4)(16)(3)(2)(5)(2)(7)(7)(2)(10)(3)(2)(8)(7)(1)(5)(1)(11)(1)(4)(2)(11)(9)(8)(6)(6)(10)(11)(7)(5)atomikos实现多数据源支持分布式事务管理(spring、tomcat、JTA)
atomikos实现多数据源支持分布式事务管理(spring、tomcat、JTA)
[摘要:新浪微专:IT国子监 (记得存眷噢) /itguozijian Atomikos TransactionsEssentials 是一个靠得住的库,能够到场到您的Java运用顺序,也便是道为了应用那个产物,您必需增加一些jar文件(]
新浪微博:IT国子监(记得关注噢)&/itguozijianAtomikos TransactionsEssentials 是一个可靠的库,可以加入到您的Java应用程序,也就是说为了使用这个产品,您必须添加一些jar文件(包括在dist和lib文件夹下)到您的应用程序或者应用程序服务器。起因:&小项目,没有用分布式,但要操作两个数据库。本以为随便用spring配置两个数据源就搞定,查询是没问题,问题是有一个数据库老是插不进数据。Google狂搜之后,大概了解到是事务控制的问题。我用的是spring的声明式事务管理(&tx:annotation-driven/&)。用一般的数据源配置,只有一个数据源的事务生效,其它数据源只能读不能写。&有帖子说,要支持多数据源的事务,只能用JTA事务管理(没用过 -_-||),而且应用服务器还不能是Tomcat(一直在用tomcat,不想换-_-!!),头疼了。幸亏后面还有说,有第三方的实现支持JTA事务管理,一是JOTM,一是Atomikos。只要用了其中一个,还能继续用Tomcat。因为名字短,先考虑用JOTM。到官网一看,最后更新日期是2010年。。呃。。转向Atomikos。在Atomikos的官网看看文档,看看例子,边做边调试,一个下午下来,总算有点成果,高兴之余做个记录。其中会涉及到一些概念,比如分布式事务、JTA、XA,我都有搜来了解一下,因理解肤浅没法做记录。下面只是记录&Atomikos TransactionsEssentials 是一个为Java平台提供增值服务的并且开源类事务管理器,以下是包括在这个开源版本中的一些功能:l& 全面崩溃 / 重启恢复l& 兼容标准的SUN公司JTA APIl& 嵌套事务l& 为XA和非XA提供内置的JDBC适配器注释:XA:XA协议由Tuxedo首先提出的,并交给X/Open组织,作为资源管理器(数据库)与事务管理器的接口标准。目前,Oracle、Informix、DB2和Sybase等各大数据库厂家都提供对XA的支持。XA协议采用两阶段提交方式来管理分布式事务。XA接口提供资源管理器与事务管理器之间进行通信的标准接口。XA协议包括两套函数,以xa_开头的及以ax_开头的。以下的函数使事务管理器可以对资源管理器进行的操作:  1)xa_open,xa_close:建立和关闭与资源管理器的连接。  2)xa_start,xa_end:开始和结束一个本地事务。  3)xa_prepare,xa_commit,xa_rollback:预提交、提交和回滚一个本地事务。  4)xa_recover:回滚一个已进行预提交的事务。  5)ax_开头的函数使资源管理器可以动态地在事务管理器中进行注册,并可以对XID(TRANSACTION IDS)进行操作。  6)ax_reg,ax_unreg;允许一个资源管理器在一个TMS(TRANSACTION MANAGER SERVER)中动态注册或撤消注册。l& 内置的JMS适配器XA-capable JMS队列连接器注释:JMS:jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。l& 通过XA API兼容第三方适配器l& 更好的整合您的项目l& 集成Hibernateatomikos配合spring的使用方法:&1、依赖包&Atomikos的:&transactions-jdbc&transactions-jta&transactions-api&transactions&atomikos-utils&还有一个不要忘了,是jta的包。&用maven要简单一点,只需要加入两个依赖:&Xml代码&&dependency&&&&&&&&groupId&com.atomikos&/groupId&&&&&&&&artifactId&transactions-jdbc&/artifactId&&&&&&&&version&3.7.0&/version&&&&/dependency&&&&dependency&&&&&&&&groupId&javax.transaction&/groupId&&&&&&&&artifactId&jta&/artifactId&&&&&&&&version&1.1&/version&&&&/dependency&&&2、配置数据源&&&& 这一步是比较重要的。要用AtomikosDataSourceBean,而不是以前用的连接池如dbcp。最好也用XA(这东西我还不太懂),注意jdbc的链接地址和登陆账号与普通连接池的配置的格式不一样。下面是一个mysql数据库的配置举例:&Xml代码&&bean&id="dataSource1"&class="com.atomikos.jdbc.AtomikosDataSourceBean"&init-method="init"&destroy-method="close"&&&&&&&&property&name="uniqueResourceName"&value="ds1"/&&&&&&&&property&name="xaDataSourceClassName"&value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/&&&&&&&&property&name="xaProperties"&&&&&&&&&&&&props&&&&&&&&&&&&&&&&prop&key="url"&jdbc:mysql://localhost/test&/prop&&&&&&&&&&&&&&&&prop&key="user"&test&/prop&&&&&&&&&&&&&&&&prop&key="password"&test&/prop&&&&&&&&&&&&/props&&&&&&&&/property&&&&&&&&property&name="minPoolSize"&value="10"&/&&&&&&&&property&name="maxPoolSize"&value="100"&/&&&&&&&&property&name="borrowConnectionTimeout"&value="30"&/&&&&&&&&property&name="testQuery"&value="select&1"&/&&&&&&&&property&name="maintenanceInterval"&value="60"&/&&&&/bean&&&再来一个sybase的配置举例:&Xml代码&&bean&id="dataSource2"&class="com.atomikos.jdbc.AtomikosDataSourceBean"&init-method="init"&destroy-method="close"&&&&&&&&property&name="uniqueResourceName"&value="ds2"/&&&&&&&&property&name="xaDataSourceClassName"&value="com.sybase.jdbc3.jdbc.SybXADataSource"/&&&&&&&&property&name="xaProperties"&&&&&&&&&&&&props&&&&&&&&&&&&&&&&prop&key="serverName"&192.168.1.10&/prop&&&&&&&&&&&&&&&&&&&&&&&&&&&&prop&key="portNumber"&2638&/prop&&&&&&&&&&&&&&&&&&&&&&&&&&&&prop&key="databaseName"&test&/prop&&&&&&&&&&&&&&&&prop&key="user"&test&/prop&&&&&&&&&&&&&&&&prop&key="password"&test&/prop&&&&&&&&&&&&/props&&&&&&&&/property&&&&&&&&property&name="minPoolSize"&value="10"&/&&&&&&&&property&name="maxPoolSize"&value="100"&/&&&&&&&&property&name="borrowConnectionTimeout"&value="30"&/&&&&&&&&property&name="testQuery"&value="select&1"&/&&&&&&&&property&name="maintenanceInterval"&value="60"&/&&&&/bean&&&3、使用数据源&&&& 这一步与平时好像没什么不一样。我做例子的时候是用mybatis,配置如下:&Xml代码&&bean&id="sqlSessionFactory1"&class="org.mybatis.spring.SqlSessionFactoryBean"&&&&&&&&property&name="dataSource"&ref="dataSource1"/&&&&/bean&&&&bean&id="sqlSessionFactory2"&class="org.mybatis.spring.SqlSessionFactoryBean"&&&&&&&&property&name="dataSource"&ref="dataSource2"/&&&&/bean&&&当然,mybatis还要配置一下映射文件的自动扫描,这里与atomikos无关:&Xml代码&&bean&class="org.mybatis.spring.mapper.MapperScannerConfigurer"&&&&&&&&property&name="basePackage"&value="xx."&/&&&&&&&&property&name="sqlSessionFactory"&ref="sqlSessionFactory1"/&&&&/bean&&&&bean&class="org.mybatis.spring.mapper.MapperScannerConfigurer"&&&&&&&&property&name="basePackage"&value="yy."&/&&&&&&&&property&name="sqlSessionFactory"&ref="sqlSessionFactory2"/&&&&/bean&&&用spring JdbcTemplate应该与普通使用没什么不同,用hibernate可能会有点不一样,没测试过。&4、配置jta事务管理&&&& 这是很关键的一步。原理我不太懂,例子如下:&Xml代码&&bean&id="transactionManager"&class="org.springframework.transaction.jta.JtaTransactionManager"&&&&&&&&property&name="transactionManager"&&&&&&&&&&&&bean&class="com.atomikos.icatch.jta.UserTransactionManager"&init-method="init"&destroy-method="close"&&&&&&&&&&&&&&&&property&name="forceShutdown"&value="true"/&&&&&&&&&&&&/bean&&&&&&&&/property&&&&&&&&property&name="userTransaction"&&&&&&&&&&&&bean&class="com.atomikos.icatch.jta.UserTransactionImp"/&&&&&&&&/property&&&&/bean&&&当然,用spring的声明式事务配置,再加上一行:&Xml代码&&tx:annotation-driven/&&&(注意,本来要配置transaction-manager属性,如:&tx:annotation-driven&transaction-manager="transactionManager"/&。这里没有配置是因为它的默认值是transactionManager)&5、atomikos的配置文件jta.properties&&&& 这个文件一般放在根路径吧,与log4j.properties类似。jta.properties也可命名为transactions.properties。如果不配置这个文件,项目也能启动,因为几乎所有配置项都有默认值。最好还是配置了,详细配置信息请查看:/Documentation/JtaProperties。&6、不管是用JdbcTemplate、mybatis还是hibernate,应该都可以写代码来测试了。。。&新浪微博:IT国子监(记得关注噢)&/itguozijian
感谢关注 Ithao123Java频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序[1]。在设计Swift时.就有意和Objective-C共存,Objective-C是Apple操作系统在导入Swift前使用的编程语言
Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来使得编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。
IThao123周刊4890人阅读
&span style=&font-family: Arial, Helvetica, sans- background-color: rgb(255, 255, 255);&&这个是本人做的一个Atomikos  分布式jta事务的 小的mavenWeb项目 ,包含 mysql 、oracle 、sqlserver 3个数据源&/span&
完整工程下载路径&http://download.csdn.net/detail/npf_java/8786825
拿一个mysql + oracle 数据源配置为例吧
database.properties
mysql.qa.db.url=jdbc:mysql://localhost:3306/ssm_qa?useUnicode=true&characterEncoding=UTF-8
mysql.qa.db.user=root
mysql.qa.db.password=ROOT
mysql.dev.db.url=jdbc:mysql://localhost:3306/ssm_dev?useUnicode=true&characterEncoding=UTF-8
mysql.dev.db.user=root
mysql.dev.db.password=ROOT
#oracle DB
oracle.qa.db.url=jdbc\:oracle\:thin\:@1.1.1.32\:1521\:nyj
oracle.qa.db.driverClassName=oracle.jdbc.OracleDriver
oracle.qa.db.testQuery=select 1 from dual
oracle.qa.db.user=oms
oracle.qa.db.password=oms
oracle.dev.db.url=jdbc\:oracle\:thin\:@1.1.1.32\:1521\:nyj
oracle.dev.db.driverClassName=oracle.jdbc.OracleDriver
oracle.dev.db.testQuery=select 1 from dual
oracle.dev.db.user=com
oracle.dev.db.password=lsd
#sqlserver DB
sqlserver.qa.db.driverClass=com.microsoft.sqlserver.jdbc.SQLServerDriver
sqlserver.qa.db.url=jdbc:sqlserver://1.1.1.11:1433;DatabaseName=dl_xbny
sqlserver.qa.db.user=dl_xbny
sqlserver.qa.db.password=dl123456
sqlserver.dev.db.driverClass=com.microsoft.sqlserver.jdbc.SQLServerDriver
sqlserver.dev.db.url=jdbc:sqlserver://1.1.1.11:1433;DatabaseName=com_xbny
sqlserver.dev.db.user=com_xbny
sqlserver.dev.db.password=com123456
mysql-oracle-beans.xml
&?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:context=&http://www.springframework.org/schema/context&
xmlns:tx=&http://www.springframework.org/schema/tx& xmlns:jdbc=&http://www.springframework.org/schema/jdbc&
xmlns:rabbit=&http://www.springframework.org/schema/rabbit&
xmlns:cache=&http://www.springframework.org/schema/cache& xmlns:task=&http://www.springframework.org/schema/task&
xsi:schemaLocation=&http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd&&
&context:component-scan base-package=&com.xy&&
&context:exclude-filter type=&annotation& expression=&org.springframework.stereotype.Controller&/&
&/context:component-scan&
&context:property-placeholder location=&classpath:context/database.properties&/&
&tx:annotation-driven/&
&bean id=&abstractXADataSource& class=&com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean& init-method=&init&
destroy-method=&close& abstract=&true&&
&property name=&xaDataSourceClassName& value=&com.mysql.jdbc.Driver&/&
&property name=&poolSize& value=&10& /&
&property name=&minPoolSize& value=&10&/&
&property name=&maxPoolSize& value=&30&/&
&property name=&borrowConnectionTimeout& value=&60&/&
&property name=&reapTimeout& value=&20&/&
&!-- 最大空闲时间 --&
&property name=&maxIdleTime& value=&60&/&
&property name=&maintenanceInterval& value=&60&/&
&property name=&loginTimeout& value=&60&/&
&property name=&testQuery&&
&value&select 1&/value&
&/property&
&bean id=&qadataSource& class=&com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean&&
&!-- value只要两个数据源不同就行,随便取名 --&
&property name=&uniqueResourceName& value=&dlDB& /&
&property name=&driverClassName&&
&value&com.mysql.jdbc.Driver&/value&
&/property&
&property name=&url&&
&value&${mysql.qa.db.url}&/value&
&/property&
&property name=&user&&
&value&${mysql.qa.db.user}&/value&
&/property&
&property name=&password&&
&value&${mysql.qa.db.password}&/value&
&/property&
&bean id=&devdataSource& class=&com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean&&
&!-- value只要两个数据源不同就行,随便取名 --&
&property name=&uniqueResourceName& value=&nyxsDB& /&
&property name=&driverClassName&&
&value&${oracle.dev.db.driverClassName}&/value&
&/property&
&property name=&url&&
&value&${oracle.dev.db.url}&/value&
&/property&
&property name=&user&&
&value&${oracle.dev.db.user}&/value&
&/property&
&property name=&password&&
&value&${oracle.dev.db.password}&/value&
&/property&
&bean id=&qasqlSessionFactory& class=&org.mybatis.spring.SqlSessionFactoryBean&&
&property name=&dataSource& ref=&qadataSource& /&
&property name=&mapperLocations& value=&classpath*:com/xy/dao/*.xml& /&
&bean id=&devsqlSessionFactory& class=&org.mybatis.spring.SqlSessionFactoryBean&&
&property name=&dataSource& ref=&devdataSource& /&
&property name=&mapperLocations& value=&classpath*:com/xy/daodev/*.xml& /&
&bean id=&atomikosTransactionManager& class=&com.atomikos.icatch.jta.UserTransactionManager&
init-method=&init& destroy-method=&close&&
&property name=&forceShutdown&&
&value&true&/value&
&/property&
&bean id=&atomikosUserTransaction& class=&com.atomikos.icatch.jta.UserTransactionImp&&
&property name=&transactionTimeout& value=&300& /&
&bean id=&transactionManager&
class=&org.springframework.transaction.jta.JtaTransactionManager&&
&property name=&transactionManager&&
&ref bean=&atomikosTransactionManager&/&
&/property&
&property name=&userTransaction&&
&ref bean=&atomikosUserTransaction&/&
&/property&
&!-- 必须设置,否则程序出现异常 JtaTransactionManager does not support custom isolation levels by default --&
&property name=&allowCustomIsolationLevels& value=&true&/&
&bean class=&org.mybatis.spring.mapper.MapperScannerConfigurer&&
&property name=&basePackage& value=&com.xy.dao&/&
&property name=&sqlSessionFactoryBeanName& value=&qasqlSessionFactory& /&
&bean class=&org.mybatis.spring.mapper.MapperScannerConfigurer&&
&property name=&basePackage& value=&com.xy.daodev&/&
&property name=&sqlSessionFactoryBeanName& value=&devsqlSessionFactory& /&
&?xml version=&1.0& encoding=&UTF-8&?&
&web-app xmlns=&/xml/ns/javaee& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xsi:schemaLocation=&/xml/ns/javaee /xml/ns/javaee/web-app_2_5.xsd&
version=&2.5&&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
&listener&
&listener-class&
org.springframework.web.context.request.RequestContextListener
&/listener-class&
&/listener&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:context/mysql-beans.xml&/param-value&
&/context-param&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:context/oracle-beans.xml&/param-value&
&/context-param&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:context/sqlserver-beans.xml&/param-value&
&/context-param&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:context/sqlserver-oracle-beans.xml&/param-value&
&/context-param&
&span style=&color:#ff6666;&&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:context/mysql-oracle-beans.xml&/param-value&
&/context-param&&/span&
&servlet-name&test&/servlet-name&
&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&
&init-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:context/test-web.xml&/param-value&
&/init-param&
&load-on-startup&100&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&test&/servlet-name&
&url-pattern&/&/url-pattern&
&/servlet-mapping&
&welcome-file-list&
&welcome-file&index&/welcome-file&
&/welcome-file-list&
&/web-app&
基本上看这个三个配置文件就可以了,不明白的话,可以下载完整工程,dbsql有完整的建表语句
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:27046次
排名:千里之外
原创:25篇
转载:15篇
(1)(1)(1)(4)(32)(1)}

我要回帖

更多关于 spring跨数据源事务 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信