基于 Spring + Atomikos + Mybatis的多数据源配置(含有BaseDao,BaseService)
1.spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util"
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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.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.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd
"> <!--使用@Autowired注解,需要注入下bean-->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> <context:component-scan base-package="com.tykj.weatherservice" annotation-config="false" /> <!--实际上,PropertyPlaceholderConfigurer起的作用就是将占位符指向的数据库配置信息放在bean中定义的工具。-->
<bean id="propertyConfigurer"
class="com.tykj.secondparty.context.CustomizedPropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/system.properties</value>
<value>classpath:/jdbc.properties</value>
</list>
</property>
</bean> <bean id="settings"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:/system.properties</value>
</list>
</property>
<property name="fileEncoding">
<value>UTF-8</value>
</property>
</bean> <!-- 多个数据源的功用配置,方便下面直接引用 -->
<bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" abstract="true">
<property name="poolSize" value="${mysql_poolSize}" />
<property name="minPoolSize" value="${mysql_minPoolSize}"/>
<property name="maxPoolSize" value="${mysql_maxPoolSize}"/>
<property name="borrowConnectionTimeout" value="${borrowConnectionTimeout}"/>
<property name="reapTimeout" value="${mysql_reapTimeout}"/>
<!-- 最大空闲时间 -->
<property name="maxIdleTime" value="${mysql_maxIdleTime}"/>
<property name="maintenanceInterval" value="${mysql_maintenanceInterval}" />
<property name="loginTimeout" value="${mysql_loginTimeout}"/>
<property name="logWriter" value="${mysql_logWriter}"/>
</bean> <!--测试web数据库的分布式事务atomikos 的三种数据源 SimpleDataSourceBean,AtomikosDataSourceBean,AtomikosNonXADataSourceBean-->
<!-- <bean id="dataSourceOracle" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close">
<description>oracle xa datasource</description>
<property name="uniqueResourceName" value="${oracle_resourceName}"/>
<property name="xaDataSourceClassName" value="${oracle_xaDataSourceClassName}"/>
<property name="xaProperties">
<props>
<prop key="user">${oracle_user}</prop>
<prop key="password">${oracle_password}</prop>
<prop key="URL">${oracle_url}</prop>
</props>
</property>
<property name="minPoolSize" value="${oracle_poolSize}"/>
<property name="maxPoolSize" value="${oracle_maxPoolSize}"/>
<property name="maxIdleTime" value="${oracle_maxIdleTime}"/>
<property name="borrowConnectionTimeout" value="${borrowConnectionTimeout}"/>
</bean> --> <bean id="dataSourceXph" parent="abstractXADataSource">
<description>mysql xph datasource</description>
<property name="uniqueResourceName" value="${mysql_resourceName_xph}"/>
<property name="xaDataSourceClassName" value="${mysql_xaDataSourceClassName}"/>
<property name="xaProperties">
<props>
<prop key="url">${mysql_url_xph}</prop>
<prop key="user">${mysql_user_xph}</prop>
<prop key="password">${mysql_password_xph}</prop>
</props>
</property>
</bean> <bean id="dataSourceQs" parent="abstractXADataSource">
<description>mysql qs datasource</description>
<property name="uniqueResourceName" value="${mysql_resourceName_qs}"/>
<property name="xaDataSourceClassName" value="${mysql_xaDataSourceClassName}"/>
<property name="xaProperties">
<props>
<prop key="url">${mysql_url_qs}</prop>
<prop key="user">${mysql_user_qs}</prop>
<prop key="password">${mysql_password_qs}</prop>
</props>
</property>
</bean> <!--Spring让LOB数据操作变得简单易行 LOB类型后期需要的话再加入-->
<!-- <bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/> --> <!-- 创建SqlSessionFactory,同时指定数据源-->
<!-- <bean id="sqlSessionFactoryOracle" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceOracle" />
<property name="configLocation" value="classpath:com/tykj/resources/configuration.xml"/>
<property name="mapperLocations" value="classpath*:com/tykj/tracingcloud/beans/**/*.xml"/>
</bean> --> <bean id="sqlSessionFactoryXph" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceXph" />
<property name="configLocation" value="classpath:com/tykj/resources/configuration.xml"/>
<!-- <property name="mapperLocations" value="classpath*:com/tykj/weatherservice/bean/**/*.xml"/> -->
<property name="mapperLocations">
<array>
<value>classpath*:com/tykj/weatherservice/bean/xphdata/xphRealData.xml</value>
</array>
</property>
</bean> <bean id="sqlSessionFactoryQs" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceQs" />
<property name="configLocation" value="classpath:com/tykj/resources/configuration.xml"/>
<!-- <property name="mapperLocations" value="classpath*:com/tykj/weatherservice/bean/**/*.xml"/> -->
<property name="mapperLocations">
<array>
<value>classpath*:com/tykj/weatherservice/bean/channel/channel.xml</value>
<value>classpath*:com/tykj/weatherservice/bean/deviceinfo/deviceinfo.xml</value>
<value>classpath*:com/tykj/weatherservice/bean/webthings/webthings.xml</value>
</array>
</property>
</bean> <!-- MyBatis为不同的mapper注入sqlSessionFactory -->
<bean id="xphRealDataDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactoryXph" />
<property name="mapperInterface" value="com.tykj.weatherservice.dao.xphdata.XphRealDataDao" />
</bean>
<bean id="channelDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactoryQs" />
<property name="mapperInterface" value="com.tykj.weatherservice.dao.channel.ChannelDao" />
</bean>
<bean id="deviceinfoDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactoryQs" />
<property name="mapperInterface" value="com.tykj.weatherservice.dao.deviceinfo.DeviceinfoDao" />
</bean>
<bean id="webThingsDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactoryQs" />
<property name="mapperInterface" value="com.tykj.weatherservice.dao.webthings.WebThingsDao" />
</bean> <!-- Mapper接口所在包名,Spring会自动查找其下的Mapper -->
<!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
不能跟其他bean的扫描路径重叠
<property name="basePackage" value="com.tykj.tracingcloud.beans.*" />
sqlSessionFactory自动注入
<property name="sqlSessionFactory" ref="sqlSessionFactoryOracle"/>
</bean> -->
<!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
不能跟其他bean的扫描路径重叠
<property name="basePackage" value="com.tykj.weatherservice.dao.base.implxph" />
sqlSessionFactory自动注入
<property name="sqlSessionFactoryBeanName" ref="sqlSessionFactoryXph"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
不能跟其他bean的扫描路径重叠
<property name="basePackage" value="com.tykj.weatherservice.dao.base.implqs" />
sqlSessionFactory自动注入
<property name="sqlSessionFactoryBeanName" ref="sqlSessionFactoryQs"/>
</bean> --> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<description>UserTransactionImp1</description>
<property name="transactionTimeout">
<value>300</value>
</property>
</bean> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<description>UserTransactionManager1</description>
<property name="forceShutdown">
<value>true</value>
</property>
</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> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceXph"/>
</bean> <!-- 事务的传播特性(JoinPoint) -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="modify*" propagation="REQUIRED"
rollback-for="java.lang.Exception"/>
<tx:method name="delete*" propagation="REQUIRED"
rollback-for="java.lang.Exception"/>
<tx:method name="update*" propagation="REQUIRED"
rollback-for="java.lang.Exception"/>
<tx:method name="deal*" propagation="REQUIRED"
rollback-for="java.lang.Exception"/>
<!-- SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。-->
<tx:method name="*" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice> <!-- 开启注解 -->
<context:annotation-config />
<!-- base-package指向注解要扫描的包 -->
<context:component-scan base-package="com.tykj.weatherservice" annotation-config="false"/> <!-- 配置那些类参与事务(PointCut) -->
<aop:config>
<aop:pointcut expression="execution(* com.tykj.weatherservice.service.*..impl.*(..))" id="serviceMethod"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
</beans>
2.项目结构
基于 Spring + Atomikos + Mybatis的多数据源配置(含有BaseDao,BaseService)的更多相关文章
- 基于 Spring + Atomikos + Mybatis的多数据源配置demo
1.spring配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- spring boot +mybatis+druid 多数据源配置
因为我的工程需要在两个数据库中操作数据,所以要配置两个数据库,我这里没有数据源没有什么主从之分,只是配合多数据源必须要指定一个主数据源,所以我就把 操作相对要对的那个数据库设置为主数据(dataBas ...
- spring,mybatis,多数据源配置
spring.xml配置 <!-- 对数据源进行事务管理 --> <bean id="transactionManager" class="org.sp ...
- Spring Boot 2.x基础教程:MyBatis的多数据源配置
前两天,我们已经介绍了关于JdbcTemplate的多数据源配置以及Spring Data JPA的多数据源配置,接下来具体说说使用MyBatis时候的多数据源场景该如何配置. 添加多数据源的配置 先 ...
- Spring Boot 2.x 多数据源配置之 MyBatis 篇
场景假设:现有电商业务,商品和库存分别放在不同的库 配置数据库连接 app: datasource: first: driver-class-name: com.mysql.cj.jdbc.Drive ...
- Spring Boot + Mybatis 实现动态数据源
动态数据源 在很多具体应用场景的时候,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库.又比如业务A要访问A数据库,业务B要访问B数据库等,都可以使用动 ...
- 基于Spring框架的简单多数据源切换解决办法
基于Spring框架的简单多数据源切换解决办法 Spring框架JDBC包提供了一个抽象类AbstractRoutingDataSource提供了动态切换数据库的基础方法.我们仅仅需要实现一个简单的数 ...
- 13、Spring Boot 2.x 多数据源配置
1.13 Spring Boot 2.x 多数据源配置 完整源码: Spring-Boot-Demos
- Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置
上一篇我们介绍了在使用JdbcTemplate来做数据访问时候的多数据源配置实现.接下来我们继续学习如何在使用Spring Data JPA的时候,完成多数据源的配置和使用. 添加多数据源的配置 先在 ...
随机推荐
- 对象(面向对象、创建对象方式、Json)
一.面向对象 面向过程:凡事亲力亲为,每件事的具体过程都要知道,注重过程 面向对象:根据需求寻找对象,所有的事都用对象来做,注重结果 面向对象特性:封装.继承.多态(抽象性) js是一门基于对象的语言 ...
- NetworkX系列教程(3)-手动创建graph
小书匠Graph图论 不可否认,日常中我们使用最多的还是,使用自己的数据去手动创建自己的图形,而不是使用生成器,现从给graph添加点和边入手,讲解手动创建graph. 目录: 3.给graph添加节 ...
- Centos 如何扩充/增加磁盘
1:使用背景 废话不多说,磁盘空间不足,增加磁盘,然后扩充现有不足空间磁盘. 本次以Vmware进行测验. 2:我们本次要增加的就是这个 3:我们先添加一个磁盘,20G,添加过程不在赘述 4:添加完成 ...
- Linux find,grep 命令
使用实验楼Linux环境开发,部分内容有所参考,link:https://www.shiyanlou.com/ 概述: find: 在目录中搜索文件,它的使用权限是所有用户 命令格式: find [路 ...
- P1095 守望者的逃离——DP?贪心?
https://www.luogu.org/problem/P1095 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大 ...
- Python里面match()和search()的区别?
答:re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配. re模块中research(pattern,string[,flags]), ...
- java1.8 lambda进行并行运算
parallelStream()支持并行运算: package com.roocon.thread.t2; import java.util.Arrays; import java.util.List ...
- HNOI2009有趣的数列
首先next_permutation打表,发现Cat规律. 其实考试的时候这么做没什么问题,而且可以节省异常多的时间,那么现在我们来想一下why. 首先我拿模型法解释一下,我们把2n个数看成2n个人, ...
- Linux用户组
1.介绍 类似于角色,系统可以对有共性的多个用户进行统一的管理 2.增加组 groupadd 组名 3.删除组 groupdel 组名 4.增加用户时直接为用户指定组 useradd -g 用 ...
- 为什么HashMap桶(链表)的长度超过8才会转换成红黑树
百度了一下,感觉能说清楚的并不多,所以在此记录一下. 首先说一说转换为红黑树的必要性:红黑树的插入.删除和遍历的最坏时间复杂度都是log(n),因此,意外的情况或者恶意使用下导致hashCode()方 ...