spring+hibernate+tomcat+JTA跨数据库事务

news/2024/7/4 1:09:31 标签: hibernate, spring, 数据库, tomcat, bean, class
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

 随着公司网站的发展,网站上的产品越来越多,单个mysql库表太多不好维护,我着手开始分库表,由于服务器是class="tags" href="/tags/TOMCAT.html" title=tomcat>tomcat的本身不支持JTA,我就打算用class="tags" href="/tags/SPRING.html" title=spring>spring+Jotm的方式来实现跨class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库的事务管理,class="tags" href="/tags/SPRING.html" title=spring>spring的配置文件如下:
datasoruce.xml:
//jotm事务管理
<class="tags" href="/tags/BEAN.html" title=bean>bean id="jotmJta" class="org.class="tags" href="/tags/SPRING.html" title=spring>springframework.transaction.jta.JotmFactoryBean" />
<class="tags" href="/tags/BEAN.html" title=bean>bean id="jtaTxManager"  class="org.class="tags" href="/tags/SPRING.html" title=spring>springframework.transaction.jta.JtaTransactionManager">  
      <property name="userTransaction" ref="jotmJta"/>
</class="tags" href="/tags/BEAN.html" title=bean>bean>
///第一个datasource
<class="tags" href="/tags/BEAN.html" title=bean>bean id="familyDataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">  
    <property name="dataSource">
       <class="tags" href="/tags/BEAN.html" title=bean>bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">  
    <property name="transactionManager" ref="jotmJta" />
    <property name="driverName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://192.168.0.12:3306/family?useUnicode=true&characterEncoding=GBK"/>
       </class="tags" href="/tags/BEAN.html" title=bean>bean>
    </property>
    <property name="user" value="xband"/>
    <property name="password" value="Lix8cjDb7$"/>
</class="tags" href="/tags/BEAN.html" title=bean>bean>
///第二个datasource
<class="tags" href="/tags/BEAN.html" title=bean>bean id="localDataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">  
    <property name="dataSource">
<class="tags" href="/tags/BEAN.html" title=bean>bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">  
<property name="transactionManager" ref="jotmJta" />
<property name="driverName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/family?useUnicode=true&characterEncoding=GBK"/>
</class="tags" href="/tags/BEAN.html" title=bean>bean>
</property>
<property name="user" value="root"/>
<property name="password" value="1234"/>
</class="tags" href="/tags/BEAN.html" title=bean>bean>
<tx:annotation-driven transaction-manager="jtaTxManager"/>
///第一个class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate配置
<class="tags" href="/tags/BEAN.html" title=bean>bean id="familySessionFactory" class="org.class="tags" href="/tags/SPRING.html" title=spring>springframework.orm.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="familyDataSource"/>
<property name="configLocation" value="classpath:class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.cfg.xml"/>
</class="tags" href="/tags/BEAN.html" title=bean>bean>
///第二个class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate配置
<class="tags" href="/tags/BEAN.html" title=bean>bean id="localSessionFactory" class="org.class="tags" href="/tags/SPRING.html" title=spring>springframework.orm.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="localDataSource"/>
<property name="configLocation" value="classpath:class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.cfg.xml"/>
</class="tags" href="/tags/BEAN.html" title=bean>bean>
///service用@Transactional标识
<class="tags" href="/tags/BEAN.html" title=bean>bean id="jtaService" class="com.xband.client.test.JtaService">
  <property name="localJtaDAO" ref="localJtaDAO"/>
  <property name="familyJtaDAO" ref="familyJtaDAO"/>
  <property name="localJdbcDao" ref="localJdbcDao"/>
  <property name="familyJdbcDao" ref="familyJdbcDao"/>
</class="tags" href="/tags/BEAN.html" title=bean>bean>

这种方法如果用jdbc同事向两个库插入数据,rollback成功,但用class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate插入数据,就连单个库都不会rollback,我看 了一下class="tags" href="/tags/SPRING.html" title=spring>spring的源代码LocalSessionFactoryBean里有个jtaTransactionManager,修改两个 SessionFactory如下:
<class="tags" href="/tags/BEAN.html" title=bean>bean id="familySessionFactory" class="org.class="tags" href="/tags/SPRING.html" title=spring>springframework.orm.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="familyDataSource"/>
<property name="configLocation" value="classpath:class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.cfg.xml"/>
<property name="jtaTransactionManager">  
<ref class="tags" href="/tags/BEAN.html" title=bean>bean="jotmJta" />  
</property> 
</class="tags" href="/tags/BEAN.html" title=bean>bean>

<class="tags" href="/tags/BEAN.html" title=bean>bean id="localSessionFactory" class="org.class="tags" href="/tags/SPRING.html" title=spring>springframework.orm.class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="localDataSource"/>
<property name="configLocation" value="classpath:class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate.cfg.xml"/>
                   <property name="jtaTransactionManager">  
<ref class="tags" href="/tags/BEAN.html" title=bean>bean="jotmJta" />  
</property> 

</class="tags" href="/tags/BEAN.html" title=bean>bean>


@Transaction注解对业务类jtaService进行事务声明,通过<tx:annotation-driven/>


mysql需要设置成innodb才能回滚事务


把connectionPoolSize的连接池大小设成0,应该有问题的,如果你用mysql的话用show processlist命令看一下class="tags" href="/tags/ShuJuKu.html" title=数据库>数据库的链接数,只有一个链接,而且这个链接总是sleep,我猜如果设为0的话链接池更本没有用,每次都是新建一个链 接.如果你把connectionPoolSize设为1,mysql显示会有两个链接,总会多一个链接出来,而且这个多出来的链接一直都是sleep. 不知道这个多出来的链接是干什么的.
    再补充一点atomikos的链接池和dbcp不一样,dbcp有一个initialSize和maxActive可以设,如果initialSize初 为1那么启项目时只有一个链接,最大链接为maxActive,atomikos的话只有connectionPoolSize属性,我观察过这个属性是 初始化链接数也是最大链接数!这点非常不好!
  我想问一下"collin000 "SimpleDataSourceBean(听名字就让人觉的不爽!)用的链接池性能上怎样?如果要用更好的链接池atomikos好像是要收费的,不知道能不能用xapool?因为我们是做网站的所以性能对我们来说非常重要


http://www.niftyadmin.cn/n/1050481.html

相关文章

BZOJ4247 挂饰(动态规划)

相当于一个有负体积的背包。显然如果确定了选哪些&#xff0c;应该先把体积小的挂上去。于是按体积从小到大排序&#xff0c;就是一个裸的背包了。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> …

《JAVA设计模式》之抽象工厂模式(Abstract Factory)

场景问题 举个生活中常见的例子——组装电脑&#xff0c;我们在组装电脑的时候&#xff0c;通常需要选择一系列的配件&#xff0c;比如CPU、硬盘、内存、主板、电源、机箱等。为讨论使用简单点&#xff0c;只考虑选择CPU和主板的问题。 事实上&#xff0c;在选择CPU的时候&…

数据分析——pandas

简介 1 import pandas as pd 2 3 # 在数据挖掘前一个数据分析、筛选、清理的多功能工具 4 5 pandas 可以读入excel、csv等文件&#xff1b;可以创建Series序列,DataFrame表格&#xff0c;日期数组data_range 6 数据类型 1 # 将excel文件&#xff0c;csv文件读取并转换为pand…

系统移植到Spring

作者将在这篇文章中分享他在这个试验中的想法和发现。作者将清晰的说明他是怎样用Spring组件替换参考应用中的单态注册&#xff0c;JDBC代码&#xff0c;和web的前后端层。作者也会描述他遇到的一个问题还有他是怎样来解决它的。 叫我来参加会议晚了&#xff0c;就是这次的Spr…

HDU 6301 (2018多校第一场D)(双指针贪心)

传送门 题面&#xff1a; Distinct Values Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 705 Accepted Submission(s): 186 Problem Description Chiaki has an array of n positive integers. You are told…

Maven Dependency设置

come from : http://www.javaeye.com/topic/240424 用了Maven&#xff0c;所需的JAR包就不能再像往常一样&#xff0c;自己找到并下载下来&#xff0c;用IDE导进去就完事了&#xff0c;Maven用了一个项目依赖 (Dependency)的概念&#xff0c;用俗话说&#xff0c;就是我的项…

C# 默认访问修饰符

c# 中类&#xff0c;成员&#xff0c;枚举&#xff0c;结构等默认访问修饰符是&#xff1f; 根据MSDN文档有&#xff1a; [MSDN] Classes and structs that are not nested within other classes or structs can be either public or internal. A type declared as public is a…

LeetCode 127 Word Ladder

[题目 LeetCode 127] (https://leetcode.com/problems/word-ladder/description/) 题解&#xff1a; BFS struct Node {string word;int dis;Node(){}Node(string word,int dis){this->word word;this->dis dis;} }; class Solution {public:int vis[100005];queue<…