多数据源的实现,这里就来个实例吧

1、在 spring 的配置文件中数据源信息

<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"
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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd"> <!-- 加载配置属性文件 -->
<context:property-placeholder
ignore-unresolvable="true" location="classpath:conf.properties" />
<!-- C3P0连接池配置 -->
<bean id="dataSource_zh_CN" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${db1.jdbc.driver}" />
<property name="jdbcUrl" value="${db1.jdbc.url}" />
<property name="user" value="${db1.jdbc.username}" />
<property name="password" value="${db1.jdbc.password}" /> <!-- 配置初始化大小、最小、最大 -->
<property name="initialPoolSize" value="${jdbc.pool.init}" />
<property name="minPoolSize" value="${jdbc.pool.minIdle}" />
<property name="maxPoolSize" value="${jdbc.pool.maxActive}" />
<property name="maxIdleTime" value="60000" />
</bean> <!-- C3P0连接池配置 -->
<bean id="dataSource_en_US" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${db2.jdbc.driver}" />
<property name="jdbcUrl" value="${db2.jdbc.url}" />
<property name="user" value="${db2.jdbc.username}" />
<property name="password" value="${db2.jdbc.password}" /> <!-- 配置初始化大小、最小、最大 -->
<property name="initialPoolSize" value="${jdbc.pool.init}" />
<property name="minPoolSize" value="${jdbc.pool.minIdle}" />
<property name="maxPoolSize" value="${jdbc.pool.maxActive}" />
<property name="maxIdleTime" value="60000" />
</bean> <bean id="dataSource" class="com.bkc.bpmp.core.datasource.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="dataSource_zh_CN" value-ref="dataSource_zh_CN" />
<entry key="dataSource_en_US" value-ref="dataSource_en_US" />
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource_zh_CN" />
</bean> </beans>

  

2、在 Spring 配置文件中配置 AOP 切面信息,当访问 包 com.bkc.bpmp 及下面的子包中的类的方法时

<!-- 开启aop注解方式 -->
<aop:aspectj-autoproxy proxy-target-class="false"/> <bean id="dataSourceInterceptor" class="com.bkc.bpmp.core.aspectj.DataSourceInterceptor" /> <aop:config>
<aop:aspect id="dataSourceAspect" ref="dataSourceInterceptor">
<aop:pointcut id="setDs" expression="execution(* com.bkc.bpmp..*.*(..))" />
<aop:before method="setdataSourceCnOrEn" pointcut-ref="setDs"/>
</aop:aspect>
</aop:config>

3、实现 数据源 切面切换的方法,这里假设是根据 locale 来切换数据源的

package com.bkc.bpmp.core.aspectj;

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.i18n.LocaleContextHolder; import com.bkc.bpmp.core.annotation.DbType;
import com.bkc.bpmp.core.contants.DbTypeEnum;
import com.bkc.bpmp.core.datasource.DatabaseContextHolder; /**
* 用于实现 动态数据库切换的AOP 方法类
*
* @author ppnie
*/
public class DataSourceInterceptor
{
/**
* 设置数据源为中文 还是 英文
* @param jp
*/
public void setdataSourceCnOrEn(JoinPoint jp) { String curLocale = LocaleContextHolder.getLocale().toString();
System.out.println("==================dataSource_"+curLocale);
if(curLocale.equals("en_US"))
{
DatabaseContextHolder.setCustomerType("dataSource_"+curLocale);
}
else
{
DatabaseContextHolder.setCustomerType("dataSource_zh_CN");
}
logger.info("======="+"dataSource_"+curLocale+"======="); }
}

4、自定义动态数据源的切换方法,主要就是 写一个 AbstractRoutingDataSource 的子类啦

package com.bkc.bpmp.core.datasource;

public class DatabaseContextHolder
{ private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setCustomerType(String customerType)
{
contextHolder.set(customerType);
} public static String getCustomerType()
{
return contextHolder.get();
} public static void clearCustomerType()
{
contextHolder.remove();
}
}

  

package com.bkc.bpmp.core.datasource;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource
{ @Override
protected Object determineCurrentLookupKey()
{
return DatabaseContextHolder.getCustomerType();
} }

  

 就这样,达到触发条件的时候,就会去切换数据库啦

使用AOP 实现多数据源 切换的更多相关文章

  1. 【原】继承AbstractRoutingDataSource再通过AOP实现动态数据源切换

    关于AbstractRoutingDataSource动态切换数据源是我在研究某开源项目时候才注意到的,大概就看懂了Spring AOP切面这里,根据作者的意思是通过继承这个抽象类可以实现数据源的动态 ...

  2. 继承AbstractRoutingDataSource再通过AOP实现动态数据源切换

    package com.zdd.data.aspect; import java.util.ArrayList; import java.util.HashMap; import java.util. ...

  3. 继承AbstractRoutingDataSource再通过AOP实现动态数据源切换(转)

    关于AbstractRoutingDataSource我在研究开源中国的开源项目时候才发现,好奇的看了一下代码发现自己看不明白,大概就看懂了Spring AOP切面这里,根据注释作者的意思是通过这个可 ...

  4. 【开发笔记】- AbstractRoutingDataSource动态数据源切换,AOP实现动态数据源切换

    AbstractRoutingDataSource动态数据源切换 上周末,室友通宵达旦的敲代码处理他的多数据源的问题,搞的非常的紧张,也和我聊了聊天,大概的了解了他的业务的需求.一般的情况下我们都是使 ...

  5. AbstractRoutingDataSource动态数据源切换,AOP实现动态数据源切换

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u012881904/article/de ...

  6. Java:基于AOP的动态数据源切换(附源码)

    1 动态数据源的必要性 我们知道,物理服务机的CPU.内存.存储空间.连接数等资源都是有限的,某个时段大量连接同时执行操作,会导致数据库在处理上遇到性能瓶颈.而在复杂的互联网业务场景下,系统流量日益膨 ...

  7. Spring主从数据库的配置和动态数据源切换原理

    原文:https://www.liaoxuefeng.com/article/00151054582348974482c20f7d8431ead5bc32b30354705000 在大型应用程序中,配 ...

  8. SpringBoot31 整合SpringJDBC、整合MyBatis、利用AOP实现多数据源

    一.整合SpringJDBC 1  JDBC JDBC(Java Data Base Connectivity,Java 数据库连接)是一种用于执行 SQL 语句的 Java API,可以为多种关系数 ...

  9. dubbo服务+Spring事务+AOP动态数据源切换 出错

    1:问题描述,以及分析 项目用了spring数据源动态切换,服务用的是dubbo.在运行一段时间后程序异常,更新操作没有切换到主库上. 这个问题在先调用读操作后再调用写操作会出现. 经日志分析原因: ...

随机推荐

  1. Hibernate一对一关联映射配置

    一.一对一关联 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1 ...

  2. 父元素与子元素之间的margin-top问题

    父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. html代码: <div c ...

  3. Android app 简单的电话拨号器

    实现步骤: 1.画UI 可以用拖拽和文本编辑. 2.根据UI写业务逻辑  在MainActivity中的onCreate中编写 //get editText content et_number = ( ...

  4. 使用PLSQL导入导出数据库

    Oracle如何实现创建数据库.备份数据库及数据导出导入的一条龙操作 Oracle中对数据对象和数据的管理,无疑都是使用PL/SQL Developer来进行管理,该工具也提供给我们很多方便.快捷的操 ...

  5. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  6. java 22 - 13 多线程之解决线程安全问题的实现方式2

    上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ;  Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 ...

  7. onSaveInstanceState() 和 onRestoreInstanceState()

    本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceState(),并且在介绍这两个方法之后,再分别来实现使用 ...

  8. 用AutoCompleteTextView实现历史记录提示

    自定义AutoCompleteTextView 博客分类: android进阶 android  网上找到的都是同ArrayAdapter一起使用的,有时候需要自定义风格,咋办?follow me! ...

  9. 实现PD控制

    尝试为场加入PD控制 在之前的模拟中,需要最小化一个能量函数H. 这样做的原因是,由理想约束的特性(约束反力垂直于虚位移),对于不含体积蒙皮的情况,可以推出 对于表面点,有 J^T * Σfs = 0 ...

  10. Gruntjs: grunt-usemin使用心得

    grunt-usemin: Replaces references to non-optimized scripts or stylesheets into a set of HTML files u ...