spring+springmvc+mybatis链接多数据源
来源:互联网 发布:大数据运维工程师简历 编辑:程序博客网 时间:2024/05/23 01:20
1、创建枚举表示不同的数据源
/** * 数据源的类别:ONE/TWO */public enum DataSources { ONE,TWO}
2、通过 TheadLocal 来保存每个线程选择哪个数据源的标志(key):
package com.lcl.util;import com.lcl.entity.DataSources;public class DataSourceTypeManager { private static final ThreadLocal<DataSources> dataSourceTypes = new ThreadLocal<DataSources>(); public static DataSources get(){ return dataSourceTypes.get(); } public static void set(DataSources dataSourceType){ dataSourceTypes.set(dataSourceType); } //这里充值成xml配置文件中默认的数据源 public static void reset(){ dataSourceTypes.set(DataSources.ONE); } public static void clear() { dataSourceTypes.remove(); } }
3、定义 ThreadLocalRountingDataSource,继承AbstractRoutingDataSource:
package com.lcl.util; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class ThreadLocalRountingDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceTypeManager.get(); }}
4、创建db.properties文件存储数据源配置信息(这里偷个懒,本机上相同数据库不同的两个数据源)
urlOne:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8urlTwo:jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8driverClassName:com.mysql.jdbc.Driverusername:rootpassword:root
5、在ApplicationContext.xml配置文件中向 ThreadLocalRountingDataSource 注入 ONE和 TWO 等数据源:
<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "> <!-- 启用注解 --><context:annotation-config /> <!-- 启动组件扫描,排除@Controller组件,该组件由SpringMVC配置文件扫描 --><context:component-scan base-package="com.lcl"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /></context:component-scan><bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>/WEB-INF/classes/db.properties</value> <!--这里可以配置多个源--> </list> </property> </bean> <!-- 配置数据源 --> <bean id="dataSourceOne" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <!-- 数据库基本信息配置 --> <property name="url" value="${urlOne}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <property name="driverClassName" value="${driverClassName}" /> </bean><bean id="dataSourceTwo" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <!-- 数据库基本信息配置 --> <property name="url" value="${urlTwo}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <property name="driverClassName" value="${driverClassName}" /> </bean> <bean id="dataSource" class="com.lcl.util.ThreadLocalRountingDataSource"> <!--默认使用dataSourceOne作为数据源 --> <property name="defaultTargetDataSource" ref="dataSourceOne" /> <property name="targetDataSources"> <map key-type="com.lcl.entity.DataSources"> <entry key="ONE" value-ref="dataSourceOne"/> <entry key="TWO" value-ref="dataSourceTwo"/> <!--这里的key值必须为枚举中的值,还可以加多个dataSource --> </map> </property> </bean> <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean><tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/> <tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> <tx:method name="edit*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> </tx:attributes> </tx:advice><!-- 事物处理 --> <aop:config> <aop:pointcut id="pc" expression="execution(* com.fh.service..*(..))" /> <aop:advisor pointcut-ref="pc" advice-ref="txAdvice" /> </aop:config><!-- 配置mybatis --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property> <!-- mapper扫描 --> <property name="mapperLocations" value="classpath:mybatis/*/*.xml"></property> </bean> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory" /> </bean><!--启动切面扫描--><aop:aspectj-autoproxy proxy-target-class="true"/></beans>
6、创建ApplicationContext-mvc.xml配置文件
<?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:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <mvc:annotation-driven/> <mvc:default-servlet-handler/> <context:component-scan base-package="com.lcl.controller" /> <!-- 对静态资源文件的访问 restful--> <mvc:resources mapping="/uploadFiles/**" location="/,/uploadFiles/" /> <!-- 访问拦截 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**/**"/> <bean class="com.lcl.interceptor.LoginHandlerInterceptor"/> </mvc:interceptor> </mvc:interceptors> <!-- 配置SpringMVC的视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <bean id="exceptionResolver" class="com.lcl.resolver.MyExceptionResolver"></bean> <!-- 上传拦截,如最大上传值及最小上传值 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" > <property name="maxUploadSize"> <value>104857600</value> </property> <property name="maxInMemorySize"> <value>4096</value> </property> <property name="defaultEncoding"> <value>utf-8</value> </property> </bean> <aop:aspectj-autoproxy proxy-target-class="true"/></beans>
7、创建mybatis-config.xml配置文件
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <settings> <setting name="cacheEnabled" value="true" /><!-- 全局映射器启用缓存 --> </settings> <typeAliases> <typeAlias type="com.lcl.entity.User" alias="User"/> </typeAliases> </configuration>
8、切面更换数据源(这个暂时不需要看了,不能对dao层进行切面,要切也只能对controller切面,应为在service中有事物,在一个事物中不能切换数据源,还没有找到解决方法,我现在是在controller中执行不同数据的代码是上面切换数据,执行完之后切换回来,应为在切面controller的话整个controller都只能操作一个数据源了)
//执行其他操作DataSourceContextHolder.setDbType(DataSources.MALL);userService.findValueByKey(map);DataSourceContextHolder.setDbType(DataSources.MALL);//继续执行其他操作
(下面这配置暂时不需要看了)
package com.lcl.systemManage;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;/** * 对dao层进行监控) * @author Administrator * */@Component@Aspectpublic class DataSourcesChange { /** * 执行dao层方法前切换数据源 * @param point * @throws Throwable */ @Before("execution(* com.lcl.dao..*(..))") public void enterController(JoinPoint point) throws Throwable { String methodName = point.getSignature().getName();//获取dao层执行的方法名 if(className.endwith("forTwo")){ DataSourceTypeManager.set(DataSources.Two);//如果执行的方法包含特定结尾,更换数据源 } //这里根据方法名结尾有多个else if判断切换那个数据源 }/** * dao执行完毕后切换回数据源 * @param point * @param result */ @AfterReturning(pointcut = "execution(* com.lcl.dao..*(..))",returning = "result") public void logAfterExecution(JoinPoint point, Object result){ String methodName = point.getSignature().getName();//获取dao层执行的方法名 if(className.endwith("forTwo")){ DataSourceTypeManager.reset();//执行完成特定方法后切换回默认数据源 } }}
本文参考:http://blog.csdn.net/q908555281/article/details/50316137
http://www.2cto.com/kf/201505/400273.html
事物配置查看大神才知道:http://blog.csdn.net/wangpeng047/article/details/43450189
感谢大神资料参考,这里记下来以备后用
0 0
- spring+springmvc+mybatis链接多数据源
- Spring+SpringMVC+Mybatis 多数据源整合
- Spring+SpringMVC+Mybatis 多数据源整合
- spring+springMVC+mybatis 多数据源配置
- Spring+SpringMVC+Mybatis 多数据源整合
- springMVC+myBatis多数据源
- Spring+SpringMVC+Mybatis 多数据源动态切换
- 关于spring+springMvc+mybatis整合,配置多数据源
- spring 多数据源链接
- spring mybatis 多数据源
- spring Mybatis 多数据源
- springmvc mybatis多数据源配置
- SpringMvc+Mybatis多数据源配置
- springMvc+mybatis多数据源配置
- springmvc + mybatis多数据源配置
- springmvc+mybatis多数据源配置
- springMVC+Mybatis多数据源实现
- SpringMVC+ Mybatis 配置多数据源切换
- 链表中导数第K个结点(快慢指针)
- C++学习笔记(1)之传值、传指针、传引用的区别
- jenkins常用插件
- 持续集成平台Jenkins的搭建和使用
- Supervised Hashing for Image Retrieval via Image Represention Learning-笔记1
- spring+springmvc+mybatis链接多数据源
- android图片_缩放图片
- 此刻的我只是为了写博客而写博客(流汗 ( ̄O ̄;))
- Flink运行时之通信层API
- 2016全球最美面孔100人---名单+真图
- Servlet笔记二之Tomcat安装时故障总结
- css3 box-sizing属性
- BZOJ4514: [Sdoi2016]数字配对
- hdu5988 Coding Contest