系统场景是这样的,因业务需要配置多数据源进行大数据批量插入到数据库中,就是这配置多数据源的时候要考虑到事物的处理
事物的处理有很多种方式在网上查询了很多资料遇过很多的坑结合自己的使用情况整理一下,大概花了一周的时间,真的是悲催的要命,说 到这有点脑壳疼。如果想要去了解其中的原理请在网上收一下吧我就不在copy了。。。。
多数据源Mapper文件映射的配置方式如果要配置事物管理需要依赖spring的事物管理器。我先介绍Atomikos+jta的方式实现吧。
实现分布式事物数据源框架的几个类型网上查资料是三种我这里试了两种类型的:
com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean: (说这种不支持分布式事物具体还未测试验证但是单数据源我这里是可以回滚的事物配置到了dao层)-》一般的事物管理都在service层管理但是我这里试了几种方式都是在Dao层生效的。抛异常回滚。 com.atomikos.jdbc.AtomikosDataSourceBean : 这个可以支持分布式事物,就是保持数据业务的一致性完整性。 这种方式可以配合阿里的com.alibaba.druid.pool.xa.DruidXADataSource 数据源连接池使用(但是要把oracle,mysql ,sqlserver的配置引用要分开 也许是当时引用的是sqlserver的驱动包不对在进行驱动设置的时候报错了找不到dbType为sqlserver的。)要使用分布式事物首先要选对正确的jar包驱动,首先要实现XADataSource接口。下图是实现了XADataSource的包mysql的sqlserver和jtds类型的。和数据源连接池dbType代码判断。
配置项目钱需要的jar包文件:
maven配置如下:
<!--事物- 版本3.9.3 /4.2.0 / 4.2.4-> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>atomikos-util</artifactId> <version>3.9.3</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions</artifactId> <version>3.9.3</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jta</artifactId> <version>3.9.3</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jdbc</artifactId> <version>3.9.3</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-api</artifactId> <version>3.9.3</version> </dependency> <dependency> <groupId>net.sourceforge.jtds</groupId> <artifactId>jtds</artifactId> <version>1.3.1</version> </dependency> <!-- Cglib 依赖包 声明式事务需要 --> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>3.2.2</version> </dependency>
<!-- Spring 核心框架 --> <!--==================================== --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.2.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.8.1.RELEASE</version> </dependency> <!-- 阿里的数据源管理框架,这包里面支持分布式事物的xaDataSource里没有SqlServer类型的支持oracle和mysql的 核心框架 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency>
<!-- 数据库连接、连接池依赖包 --> <!--==================================== --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.23</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> <scope>compile</scope> <version>7.0.57}</version> </dependency>
###################################################################################
首先是com.atomikos.jdbc.AtomikosDataSourceBean 完整版可以完全使用的方式:下面上配置文件:
<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" >
<bean id="mDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" >
<property name="uniqueResourceName" value="mDataDB" />
<property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
<property name="poolSize" value="10" />
<property name="minPoolSize" value="10"/>
<property name="maxPoolSize" value="30"/>
<property name="borrowConnectionTimeout" value="60"/>
<property name="reapTimeout" value="20000"/>
<property name="maxIdleTime" value="60"/>
<property name="maintenanceInterval" value="60"/>
<property name="loginTimeout" value="60"/>
<property name="testQuery" value="${validationQuery}"/>
<property name="xaProperties">
<props>
<prop key="url">${jdbc.jdbcUrl}</prop>
<prop key="password">${jdbc.password}</prop>
<prop key="user">${jdbc.username}</prop>
</props>
</property>
</bean>
<bean id="hDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean">
<property name="uniqueResourceName" value="hDataDB" />
<property name="xaDataSourceClassName" value="net.sourceforge.jtds.jdbcx.JtdsDataSource"/>
<property name="poolSize" value="10" />
<property name="minPoolSize" value="10"/>
<property name="maxPoolSize" value="30"/>
<property name="borrowConnectionTimeout" value="30"/>
<property name="reapTimeout" value="600000"/>
<property name="maxIdleTime" value="60"/>
<property name="maintenanceInterval" value="60"/>
<property name="loginTimeout" value="60"/>
<property name="testQuery" value="${validationQuery}"/>
<property name="xaProperties">
<props>
<prop key="user">${h.jdts.user}</prop>
<prop key="password">${h.jdts.password}</prop>
<prop key="serverName">${h.jdts.serverName}</prop>
<prop key="portNumber">${h.jdts.portNumber}</prop>
<prop key="databaseName">${h.jdts.databaseName}</prop>
</props>
</property>
</bean>
<bean id="xDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean">
<property name="uniqueResourceName" value="xDataDB" />
<property name="xaDataSourceClassName" value="net.sourceforge.jtds.jdbcx.JtdsDataSource"/>
<property name="poolSize" value="10" />
<property name="minPoolSize" value="10"/>
<property name="maxPoolSize" value="30"/>
<property name="borrowConnectionTimeout" value="60"/>
<property name="reapTimeout" value="600000"/>
<property name="maxIdleTime" value="60"/>
<property name="maintenanceInterval" value="60"/>
<property name="loginTimeout" value="60"/>
<property name="testQuery" value="${validationQuery}"/>
<property name="xaProperties">
<props>
<prop key="user">${x.jdts.user}</prop>
<prop key="password">${x.jdts.password}</prop>
<prop key="serverName">${x.jdts.serverName}</prop>
<prop key="portNumber">${x.jdts.portNumber}</prop>
<prop key="databaseName">${x.jdts.databaseName}</prop>
</props>
</property>
</bean>
<bean id="dDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean">
<property name="uniqueResourceName" value="dDataDB" />
<property name="xaDataSourceClassName" value="net.sourceforge.jtds.jdbcx.JtdsDataSource"/>
<property name="poolSize" value="10" />
<property name="minPoolSize" value="10"/>
<property name="maxPoolSize" value="30"/>
<property name="borrowConnectionTimeout" value="60"/>
<property name="reapTimeout" value="600000"/>
<property name="maxIdleTime" value="60"/>
<property name="maintenanceInterval" value="60"/>
<property name="loginTimeout" value="60"/>
<property name="testQuery" value="${validationQuery}"/>
<property name="xaProperties">
<props>
<prop key="user">${d.jdts.user}</prop>
<prop key="password">${d.jdts.password}</prop>
<prop key="serverName">${d.jdts.serverName}</prop>
<prop key="portNumber">${d.jdts.portNumber}</prop>
<prop key="databaseName">${d.jdts.databaseName}</prop>
</props>
</property>
</bean>
<!-- msql集成主数据源 -->
<bean id="mqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="mDataSource" />
<property name="configLocation" value="classpath:sqlmap-config.xml" />
<property name="mapperLocations">
<list>
<value>classpath*:mybatis/mysql/*.xml</value>
</list>
</property>
</bean>
<bean id="hSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:sqlmap-config.xml" />
<property name="dataSource" ref="hDataSource" />
<property name="mapperLocations">
<list>
<value>classpath*:mybatis/sqlserver/*.xml</value>
</list>
</property>
</bean>
<bean id="xSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:sqlmap-config.xml" />
<property name="dataSource" ref="xDataSource" />
<property name="mapperLocations">
<list>
<value>classpath*:mybatis/xsqlserver/*.xml</value>
</list>
</property>
</bean>
<bean id="dSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:sqlmap-config.xml" />
<property name="dataSource" ref="dDataSource" />
<property name="mapperLocations">
<list>
<value>classpath*:mybatis/dsqlserver/*.xml</value>
</list>
</property>
</bean>
<!-- =========================================== -->
<!-- 通过@Mapper注解的形式使用Mapper Interface -->
<!-- =========================================== -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="mastersqlSessionFactory"/>
<property name="basePackage" value="com.wm.analysis.dao.mapper.analysis"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="huabeiSqlSessionFactory"/>
<property name="basePackage" value="com.wm.analysis.dao.mapper.huabei"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="xibeiSqlSessionFactory"/>
<property name="basePackage" value="com.wm.analysis.dao.mapper.xibei"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="dmallSqlSessionFactory"/>
<property name="basePackage" value="com.wm.analysis.dao.mapper.dmall"/>
</bean>
<!-- atomikos事务管理器 -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
<property name="forceShutdown">
<value>true</value>
</property>
</bean>
<!-- atomikos的事物管理,在网上查询的设置事物超时时间>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="3000000" />
</bean>
<bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
<!-- 必须设置,否则程序出现异常 JtaTransactionManager does not support custom isolation levels by default -->
<property name="allowCustomIsolationLevels" value="true"/>
<property name="globalRollbackOnParticipationFailure" value="true" />
</bean>
<!-- spring 事务管理器 -->
<!--
<aop:config proxy-target-class="true">
<aop:pointcut id="managerService" expression="execution (* com.wm.service..*Service.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="managerService"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="springTransactionManager">
<tx:attributes>
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
<tx:method name="select*" propagation="REQUIRED" read-only="true" />
<tx:method name="find*" propagation="REQUIRED" read-only="true" />
<tx:method name="query*" propagation="REQUIRED" read-only="true" />
<tx:method name="do*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
</tx:attributes>
</tx:advice>
-->
<!-- spring 使用注解的方式进行事物管理这两种最好选择一种使用因为如果在不需要加事物的地方加了事物也会出现事物超时的现象。选择其中一种注掉,在方法上加注解使用 @transaction -->
<tx:annotation-driven transaction-manager="springTransactionManager" />
</beans>
引用的变量 validationQuery=SELECT 1 配置在jdbc.properties 名字可以随便起在项目启动的时候需要把配置文件加载进来。参数解释:
<property name="uniqueResourceName" value="dDataDB" /> ——》唯一的资源名称,自己起
<property name="xaDataSourceClassName" value="net.sourceforge.jtds.jdbcx.JtdsDataSource"/> -》数据源类型驱动包,不同的数据源类型加载不同的数据源包》
<property name="poolSize" value="10" /> -》线程池数量
<property name="minPoolSize" value="10"/>最小线程池数量,如果用哦jta.jdbc.properties的时候这个并未生效,而是加载的配置文件总的线程池。
<property name="maxPoolSize" value="30"/>最大线程池数量
<property name="borrowConnectionTimeout" value="60"/> <!--获取连接失败重新获等待最大时间,在这个时间内如果有可用连接,将返回-->
<property name="reapTimeout" value="600000"/><!--最大获取数据时间,Atomikos使用默认的5分钟,那么在处理大批量 数据读取的时候,如果超过5分钟,就会抛出类似 Resultset is close 的错误.或者parapedStatememnt is close 就是数据库连接参数关闭。但是项目不会错还在存货只是执行操作的时候会报错-->
<property name="maxIdleTime" value="60"/><!--最大闲置时间,超过最小连接池连接的将关闭>,
<property name="maintenanceInterval" value="60"/> <!--连接回收时间-atomikos会自动检测连接池是否有使用如果没有使用就自动回收,如果有心的连接进来会自动创建连接-->->
<property name="loginTimeout" value="60"/> 登陆超时时间。如果超过这个时间还未连接上就会报超时错误。
<property name="testQuery" value="${validationQuery}"/> 测试数据连接。
testquery参数的详解可参考 :https://blog.csdn.net/fbysss/article/details/5393626
这个些数据库连接参数要配置在配置文件jdbc.properties 中举一个例子:
x.jdts.serverName=127.0.0.1
x.jdts.portNumber=1433
x.jdts.databaseName=数据库实例名称。
x.jdts.user=root
x.jdts.password=1234
注意:容易犯错误的地方。。。。。。。。一定要注意哦。
sqlserver的配置和mysql的配置不一样因为他们的驱动包里的属性是不一样的如果配置错误会报类似错误:”
set property password Error(key的名字也就是没有这个属性所以要注意的要点就是根据驱动包属性配置key)
<property name="xaProperties">
<props>
<prop key="user">${x.jdts.user}</prop>
<prop key="password">${x.jdts.password}</prop>
<prop key="serverName">${x.jdts.serverName}</prop>
<prop key="portNumber">${x.jdts.portNumber}</prop>
<prop key="databaseName">${x.jdts.databaseName}</prop>
</props>
</property>
Mysql配置,注意啊这参数和sqlserver不一样。
<property name="xaProperties">
<props>
<prop key="url">${jdbc.jdbcUrl}</prop>
<prop key="password">${jdbc.password}</prop>
<prop key="user">${jdbc.username}</prop>
</props>
</property>
配置完成项目了我们要设置 transactions.properties 或者是jta.properties (两个文件名取一个,因为在加载的时候首先默认去加载transactions,如果不存在去加载jta,否则就是默认的配置文件在这个文件中你可以设置日志输出的路径,事物管理最大超时时间等)这个文件要放在classpath下面也就是你的resource的资源路径的跟路径下,一定要放对地方哦,放不对不加载,还是jta默认的。
transactions.properties 贴上我的配置。
#自定义设置jta属性
com.atomikos.icatch.automatic_resource_registration=true
com.atomikos.icatch.client_demarcation=false
com.atomikos.icatch.threaded_2pc=false
com.atomikos.icatch.serial_jta_transactions=true
com.atomikos.icatch.serializable_logging=true
com.atomikos.icatch.log_base_dir=\\data\\logs\\atomikos\\
com.atomikos.icatch.max_actives=50
com.atomikos.icatch.checkpoint_interval=500
com.atomikos.icatch.enable_logging=true
com.atomikos.icatch.output_dir=\\data\\logs\\atomikos\\
com.atomikos.icatch.log_base_name=tm
com.atomikos.icatch.console_file_name = tm.out
com.atomikos.icatch.max_timeout=3000000
#com.atomikos.icatch.tm_unique_name=tm
java.naming.factory.initial=com.sun.jndi.rmi.registry.RegistryContextFactory
java.naming.provider.url=rmi://localhost:1099
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.force_shutdown_on_vm_exit=false
com.atomikos.icatch.default_jta_timeout=100000
com.atomikos.icatch.console_log_level = ERROR
com.atomikos.icatch.tm_unique_name = tm
#com.atomikos.icatch.serializable_logging=false
#com.atomikos.icatch.enable_logging=false
# SAMPLE PROPERTIES FILE FOR THE TRANSACTION SERVICE
# THIS FILE ILLUSTRATES THE DIFFERENT SETTINGS FOR THE TRANSACTION MANAGER
# UNCOMMENT THE ASSIGNMENTS TO OVERRIDE DEFAULT VALUES;
# Required: factory implementation class of the transaction core.
# NOTE: there is no default for this, so it MUST be specified!
#官网jta默认属性配置.
#
#com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
# Set base name of file where messages are output
# (also known as the 'console file').
#
# com.atomikos.icatch.console_file_name = tm.out
# Size limit (in bytes) for the console file;
# negative means unlimited.
#
# com.atomikos.icatch.console_file_limit=-1
# For size-limited console files, this option
# specifies a number of rotating files to
# maintain.
#
# com.atomikos.icatch.console_file_count=1
# Set the number of log writes between checkpoints
#
# com.atomikos.icatch.checkpoint_interval=500
# Set output directory where console file and other files are to be put
# make sure this directory exists!
#
# com.atomikos.icatch.output_dir = ./
# Set directory of log files; make sure this directory exists!
#
# com.atomikos.icatch.log_base_dir = ./
# Set base name of log file
# this name will be used as the first part of
# the system-generated log file name
#
# com.atomikos.icatch.log_base_name = tmlog
# Set the max number of active local transactions
# or -1 for unlimited.
#
# com.atomikos.icatch.max_actives = 50
# Set the default timeout (in milliseconds) for local transactions
#
# com.atomikos.icatch.default_jta_timeout = 10000
# Set the max timeout (in milliseconds) for local transactions
#
# com.atomikos.icatch.max_timeout = 300000
# The globally unique name of this transaction manager process
# override this value with a globally unique name
#
# com.atomikos.icatch.tm_unique_name = tm
# Do we want to use parallel subtransactions? JTA's default
# is NO for J2EE compatibility
#
# com.atomikos.icatch.serial_jta_transactions=true
# If you want to do explicit resource registration then
# you need to set this value to false.
#
# com.atomikos.icatch.automatic_resource_registration=true
# Set this to WARN, INFO or DEBUG to control the granularity
# of output to the console file.
#
# com.atomikos.icatch.console_log_level=WARN
# Do you want transaction logging to be enabled or not?
# If set to false, then no logging overhead will be done
# at the risk of losing data after restart or crash.
#
# com.atomikos.icatch.enable_logging=true
# Should two-phase commit be done in (multi-)threaded mode or not?
# Set this to false if you want commits to be ordered according
# to the order in which resources are added to the transaction.
#
# NOTE: threads are reused on JDK 1.5 or higher.
# For JDK 1.4, thread reuse is enabled as soon as the
# concurrent backport is in the classpath - see
# http://mirrors.ibiblio.org/pub/mirrors/maven2/backport-util-concurrent/backport-util-concurrent/
#
# com.atomikos.icatch.threaded_2pc=false
# Should shutdown of the VM trigger shutdown of the transaction core too?
#
# com.atomikos.icatch.force_shutdown_on_vm_exit=false
配置完属性是不是想知道日志是怎么输出的呢,我的项目用的是logback的如果你用的是其他方式的也是大同小异,需要和com.atomikos 进行关联设置。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="baseName" value="ttttt"/>
<property name="logPath" value="/data/logs/"/>
<!-- 所有日志 -->
<!-- ======================================= -->
<appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${logPath}/${baseName}_all.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logPath}/archive/${baseName}_all-%d{yyyy-MM-dd}.log.zip</fileNamePattern>
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>[%-5p] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%C] - %m%n</pattern>
</encoder>
</appender>
<appender name="ALL_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<queueSize>1048576</queueSize>
<discardingThreshold>0</discardingThreshold>
<includeCallerData>true</includeCallerData>
<appender-ref ref="ALL"/>
</appender>
<!-- ======================================= -->
<appender name="INTERACTION" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${logPath}/archive/${baseName}_interaction.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logPath}/archive/${baseName}_interaction-%d{yyyy-MM-dd}-%i.log.zip</fileNamePattern>
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>[%-5p] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%C] - %m%n</pattern>
</encoder>
</appender>
<appender name="INTERACTION_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>1048576</queueSize>
<discardingThreshold>0</discardingThreshold>
<includeCallerData>true</includeCallerData>
<appender-ref ref="INTERACTION"/>
</appender>
<logger name="com.atomikos">
<level value="info"/>
</logger>
<logger name="com.atomikos.datasource.pool.ConnectionPool">
<level value="info"/>
</logger>
<logger name="com.atomikos.jdbc.AtomikosConnectionProxy">
<level value="info"/>
</logger>
<root level="Info">
<appender-ref ref="INTERACTION_ASYNC"/>
<appender-ref ref="ALL_ASYNC"/>
</root>
</configuration>
以上是使用过程中没有问题AtomikosDataSourceBean ,其实在配置过程中难免会有错误导致运行不起来,实在找不出错误来抓紧时间去休息一下睡个觉洗个澡去锻炼锻炼,第二天来到马上就搞定了,我弄了好久弄的脑袋晕,一看全是泪啊,感觉血压突然就上来了。加油共勉大家一起努力,实在不行老子不弄了咋地!还有两种方式没有写完,后续在写,老子脑袋疼了不弄了我去撸铁去了。