spring+mybatis+atomikos 实现JTA事务
sping配置多个数据源 不同用户操作不同数据库 http://www.oschina.net/code/snippet_2287006_56769
1:spring3.0之后不再支持jtom[jta]了,第三方开源软件atomikos(http://www.atomikos.com/)来实现.
2:org.springframework.transaction.jta.JotmFactoryBean类,spring-tx-2.5.6.jar中有此类,spring-tx-3.0.0.RELEASE.jar之后没有此类。
3:atomikos事务控制框架,其中看到有3种数据源,分别是,SimpleDataSourceBean,AtomikosDataSourceBean,AtomikosNonXADataSourceBean。
a:SimpleDataSourceBean: 这个是最简单地数据源配置,需要配置XA驱动。
b:AtomikosDataSourceBean: 分布式数据源,Atomikos实现的数据源,需要配置XA驱动,推荐此配置,可以配置连接池的信息。
c:AtomikosNonXADataSourceBean: 非分布式数据源,该数据源配置需要普通JDBC的驱动,可以配置连接池:
4:Atomikos支持XA(全局事务)和NON-XA(非全局事务),NON-XA[nonxadatasource]效率高于XA.XA事务往往是包括多个数据源的全局事务,非XA是单个数据源的.
5:XA连接是一个JTA事务中的参与者。XA连接不支持JDBC的自动提交特性。也就是说应用程序不必在xadatasource[XA]连接上调用
关于配置: http://www.tianshouzhi.com/api/tutorials/distributed_transaction/386 当我们想对默认的配置进行修改时,可以在classpath下新建一个jta.properties,覆盖同名的配置项即可。关于不同版本配置的差异,请参考官方文档:https://www.atomikos.com/Documentation/JtaProperties
第三种方式: 非第三方驱动的方式:
https://blog.csdn.net/MassiveStars/article/details/54025236
jta.properties
1 2 3 4 5 6 7 8 |
Java代码 com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory com.atomikos.icatch.console_file_name = /home/pandy/astomikos/tx.out.log com.atomikos.icatch.log_base_name = txlog com.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tm com.atomikos.icatch.console_log_level=DEBUG com.atomikos.icatch.max_timeout=30000 com.atomikos.icatch.default_jta_timeout=30000 |
第一方式: 原生的Atomikos
spring+mybatis+Atomikos JTA事务配置说明 http://lizhao6210-126-com.iteye.com/blog/1958831
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
Xml代码 <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions</artifactId> <!--<version>4.0.2</version>--> <version>3.9.3</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-api</artifactId> <!--<version>4.0.2</version>--> <version>3.9.3</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>atomikos-util</artifactId> <!--<version>4.0.2</version>--> <version>3.9.3</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jdbc-deprecated</artifactId> <version>3.8.0</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jta</artifactId> <!--<version>4.0.2</version>--> <version>3.9.3</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jdbc</artifactId> <!--<version>4.0.2</version>--> <version>3.9.3</version> </dependency> |
db.properties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Java代码 #单数据库方式, 第一个数据库 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://192.168.0.198:3306/pandy_psi?useUnicode=true&characterEncoding=utf8 jdbc.username=pandy jdbc.password=111111 #多数据库方式 jdbc.xaDataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource #第二个数据库 jdbc.url1=jdbc:mysql://192.168.0.198:3306/zhenh5?useUnicode=true&characterEncoding=utf8 transactionManager.forceShutdown =true transactionManager.transactionTimeout=3000 #*********************atomikos连接池参数设置***************************** #连接池中保留的最小连接数 atomikos.minPoolSize=5 #连接池中保留的最大连接数 atomikos.maxPoolSize=50 #最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 atomikos.maxIdleTime=60 |
applicationContext-mybatis-atomikos.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
Xml代码 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 第一个数据库 --> <bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="dataSource" /> <property name="xaDataSourceClassName" value="${jdbc.xaDataSourceClassName}" /> <property name="xaProperties"> <props> <prop key="user">${jdbc.username}</prop> <prop key="password">${jdbc.password}</prop> <prop key="url">${jdbc.url}</prop> </props> </property> <property name="minPoolSize" value="${atomikos.minPoolSize}" /> <property name="maxPoolSize" value="${atomikos.maxPoolSize}" /> <property name="maxIdleTime" value="${atomikos.maxIdleTime}" /> </bean> <!-- 第二个数据库 --> <bean id="dataSourceB" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="dataSourceB" /> <property name="xaDataSourceClassName" value="${jdbc.xaDataSourceClassName}" /> <property name="xaProperties"> <props> <prop key="user">${jdbc.username}</prop> <prop key="password">${jdbc.password}</prop> <prop key="url">${jdbc.url1}</prop> </props> </property> <property name="minPoolSize" value="${atomikos.minPoolSize}" /> <property name="maxPoolSize" value="${atomikos.maxPoolSize}" /> <property name="maxIdleTime" value="${atomikos.maxIdleTime}" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.pandy.framework.base.comm.bean,com.pandy.framework.base.atomikos.bean,com.pandy.app.bean,com.pandy.web.bean,com.pandy.weixin.bean,com.pandy.psi.bean" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.pandy.framework.base.atomikos.bean1" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryB"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" name="sqlSessionFactory"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath*:com/**/bean/**/*Mapper.xml"/> <property name="typeAliasesPackage" value="com.pandy.framework.base.comm.bean,com.pandy.framework.base.atomikos.bean,com.pandy.app.bean,com.pandy.web.bean,com.pandy.weixin.bean,com.pandy.psi.bean"></property> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageHelper"> <property name="properties"> <value> dialect=mysql </value> </property> </bean> </array> </property> </bean> <bean id="sqlSessionFactoryB" class="org.mybatis.spring.SqlSessionFactoryBean" name="sqlSessionFactoryB"> <property name="dataSource" ref="dataSourceB"/> <property name="mapperLocations" value="classpath*:com/**/bean1/**/*Mapper.xml"/> <property name="typeAliasesPackage" value="com.pandy.framework.base.atomikos.bean1"></property> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageHelper"> <property name="properties"> <value> dialect=mysql </value> </property> </bean> </array> </property> </bean> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> <bean id="sqlSessionTemplateB" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryB" /> </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> <property name="allowCustomIsolationLevels" value="true"/> </bean> <tx:annotation-driven transaction-manager="springTransactionManager" proxy-target-class="true"/> </beans> |
第二种方式:Atomikos + Druid
参考: https://my.oschina.net/u/576223/blog/708642 比较详细
atomikos支持一个分布式事务,结合spring,可以很好的满足一个应用访问多个库的需要。
Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatishttp://www.codexiu.cn/mysql/blog/10637/, 这里有bean继承方式配置, 配置有所修改: 执行成功之后, 记录数多的时候很慢,超过10w条记录,可能会出现连接关闭异常
maven
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 |
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.pandy.demo</groupId> <artifactId>atomikos</artifactId> <version>1.0-SNAPSHOT</version> <name>spring atomikos</name> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.3.13.RELEASE</spring.version> <mybatis.version>3.2.4</mybatis.version> </properties> <dependencies> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions</artifactId> <version>4.0.2</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-api</artifactId> <version>4.0.6</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>atomikos-util</artifactId> <version>4.0.6</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jdbc</artifactId> <version>4.0.6</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jdbc-deprecated</artifactId> <version>3.8.0</version> </dependency> <!--<dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jta</artifactId> <version>4.0.2</version> </dependency>--> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!-- 提供给controller的转换 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.6.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.6.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.6.3</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.19</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency> </dependencies> <build> <finalName>atomikos</finalName> <defaultGoal>package</defaultGoal> <filters> <!--<filter>${basedir}/src/main/jdbc.properties</filter> --> </filters> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 加入依赖处理的插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.8</version> <executions> <execution> <id>copy</id> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>$/lib</outputDirectory> <!-- 拷贝所以依赖存放位置 --> </configuration> </execution> </executions> </plugin> <!-- 加入编译的插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> <debug>true</debug> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>false</showWarnings> <encoding>UTF-8</encoding> <showDeprecation>false</showDeprecation> <!-- <compilerArguments> <verbose/> <bootclasspath>/usr/java/jdk1.7.0_72/jre/lib/rt.jar;/usr/java/jdk1.7.0_72/jre/lib/jce.jar</bootclasspath> </compilerArguments> --> </configuration> </plugin> <!-- 加入tomcat服务器的插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <url>http://localhost:8082/manager/text</url> <username>admin</username> <password>admin</password> <!--<path>/${project.n}</path>--> <path>/</path> <systemProperties> <appserver.base>${TomcatHome}</appserver.base> <appserver.home>${TomcatHome}</appserver.home> <derby.system.home>${TomcatHome}/logs</derby.system.home> <java.io.tmpdir>${TomcatHome}/temp</java.io.tmpdir> </systemProperties> </configuration> </plugin> <!-- 加入清理工程的插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-clean-plugin</artifactId> <configuration> <filesets> <fileset> <directory>${user.home}/${project.build.finalName}/index</directory> </fileset> </filesets> </configuration> </plugin> <!-- 加入war打包插件,配置说明: https://my.oschina.net/huanger/blog/631912 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <!--<resourceEncoding>UTF-8</resourceEncoding>--> <!-- target/classes/下的内容是否打成jar包放在WEB-INF\lib下 --> <archiveClasses>false</archiveClasses> <attachClasses>false</attachClasses> <escapeString>\</escapeString> <!--<warName>pandy_psi-${version}</warName>--> <warName>pandy_psi</warName> <warSourceExcludes>src/main/resources/**</warSourceExcludes> <webResources> <resource> <directory>src/main/resources</directory> <targetPath>WEB-INF/classes</targetPath> <filtering>true</filtering> </resource> </webResources> <warSourceDirectory>src/main/webapp</warSourceDirectory> <webXml>src/main/webapp/WEB-INF/web.xml</webXml> <!-- <archive> <manifestEntries> <SVN-Revision>${svn_info.revision}</SVN-Revision> <SVN-path>${svn_info.path}</SVN-path> <SVN-mixedRevisions>${svn_info.mixedRevisions}</SVN-mixedRevisions> </manifestEntries> </archive> --> </configuration> </plugin> <!-- 注解支持,jdk5才具有的新特性,我们需要设置compile插件,具体可以参考Setting the -source and -target of the Java Compiler,根据说明,我们继续向pom文件中加入 --> <!--<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>7</source> <target>7</target> </configuration> </plugin>--> <!-- 我们想将所有的依赖库都打包,直接交给用户, 这样用户不需要在做其他设置了,这里需要使用Assembly插件了, 其说明参考Pre-defined Descriptor Files,这个参考文件也说明了有四种默认定义的打包方式, 我们选择jar-with-dependencies,继续添加pom文件 --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>$/lib</outputDirectory> <!-- 拷贝所以依赖存放位置 --> </configuration> </execution> </executions> </plugin> <!-- 继续加入有必要的插件 --> </plugins> <!-- 处理resource等文件 --> <resources> <resource> <directory>src/main/resources</directory> <targetPath>${basedir}/target/classes</targetPath> <excludes> <exclude>**/*.bak</exclude> </excludes> <!-- filtering为true的时候,这时只会把过滤的文件(<excludes>)打到classpath下, filtering为false的时候,会把不需要过滤的文件(<includes>)打到classpath下 --> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources/${profiles.active}</directory> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>true</filtering> </resource> </resources> <pluginManagement> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.9.1</version> <executions> <execution> <id>timestamp-property</id> <goals> <goal>timestamp-property</goal> </goals> </execution> </executions> <configuration> <name>current.time</name> <pattern>yyyyMMddHHmmss</pattern> <timeZone>GMT+8</timeZone> </configuration> </plugin> </plugins> </pluginManagement> </build> </project> |
jdbc.properties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
jdbc.xaDataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource transactionManager.forceShutdown =true transactionManager.transactionTimeout=3000 #*********************atomikos连接池参数设置***************************** #连接池中保留的最小连接数 atomikos.minPoolSize=5 #连接池中保留的最大连接数 atomikos.maxPoolSize=50 #最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 atomikos.maxIdleTime=60 jdbc_driver0 = com.mysql.jdbc.Driver jdbc_url0 = jdbc:mysql://localhost:3306/sharding_0?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true jdbc_username0 = pandy jdbc_password0 = 123456 jdbc_driver1 = com.mysql.jdbc.Driver jdbc_url1 = jdbc:mysql://localhost:3306/sharding_1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true jdbc_username1 = pandy jdbc_password1 = 123456 validationQuery=SELECT 1 |
spring-atomikos.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
<?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:context="http://www.springframework.org/schema/context" xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring" xmlns:rdb="http://www.dangdang.com/schema/ddframe/rdb" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.dangdang.com/schema/ddframe/rdb http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd"> <context:component-scan base-package="com"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 这个配置成功提交数据 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean> <!-- 第一个数据库 --> <bean id="dataSource1" class="com.alibaba.druid.pool.xa.DruidXADataSource" lazy-init="true" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc_driver0}" /> <property name="url" value="${jdbc_url0}" /> <property name="username" value="${jdbc_username0}" /> <property name="password" value="${jdbc_password0}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="3" /> <property name="minIdle" value="3" /> <property name="maxActive" value="100" /> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用) <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> --> <!-- 配置监控统计拦截的filters --> <property name="filters" value="stat" /> </bean> <bean id="atomikosDataSource1" class="com.atomikos.jdbc.AtomikosDataSourceBean" destroy-method="close"> <property name="uniqueResourceName" value="atomikosDataSource11" /> <property name="xaDataSource" ref="dataSource1"/> </bean> <!-- 第二个数据库 --> <bean id="dataSource2" class="com.alibaba.druid.pool.xa.DruidXADataSource" lazy-init="true" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc_driver1}" /> <property name="url" value="${jdbc_url1}" /> <property name="username" value="${jdbc_username1}" /> <property name="password" value="${jdbc_password1}" /> <property name="initialSize" value="3" /> <property name="minIdle" value="3" /> <property name="maxActive" value="100" /> <property name="maxWait" value="60000" /> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="filters" value="stat" /> </bean> <bean id="atomikosDataSource2" class="com.atomikos.jdbc.AtomikosDataSourceBean" destroy-method="close"> <property name="uniqueResourceName" value="atomikosDataSource22" /> <property name="xaDataSource" ref="dataSource2"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.pandy.demo.bean.db0.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.pandy.demo.bean.db1.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryB"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" name="sqlSessionFactory"> <property name="dataSource" ref="atomikosDataSource1"/> <property name="mapperLocations" value="classpath*:com/**/bean/db0/**/*Mapper.xml"/> <property name="typeAliasesPackage" value="com.pandy.framework.base.comm.bean,com.pandy.framework.base.atomikos.bean,com.pandy.app.bean,com.pandy.web.bean,com.pandy.weixin.bean,com.pandy.psi.bean"></property> </bean> <bean id="sqlSessionFactoryB" class="org.mybatis.spring.SqlSessionFactoryBean" name="sqlSessionFactoryB"> <property name="dataSource" ref="atomikosDataSource2"/> <property name="mapperLocations" value="classpath*:com/**/bean/db1/**/*Mapper.xml"/> <property name="typeAliasesPackage" value="com.pandy.framework.base.atomikos.bean1"></property> </bean> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> <bean id="sqlSessionTemplateB" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryB" /> </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> <property name="allowCustomIsolationLevels" value="true"/> </bean> <tx:annotation-driven transaction-manager="springTransactionManager" proxy-target-class="true"/> </beans> |
邮箱是:1076850402@qq.com,谢谢了
这是以前的东西 我没有保留源码噢 不过一般都是配置上的问题 你做两个表测试一下就可以了
可以提供源码给我学习一下吗
今天又测试成功了,已经把源码发给你