一般的企业管理系统免不了要访问多个数据库,如框架数据库、仓库数据库等,但spring的jdbc事务只支持一个数据源的事务配置,为了在tomcat中支持多数据源事务,可以采用开源框架atomikos来进行配置。
采用的开发环境:Spring4 + hibernate4 + atomikos3.9.3 + mssql2008
1.下载atomikos-jdbc:3.9.1
所需要的包如下:
2.下载sqljdbc4.jar
有关mssql的XA支持,请参考下面:
https://technet.microsoft.com/zh-cn/library/aa342335.aspx
3.Spring atomikos事务配置
配置两个xa数据源xaDataSource,两个SessionFactory
<?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:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd" > <context:component-scan base-package="com.framework.dao"/> <context:component-scan base-package="com.framework.dao.mssql"/> <context:component-scan base-package="com.framework.service"/> <context:component-scan base-package="com.framework.action"/> <context:component-scan base-package="com.stk.dao.mssql"/> <context:component-scan base-package="com.stk.service"/> <context:component-scan base-package="com.stk.action"/> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:framework.properties"/> </bean> <bean class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" id="datasourceFW"> <property name="uniqueResourceName"><value>framework</value></property> <property name="xaDataSourceClassName" value="com.microsoft.sqlserver.jdbc.SQLServerXADataSource" /> <property name="xaProperties"> <props> <prop key="user">${jdbc.username}</prop> <prop key="password">${jdbc.password}</prop> <prop key="URL">${jdbc.url}</prop> </props> </property> </bean> <bean id="sessionFactoryFW" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="datasourceFW"/> <!-- --> <property name="packagesToScan" value="com.framework.domain"/> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">com.util.SQLServerDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.current_session_context_class">jta</prop> <prop key="hibernate.transaction.factory_class">org.hibernate.engine.transaction.internal.jta.JtaTransactionFactory</prop> </props> </property> </bean> <bean id="hibernateTemplateFW" class="org.springframework.orm.hibernate4.HibernateTemplate" p:sessionFactory-ref="sessionFactoryFW" /> <bean class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" id="datasourceStk"> <property name="uniqueResourceName"><value>stk</value></property> <property name="xaDataSourceClassName" value="com.microsoft.sqlserver.jdbc.SQLServerXADataSource" /> <property name="xaProperties"> <props> <prop key="user">${jdbcstk.username}</prop> <prop key="password">${jdbcstk.password}</prop> <prop key="URL">${jdbcstk.url}</prop> </props> </property> </bean> <bean id="sessionFactoryStk" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="datasourceStk"/> <!-- --> <property name="packagesToScan" value="com.stk.domain"/> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">com.util.SQLServerDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.current_session_context_class">jta</prop> <prop key="hibernate.transaction.factory_class">org.hibernate.engine.transaction.internal.jta.JtaTransactionFactory</prop> <!-- 4.0 <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> <prop key="hibernate.cache.use_second_level_cache">true</prop>--> </props> </property> </bean> <bean id="hibernateTemplateStk" class="org.springframework.orm.hibernate4.HibernateTemplate" p:sessionFactory-ref="sessionFactoryStk" /> <!-- atomikos事务管理器 --> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <description>UserTransactionManager</description> <property name="forceShutdown"> <value>true</value> </property> </bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="300" /> </bean> <!-- spring 事务管理器 --> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="atomikosTransactionManager"/> <property name="userTransaction" ref="atomikosUserTransaction" /> <property name="allowCustomIsolationLevels" value="true"/> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="select*" read-only="true" propagation="REQUIRED"/> <tx:method name="get*" read-only="true" propagation="REQUIRED"/> <tx:method name="load*" read-only="true" propagation="REQUIRED"/> <tx:method name="find*" read-only="true" propagation="REQUIRED"/> <tx:method name="query*" read-only="true" propagation="REQUIRED"/> <tx:method name="read*" read-only="true" propagation="REQUIRED"/> <tx:method name="sync*"/> <tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="pointcut" expression="execution(* com.framework.service.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/> </aop:config> </beans>
4.Spring DAO设计
采用SessionFactory注入的方式(不能采用HibernateTemplate)
BaseDao设计,session的管理,采用 ThreadLocal进行保存和获取,保证同一线程获取一次,
注意,数据操作之后要调用session.flush()进行保存。
/** * DAO基类,其它DAO可以直接继承这个DAO,不但可以复用共用的方法,还可以获得泛型的好处。 */ public abstract class BaseDao<T> { ThreadLocal<Session> localSession = new ThreadLocal<Session>(); private Class<T> entityClass; public abstract SessionFactory getSessionFactory(); /** * 通过反射获取子类确定的泛型类 */ public BaseDao() { Type genType = getClass().getGenericSuperclass(); Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); entityClass = (Class) params[0]; } /** * 根据ID加载PO实例 * * @param id * @return 返回相应的持久化PO实例 */ public T load(Serializable id) { return (T) getSession().load(entityClass, id); } /** * 根据ID获取PO实例 * * @param id * @return 返回相应的持久化PO实例 */ public T get(Serializable id) { return (T) getSession().get(entityClass, id); } /** * 保存PO * * @param entity */ public void save(T entity) { Session session = getSession(); session.save(entity); session.flush(); } public void saveOrUpdate(T entity) { Session session = getSession(); session.saveOrUpdate(entity); session.flush(); } /** * 删除PO * * @param entity */ public void remove(T entity) { Session session = getSession(); session.delete(entity); session.flush(); } /** * 更改PO * * @param entity */ public void update(T entity) { Session session = getSession(); session.update(entity); session.flush(); } public Query createSqlQuery(String sql, Object... values) { Assert.hasText(sql); Query query = getSession().createSQLQuery(sql); for (int i = 0; i < values.length; i++) { query.setParameter(i, values[i]); } return query; } public Session getSession() { //Session session =getSessionFactory().getCurrentSession(); //if (session == null) Session session = localSession.get(); if(session == null) { session = getSessionFactory().openSession(); localSession.set(session); } return session; } }
相关推荐
本主题将深入探讨如何利用SpringBoot结合Atomikos实现动态多数据源以及事务管理,并介绍两种切换数据源的方法。 首先,SpringBoot简化了传统Spring应用的初始化过程,它通过自动配置和starter包让开发者快速搭建...
综上所述,"spring+druid+AtomikosDataSource"的组合为开发者提供了一套强大的工具,用于实现多数据源切换和分布式事务控制。在实际项目中,通过合理的配置和编码,可以构建出高效、健壮的分布式系统。在`mult-table...
本教程将探讨如何利用Spring Boot、Druid、Mybatis以及Atomikos来配置多数据源并实现分布式事务。 首先,Spring Boot是Java生态系统中的一个流行框架,它简化了设置和配置过程,使得开发人员可以快速启动新项目。在...
本主题将探讨“Spring4+Hibernate4+Atomikos3.3多数据源事务管理”的相关知识点,这是一种实现分布式事务处理的有效方案。 首先,Spring框架是Java企业级应用中的核心组件,它提供了一个统一的依赖注入容器,简化了...
本教程将详细介绍如何使用Spring Boot结合JTA(Java Transaction API)和Atomikos来配置多数据源事务。 首先,我们需要理解JTA的含义。JTA是Java平台的标准,用于管理跨多个数据源的分布式事务。它允许应用程序在一...
总结来说,"spring+jpa+atomikos多数据源"组合提供了强大的多数据库支持,使得应用程序能够在多个数据库间无缝切换和处理事务,这对于大型分布式系统来说至关重要。理解并掌握这些技术,对于提升软件开发的灵活性和...
本文档所述的多数据源事务问题解决方案,借助了Spring Boot、MyBatis、JTA和Atomikos,展示了如何构建一个可以有效管理多个数据源事务的应用。通过这种方式,能够保证在复杂业务场景下数据的完整性不被破坏,为复杂...
**多数据源事务管理**: 在Spring 3.0中,可以通过定义多个DataSource bean并结合Atomikos的UserTransaction接口来处理多数据源事务。每个DataSource代表一个不同的数据库连接池,而Atomikos作为全局事务协调者,可以...
总的来说,Spring Boot与Atomikos的结合提供了强大的分布式事务解决方案,而动态数据源切换则增强了系统的灵活性,适应了复杂的企业级应用场景。开发者需要理解这些技术背后的原理,并通过实践来熟练掌握它们。
Spring、Hibernate和Atomikos的组合就是一种强大的解决方案,它们可以协同工作以支持多数据源的分布式事务处理。接下来,我们将深入探讨这些技术以及如何配置它们来实现多数据源。 1. **Spring**: Spring是一个...
总之,通过 Spring Boot、MyBatis 和 Atomikos 的结合,我们可以有效地管理分布式环境中的多数据源事务,确保系统的稳定性和数据的一致性。在实际开发中,理解并熟练掌握这些技术的整合和配置是至关重要的。
使用spring + atomikos+druid配置的分布式事务demo,两种数据源配置方式都可以,使用junit测试没问题,案例中使用的mysql数据库是8.0.11版本,版本不同请自行修改pom.xml和jdbc.properties
2. `applicationContext.xml`或对应的Java配置类:配置Spring的事务管理器和数据源,以及Atomikos相关的bean。 3. MyBatis的配置:定义SqlSessionFactory,并与Spring集成。 4. 示例代码:展示了如何在方法上使用`@...
2. 集成Atomikos:在Spring配置中引入Atomikos的事务管理器,配置全局事务超时、事务日志路径等参数,确保Atomikos可以在多数据源环境下正确处理分布式事务。 3. 配置MyBatis:将MyBatis的SqlSessionFactory与...
在Spring和Atomikos的分布式事务场景中,Druid可以作为数据源,配合Atomikos进行事务管理。通过设置Druid的数据源属性,可以使其与Atomikos集成,从而在分布式环境中实现ACID(原子性、一致性、隔离性、持久性)特性...
Atomikos 是一个开源的JTA实现,它提供了全面的事务管理解决方案,支持分布式事务处理。Atomikos 可以无缝集成到Spring Boot应用中,为微服务架构中的事务管理提供强大的支持。它包括事务协调器、事务管理器以及对...
Spring Boot:mybatis-plus + atomikos + druid 实现不同实例数据库的多数据源配置和分布式事务管理(demo项目),想到工作上可能会用到多数据源,但是自己在这方面并不是很熟悉,于是在网上查阅了很多文章,结果...
在分布式系统中,确保事务的...配置包括设置Atomikos事务管理器、数据源以及事务属性,然后在业务逻辑中利用Spring的`@Transactional`注解来管理事务边界。这使得开发者能够在复杂分布式环境中实现高一致性的业务逻辑。
为了实现多数据源的分布式事务,我们需要对Spring Boot进行配置,定义两个数据源并指定Atomikos作为事务管理器。每个数据源都需要相应的数据库连接信息,并且需要启用Atomikos的全局事务支持。在业务逻辑代码中,...
本项目使用Spring Boot、Atomikos、JTA(Java Transaction API)、Hibernate和MySQL来实现分布式事务处理和多数据源管理,以确保在多个数据库操作之间保持事务的ACID特性。 首先,Spring Boot作为微服务开发的主流...