使用AOP 实现多数据源 切换
多数据源的实现,这里就来个实例吧
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 实现多数据源 切换的更多相关文章
- 【原】继承AbstractRoutingDataSource再通过AOP实现动态数据源切换
关于AbstractRoutingDataSource动态切换数据源是我在研究某开源项目时候才注意到的,大概就看懂了Spring AOP切面这里,根据作者的意思是通过继承这个抽象类可以实现数据源的动态 ...
- 继承AbstractRoutingDataSource再通过AOP实现动态数据源切换
package com.zdd.data.aspect; import java.util.ArrayList; import java.util.HashMap; import java.util. ...
- 继承AbstractRoutingDataSource再通过AOP实现动态数据源切换(转)
关于AbstractRoutingDataSource我在研究开源中国的开源项目时候才发现,好奇的看了一下代码发现自己看不明白,大概就看懂了Spring AOP切面这里,根据注释作者的意思是通过这个可 ...
- 【开发笔记】- AbstractRoutingDataSource动态数据源切换,AOP实现动态数据源切换
AbstractRoutingDataSource动态数据源切换 上周末,室友通宵达旦的敲代码处理他的多数据源的问题,搞的非常的紧张,也和我聊了聊天,大概的了解了他的业务的需求.一般的情况下我们都是使 ...
- AbstractRoutingDataSource动态数据源切换,AOP实现动态数据源切换
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u012881904/article/de ...
- Java:基于AOP的动态数据源切换(附源码)
1 动态数据源的必要性 我们知道,物理服务机的CPU.内存.存储空间.连接数等资源都是有限的,某个时段大量连接同时执行操作,会导致数据库在处理上遇到性能瓶颈.而在复杂的互联网业务场景下,系统流量日益膨 ...
- Spring主从数据库的配置和动态数据源切换原理
原文:https://www.liaoxuefeng.com/article/00151054582348974482c20f7d8431ead5bc32b30354705000 在大型应用程序中,配 ...
- SpringBoot31 整合SpringJDBC、整合MyBatis、利用AOP实现多数据源
一.整合SpringJDBC 1 JDBC JDBC(Java Data Base Connectivity,Java 数据库连接)是一种用于执行 SQL 语句的 Java API,可以为多种关系数 ...
- dubbo服务+Spring事务+AOP动态数据源切换 出错
1:问题描述,以及分析 项目用了spring数据源动态切换,服务用的是dubbo.在运行一段时间后程序异常,更新操作没有切换到主库上. 这个问题在先调用读操作后再调用写操作会出现. 经日志分析原因: ...
随机推荐
- AC日记——石头剪刀布 openjudge 1.6 08
08:石头剪刀布 总时间限制: 1000ms 内存限制: 65536kB 描述 石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负. 一天,小A和小B正好在 ...
- 实战SQL注入
SQL注入是啥就不解释了.下面演示一个SQL注入的例子 SQL注入点可以自己尝试或用SQL注入漏洞扫描工具去寻找,这里用大名鼎鼎的sqlmap演示一个现成的案例. 1.漏洞试探 root@kali:~ ...
- 定时取数据库的schema,并推送到git服务器
写了个脚本,定时去数据库取schema,并推送到公司的git里. #daily_schema.py #/usr/bin/env python import os import datetime,tim ...
- js jquery 关闭弹出页面 并刷新父页面(window.opener)
function Closepage() { if (window.opener && !window.opener.closed) { window.parent.opener.lo ...
- css3 box-sizing属性
个人总结: 如果需要兼容IE6 IE7,使用content-box.现在流行bootstrap3,需注意它使用的是border-box. box-sizing属性可以为三个值之一:content-bo ...
- NOI2018准备 Day11
今天7点半到9点我都不知道自己在干啥, 一共A了3道题,2道钻石,1道大师. 下午调一道线段树3个小时没调出来,一个单调栈2小时没搞出来...... 学了个算法:求极大子矩阵. 昨天定的目标是学指针, ...
- JSP中的Servlet及Filter
asp.net中,如果开发人员想自己处理http请求响应,可以利用HttpHandler来满足这一要求:类似的,如果要拦截所有http请求,可以使用HttpMoudle.java的web开发中,也有类 ...
- Autofac中的属性注入功能使用
使用依赖注入容器时,大部分都是使用构造函数来注入或者是xml配置文件.也有很多支持属性注入.Autofac就是其中一个. 1 为什么要有属性注入? 对于一些使用特频繁的类或者方法,很多类都会用到,那么 ...
- ios蓝牙开发(四)app作为外设被连接的实现-转发
代码下载: 原博客中大部分示例代码都上传到了github,地址是:https://github.com/coolnameismy/demo. 再上一节说了app作为central连接periphera ...
- Webwork 学习之路【01】Webwork与 Struct 的前世今生
Struts 1是全世界第一个发布的MVC框架,它由Craig McClanahan在2001年发布,该框架一经推出,就得到了世界上Java Web开发者的拥护,经过长达6年时间的锤炼,Struts ...