使用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.在运行一段时间后程序异常,更新操作没有切换到主库上. 这个问题在先调用读操作后再调用写操作会出现. 经日志分析原因: ...
随机推荐
- POJ3187Backward Digit Sums[杨辉三角]
Backward Digit Sums Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6350 Accepted: 36 ...
- bzoj2438[中山市选2011]杀人游戏
Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面, 查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他 认识的人, ...
- 单机多实例Tomcat部署
单机单用户基础上, 如何运行多个tomcat实例. 首先是tomcat的目录结构 bin – 包含所有运行tomcat的二进制和脚本文件 lib – 包含tomcat使用的所有共享库 c ...
- 044医疗项目-模块四:采购单模块—采购单保存(Dao,Service,Action三层)
我们上上一篇文章(042医疗项目-模块四:采购单模块-采购单明细添加查询,并且把数据添加到数据库中)做的工作是把数据插入到了数据库,我们这篇文章做的是042医疗项目-模块四:采购单模块-采购单明细添加 ...
- [转]使用URLDecoder和URLEncoder对中文进行处理
一 URLEncoder HTML 格式编码的实用工具类.该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法.有关 HTM ...
- xenserver磁盘扩容扩不大问题解决
http://www.osyunwei.com/archives/7956.html xenserver将磁盘扩大后,fdisk可以看到容量大了 但是df -h确实没大? 解决: fdisk /d ...
- document.elementFromPoint在IE8下无法稳定获取当前坐标元素的解决方法
document.elementFromPoint(e.clientX, e.clientY) document.elementFromPoint(e.clientX, e.clientY) 执行2次 ...
- Beta版本项目展示要求
项目评审的定在1月5日上午9:00在新主楼D225进行. 在Beta阶段项目评审会上, 每个团队有12分钟展示时间,10分钟问答和机动时间,我们的展示也不需要PPT,大家把要展现的东西写成博客(可以有 ...
- 如何对于几百行SQL语句进行优化?
1.最近在开发中遇到的一些关于几百行SQL语句做查询的问题,需要如何的解决优化SQL这确实是个问题,对于当下的ORM 框架 EF 以及其他的一些的开源的框架例如Drapper ,以及Sqlite-Su ...
- SQL基础之GROUPING
1.grouping sets 记得前几天第一次接触grouping sets时,笔者的感觉是一脸懵逼. 后来一不小心看到msdn上对grouping sets的说明,顿时豁然开朗,其实groupin ...