上文已经讲了单个数据源的Druid的配置(http://www.cnblogs.com/nbfujx/p/7686634.html

Druid动态数据源配置 主要是继承AbstractRoutingDataSource再通过AOP来实现动态数据源切换

Druid动态数据源的使用(基于原先的程序调整

使用步骤:

1.调整配置属性文件:mybatis.properties (增加DataSource连接参数)

 master.driver=com.mysql.jdbc.Driver
master.url=jdbc:mysql://127.0.0.1:3306/jawavesys
master.username=root
master.password=jawave88
#定义初始连接数
master.initialSize=0
#定义最大连接数
master.maxActive=20
#定义最大空闲
master.maxIdle=20
#定义最小空闲
master.minIdle=1
#定义最长等待时间
master.maxWait=60000 slave.driver=com.mysql.jdbc.Driver
slave.url=jdbc:mysql://127.0.0.1:3306/jawave_eform
slave.username=root
slave.password=jawave88
#定义初始连接数
slave.initialSize=0
#定义最大连接数
slave.maxActive=20
#定义最大空闲
slave.maxIdle=20
#定义最小空闲
slave.minIdle=1
#定义最长等待时间
slave.maxWait=60000

2.调整SPRING配置文件:spring-base.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" 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-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <context:component-scan base-package="com.goku.druid.demo">
<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="location" value="classpath:mybatis.properties" />
</bean> <bean id="masterDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${master.driver}" />
<property name="url" value="${master.url}" />
<property name="username" value="${master.username}" />
<property name="password" value="${master.password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${master.initialSize}"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${master.maxActive}"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${master.maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${master.minIdle}"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${master.maxWait}"></property>
<!-- 这里配置提交方式,默认就是TRUE,可以不用配置 -->
<property name="defaultAutoCommit" value="true" />
<!-- 验证连接有效与否的SQL,不同的数据配置不同 -->
<property name="validationQuery" value="select 1 " />
<!--通过别名的方式配置扩展插件,监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall-->
<property name="filters" value="stat,log4j" />
<property name="proxyFilters">
<list>
<ref bean="stat-filter" />
<ref bean="log-filter"/>
</list>
</property>
</bean> <bean id="slaveDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${slave.driver}" />
<property name="url" value="${slave.url}" />
<property name="username" value="${slave.username}" />
<property name="password" value="${slave.password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${slave.initialSize}"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${slave.maxActive}"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${slave.maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${slave.minIdle}"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${slave.maxWait}"></property>
<!-- 这里配置提交方式,默认就是TRUE,可以不用配置 -->
<property name="defaultAutoCommit" value="true" />
<!-- 验证连接有效与否的SQL,不同的数据配置不同 -->
<property name="validationQuery" value="select 1 " />
<!--通过别名的方式配置扩展插件,监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall-->
<property name="filters" value="stat,log4j" />
<property name="proxyFilters">
<list>
<ref bean="stat-filter" />
<ref bean="log-filter"/>
</list>
</property>
</bean> <bean id="dataSource" class="com.goku.druid.demo.util.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<!-- master -->
<entry key="master" value-ref="masterDataSource"/>
<!-- slave -->
<entry key="slave" value-ref="slaveDataSource"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="masterDataSource"/>
</bean> <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:mapping/**/*.xml"></property>
</bean> <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.goku.druid.demo.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean> <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean> <!-- 开启事务注解驱动 -->
<tx:annotation-driven transaction-manager="transactionManager"/> <!-- 为业务逻辑层的方法解析@DataSource注解 为当前线程的routeholder注入数据源key -->
<bean id="dataSourceAspect" class="com.goku.druid.demo.util.DataSourceAspect" />
<aop:config proxy-target-class="true">
<aop:aspect id="dataSourceAspect" ref="dataSourceAspect" order="1">
<aop:pointcut id="tx" expression="execution(* com.goku.druid.demo.service..*.*(..)) "/>
<aop:before pointcut-ref="tx" method="before" />
</aop:aspect>
</aop:config> <!--监控统计-->
<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
<property name="slowSqlMillis" value="10000" />
<property name="logSlowSql" value="true" />
</bean> <!--日志-->
<bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter">
<property name="statementExecutableSqlLogEnable" value="true" />
</bean> </beans>

3.接下写AbstractRoutingDataSource继承类

package com.goku.druid.demo.util;

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

/**
* Created by nbfujx on 2017/10/18.
*/
public class DynamicDataSource extends AbstractRoutingDataSource { @Override
protected Object determineCurrentLookupKey() {
return DataSourceHolder.getDataSource();
} }

4.接下来写切面实现类

package com.goku.druid.demo.util;

import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature; /**
* Created by nbfujx on 2017/10/18.
*/
public class DataSourceAspect { /**
* 在dao层方法之前获取datasource对象之前在切面中获取数据源
*/
public void before(JoinPoint point)
{
Object target = point.getTarget();
System.out.println(target.toString());
String method = point.getSignature().getName();
System.out.println(method);
Class<?>[] classz = target.getClass().getInterfaces();
Class<?>[] parameterTypes = ((MethodSignature) point.getSignature())
.getMethod().getParameterTypes();
try {
Method m = classz[0].getMethod(method, parameterTypes);
System.out.println("method"+ m.getName());
if (m != null && m.isAnnotationPresent(DataSource.class)) {
DataSource data = m.getAnnotation(DataSource.class);
System.out.println("dataSource:"+data.value());
DataSourceHolder.putDataSource(data.value());
} } catch (Exception e) {
e.printStackTrace();
}
}
}

5.还有拿到数据元的类

package com.goku.druid.demo.util;

/**
* Created by nbfujx on 2017/10/18.
*/
public class DataSourceHolder {
public static final ThreadLocal<String> holder = new ThreadLocal<String>(); /**
* 设置数据源
*/
public static void putDataSource(String datasource) {
holder.set(datasource);
} /**
* 获取数据源
*/
public static String getDataSource() {
return holder.get();
} /**
* 清除数据源
*/
public static void clearDataSource() {
holder.remove();
}
}

6.DataSource数据源注解类

package com.goku.druid.demo.util;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; /**
* Created by nbfujx on 2017/10/18.
*/ @Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataSource {
String value();
}

7.在service层进行数据源注解切换

package com.goku.druid.demo.service;

import com.goku.druid.demo.model.FormElement;
import com.goku.druid.demo.model.UserWithBLOBs;
import com.goku.druid.demo.util.DataSource; /**
* Created by nbfujx on 2017-10-18.
*/
public interface UserService {
@DataSource("master")
UserWithBLOBs selectByPrimaryKey(String id); @DataSource("slave")
FormElement selectByPrimaryKey2(Integer id);
}

GITHUB

github :  https://github.com/nbfujx/learn-java-demo/tree/master/Goku.Dynamic.DruidDemo

Druid动态数据源配置的更多相关文章

  1. Springboot+Druid 动态数据源配置监控

    一.引入maven依赖,使用 starter 与原生 druid 依赖配置有所不同 <dependency> <groupId>com.alibaba</groupId& ...

  2. Spring Boot2.x 动态数据源配置

    原文链接: Spring Boot2.x 动态数据源配置 基于 Spring Boot 2.x.Spring Data JPA.druid.mysql 的动态数据源配置Demo,适合用于数据库的读写分 ...

  3. (七)spring+druid多数据源配置

    druid多数据源配置 一.druid简介 Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. ...

  4. Spring Boot + Mybatis多数据源和动态数据源配置

    文章转自 https://blog.csdn.net/neosmith/article/details/61202084 网上的文章基本上都是只有多数据源或只有动态数据源,而最近的项目需要同时使用两种 ...

  5. spring boot +mybatis+druid 多数据源配置

    因为我的工程需要在两个数据库中操作数据,所以要配置两个数据库,我这里没有数据源没有什么主从之分,只是配合多数据源必须要指定一个主数据源,所以我就把 操作相对要对的那个数据库设置为主数据(dataBas ...

  6. Mybatis+Druid多数据源配置

    在日常开发中我们可能会用到多数据源开发,什么是多数据源? 简单来讲的话,就是一个项目连接多个数据库.当然只是可能会用到,我暂时没见过应用场景,但是还是了解学习一下 此项目可以基于上一个简单集成项目进行 ...

  7. Spring Druid多数据源配置

    SpringBoot 多数据源配置 如果需要在一个应用中使用多个数据源,应当如何实现呢,在Spring配置MyBatis中,我们可以看到以下的代码 <!-- mybatis 的SqlSessio ...

  8. 记springboot + MP +Hikari动态数据源配置

    环境准备: springboot 2.1.6 mybatis-plus 数据库驱动 boot 自带hikari驱动 步骤1:  导入多数据源启动工具类 <!-- 多数据源支持 -->< ...

  9. 使用springboot + druid + mybatisplus完成多数据源配置

    一. 简介 1. 版本 springboot版本为2.0.3.RELEASE,mybatisplus版本为2.1.9, druid版本为1.1.9,swagger版本为2.7.0 2. 项目地址   ...

随机推荐

  1. IDEA使用Maven的第一个测试

    创建完成后,点击这个按钮.进行配置. 选择第二个就行了. 然后选择这个去配置tomcat.

  2. 数据挖掘:周期性分析SMCA算法

    数据挖掘:周期性分析SMCA算法 原文地址:http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1423978 算法介绍 以时间顺序挖掘周期性的模式 ...

  3. redis哨兵-5

    #地址: https://www.cnblogs.com/PatrickLiu/p/8444546.html #常用架构 redis1主1从+3哨兵 实现redis高可用 #redis主从 ##### ...

  4. [CSP-S模拟测试86]题解

    好久没有写整套题的题解了呢……主要是这两天考试题愈发神仙 实在是超出了垃圾博主的能力范围啊QAQ A.异或 不难想到,如果我们得到了$[L,R]$中每一位上0和1的个数,那么答案即为$2 \times ...

  5. 前端每日实战:23# 视频演示如何用纯 CSS 创作一个菜单反色填充特效

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览.https://codepen.io/comehope/pen/qYMoPo 可交互视频教程 此视频是 ...

  6. Java反射之方法反射demo

    package reflect; import java.lang.reflect.Method; public class ClassDemo3 { public static void main( ...

  7. 发布delphi程序(build with runtime package)要带哪些文件?

    Delphi提供两种方式来编译你的程序:使用包或者是单独的exe 使用包,你可以使用如下方法设置: 项目选项(菜单project->options->Packages页), 在Runtim ...

  8. zabbix真的很简单 (安装篇)

    系统环境: Centos 6.4 一直觉得 zabbix 很简单,但是还是有好多人看了好多文档都搞不明白怎么用,我从2013年使用到现在也小有心得,如果时间允许,很高兴与大家一起分享我在使用过程中的一 ...

  9. nginx的安装和负载均衡例子(RHEL/CentOS7.4)

    首先安装RHEL/CentOS7.4 mini ,然后关闭防火墙和 selinux ,更新系统(参看配置linux使用本地yum安装源和Redhat7/CentOS7 关闭防火墙和 selinux两个 ...

  10. git 多个远程仓库

    有时候一个git项目需要使用多个远程库,如:测试环境+生产环境,国内加国外等 项目根目录下修改 .git/config 文件 vim .git/config 新增远程一个远程仓库   并为其命名 :如 ...