spring+hibernate+tomcat+JTA跨数据库事务
来源:互联网 发布:gta5捏脸数据奥巴马 编辑:程序博客网 时间:2024/05/22 02:13
随着公司网站的发展,网站上的产品越来越多,单个mysql库表太多不好维护,我着手开始分库表,由于服务器是tomcat的本身不支持JTA,我就打算用spring+Jotm的方式来实现跨数据库的事务管理,spring的配置文件如下:
datasoruce.xml:
//jotm事务管理
<bean id="jotmJta" class="org.springframework.transaction.jta.JotmFactoryBean" />
<bean id="jtaTxManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="jotmJta"/>
</bean>
///第一个datasource
<bean id="familyDataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource">
<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"/>
</bean>
</property>
<property name="user" value="xband"/>
<property name="password" value="Lix8cjDb7$"/>
</bean>
///第二个datasource
<bean id="localDataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource">
<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"/>
</bean>
</property>
<property name="user" value="root"/>
<property name="password" value="1234"/>
</bean>
<tx:annotation-driven transaction-manager="jtaTxManager"/>
///第一个hibernate配置
<bean id="familySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="familyDataSource"/>
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
///第二个hibernate配置
<bean id="localSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="localDataSource"/>
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
///service用@Transactional标识
<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"/>
</bean>
这种方法如果用jdbc同事向两个库插入数据,rollback成功,但用hibernate插入数据,就连单个库都不会rollback,我看了一下spring的源代码LocalSessionFactoryBean里有个jtaTransactionManager,修改两个SessionFactory如下:
<bean id="familySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="familyDataSource"/>
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
<property name="jtaTransactionManager">
<ref bean="jotmJta" />
</property>
</bean>
<bean id="localSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="localDataSource"/>
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
<property name="jtaTransactionManager">
<ref bean="jotmJta" />
</property>
</bean>
@Transaction注解对业务类jtaService进行事务声明,通过<tx:annotation-driven/>
mysql需要设置成innodb才能回滚事务
把connectionPoolSize的连接池大小设成0,应该有问题的,如果你用mysql的话用showprocesslist命令看一下数据库的链接数,只有一个链接,而且这个链接总是sleep,我猜如果设为0的话链接池更本没有用,每次都是新建一个链接.如果你把connectionPoolSize设为1,mysql显示会有两个链接,总会多一个链接出来,而且这个多出来的链接一直都是sleep.不知道这个多出来的链接是干什么的.
再补充一点atomikos的链接池和dbcp不一样,dbcp有一个initialSize和maxActive可以设,如果initialSize初为1那么启项目时只有一个链接,最大链接为maxActive,atomikos的话只有connectionPoolSize属性,我观察过这个属性是初始化链接数也是最大链接数!这点非常不好!
我想问一下"collin000 "SimpleDataSourceBean(听名字就让人觉的不爽!)用的链接池性能上怎样?如果要用更好的链接池atomikos好像是要收费的,不知道能不能用xapool?因为我们是做网站的所以性能对我们来说非常重要
- spring+hibernate+tomcat+JTA跨数据库事务
- spring+hibernate+JTA 分布式事务的例子
- spring+hibernate+jta 分布式事务Demo
- Spring + hibernate + struts2 +jotm JTA事务
- spring+hibernate+jta分布式事务Demo
- spring+hibernate+jta 分布式事务Demo
- spring+hibernate+jta 分布式事务Demo
- Spring引用Tomcat的 JTA事务
- Spring在tomcat下使用JTA事务
- spring hibernate 集成:spring使用容器JTA事务管理器
- Spring JTA 分布式事务
- Spring JTA 分布式事务
- spring+hibernate+jpa配置JTA事务出错,如何解决?
- 分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)
- 分布式事务入门-Spring+JTA+Atomikos+Hibernate+JMS
- 数据库事务、Hibernate事务、Spring事务
- 跨库事务处理 spring+hibernate+struts2+jta
- 跨库事务处理 spring+hibernate+struts2+jta
- Net中的设计模式——Factory Method模式
- static关键字用法学习笔记(C++)
- 1033和2052的含义
- 什么是N+1查询?
- 数据库优化
- spring+hibernate+tomcat+JTA跨数据库事务
- Hibernate与Spring多数据源的配置
- 深入浅出Win32多线程程序设计之基本概念
- spring集成hibernate声明式事物
- MOSS站点的多域名映射
- QT的Event Filter[翻译]
- 移动硬盘 相对路径 解决方案
- jboss portal (基于jsp的portlet,JSF)
- 一款有特色的虚拟化软件-云端软件平台