spring多数据源配置

c#小王子 c#小王子 2022-04-11 335 Java

第一章 引言

1.编写目的

此次通过 nghq项目,做出的技术学习与分享,使团队成员拓展技术知识点,快速有效提高团队的 凝聚力、战斗力。

 


第二章 spring多数据源

  Spring多数据源的配置可以用于mysql数据库主从分离、项目多库的应用场景,并用事物切面动态切换当前数据库,下面简单介绍配置步骤

  1.数据库连接配置proxool-conf.xml


<?xml version="1.0" encoding="utf-8"?>
<something-else-entirely>
	<proxool>
		<alias>ng1</alias>
	<driver-url>jdbc:mysql://192.168.26.56/ng1?characterEncoding=UTF-8</driver-url> 
		<driver-class>com.mysql.jdbc.Driver</driver-class>
		<driver-properties>
			<property name="user" value="root" />
			<property name="password" value="123456" />
		</driver-properties>
		<house-keeping-sleep-time>30000</house-keeping-sleep-time>
	<maximum-connection-count>500</maximum-connection-count>
		<minimum-connection-count>10</minimum-connection-count>
		<maximum-new-connections>20</maximum-new-connections>
		<prototype-count>5</prototype-count>
		<test-before-use>true</test-before-use>
	<simultaneous-build-throttle>20</simultaneous-build-throttle>
		<house-keeping-test-sql>select 100 + 1000 from dual</house-keeping-test-sql>
	</proxool>
	
	<proxool>
		<alias>ng2</alias>	<driver-url>jdbc:mysql://192.168.26.56/ng2?characterEncoding=UTF-8</driver-url> 
		<driver-class>com.mysql.jdbc.Driver</driver-class>
		<driver-properties>
			<property name="user" value="root" />
			<property name="password" value="123456" />
		</driver-properties>
	<house-keeping-sleep-time>30000</house-keeping-sleep-time>
	<maximum-connection-count>500</maximum-connection-count>
		<minimum-connection-count>10</minimum-connection-count>
		<maximum-new-connections>20</maximum-new-connections>
		<prototype-count>5</prototype-count>
		<test-before-use>true</test-before-use>
	<simultaneous-build-throttle>20</simultaneous-build-throttle>
		<house-keeping-test-sql>select 100 + 1000 from dual</house-keeping-test-sql>
	</proxool>
</something-else-entirely> 

 

以上配置,说明项目将要对ng1,ng2两个数据库进行连接

 

2.spring数据源配置spirng-datasource.xml

<!--加载数据库ng1配置-->
    <bean id="ng1" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
	    <property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver" /> 
         <!--ng1指proxool-conf.xml的数据库别名ng1-->
	    <property name="url" value="proxool.ng1" /> 
	</bean>

 

<!--加载数据库ng2配置-->
    <bean id="ng2" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
	    <property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver" /> 
         <!--ng2指proxool-conf.xml的数据库别名ng2-->
	    <property name="url" value="proxool.ng2" /> 
	</bean>

 

 

3.动态数据源配置

	<bean id="dynamicDataSource" class="com.mopon.pay.util.dataSource.DynamicDataSource">   
      <property name="targetDataSources">  
            <map key-type="java.lang.String">  
                 <entry key="ng1" value-ref="ng1" /> 
                 <entry key="ng2" value-ref="ng2" />   
            </map>  
        </property>  
        <property name="defaultTargetDataSource" ref="ng1" />  
    </bean>

 

 

其中value-ref="ng1",指id为ng1的bean。

<property name="defaultTargetDataSource" ref="ng1" /> 指定项目默认连接到ng1

 

DynamicDataSource.java源码如下:

 

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
 
public class DynamicDataSource extends AbstractRoutingDataSource{
	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); 
	
	public static void setDataSourceName(String dataSourceName) {  
        contextHolder.set(dataSourceName);  
    } 
	public static String getDataSourceName() {  
        contextHolder.get();  
    } 
	@Override
	protected Object determineCurrentLookupKey() { 
		return getDataSourceName();
	}
	
}

 

4.手动切换数据源

 

进行数据库操作前,执行DynamicDatasource.setDataSourceName("ng1"), 则项目连接到ng1数据库;同理DynamicDatasource.setDataSourceName("ng2"),则项目连接到ng2数据库

 

5.自动切换数据源

自动切换数据源由spring切面织入,如下MultipleDataSourceAspectAdvice.java

 

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.core.annotation.Order;

import org.springframework.stereotype.Component;

 

import com.mopon.pay.util.dataSource.DataSourceContextHolder;

 

@Component
@Aspect
@Order(1)
public class MultipleDataSourceAspectAdvice {	
 
	@Around("execution(*com.mopon.service.test.impl.*Impl.*(..))")
    public Object onAround(ProceedingJoinPoint join) throws Throwable {
		  if(join.toString().indexOf("SqlAdapterService")!=-1){
			  DataSourceContextHolder.setDataSourceType("c0001_card");
		  }else{
			  DataSourceContextHolder.setDataSourceType(null);
		  }
		 return join.proceed();
    }
}

 

@Aspect代表该类是spring切面类;

@Order(1)代表该类,要优于spring其他切面先运行,这里主要确保在事物切面transactionManager之前运行,因为一个方法在开启事务之后切换数据库连接是不会生效的,必须等事务结束,为了避免这种错误发生,索性在事务开始前先切换数据库

@Around("execution(*com.mopon.service.test.impl.*Impl.*(..))")代表在com.mopon.service.test.impl包下的所有已Impl结尾的java类的所有方法运行前需要执行的方法,该方法即用来对数据库进行切换。


【下载地址】

百度网盘链接:https://pan.baidu.com/s/1OBc1vlKiW0eNrO4MJjv5lA

提取码:6scm


相关文章


使用-JFreeChart来创建基于web的图表

使用-JFreeChart来创建基于web的图表

XStream使用文档

XStream使用文档

WebService发布过程及常见问题

WebService发布过程及常见问题

webpack实战入门进阶调优分享

webpack实战入门进阶调优分享

weblogic调优参数及监控指标

weblogic调优参数及监控指标

weblogic节点管理

weblogic节点管理

weblogic管理控制台概述

weblogic管理控制台概述

weblogic-部署和启动

weblogic-部署和启动

WebLogic-Server-性能及调优-调优-Java-虚拟机

Java 虚拟机(Java virtual machine,简称 JVM)是一种虚拟“执行引擎”实例,可在微处理器上执行 Java 类文件中的字节码。调整 JVM 的方式会影响 Weblogic Server 和应用程序的性能。

Velocity用户教程

Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

Velocity用户手册

Velocity 用户手册是帮助页面设计者和内容提供者认识 Velocity 和其简单而功能强大的脚本语言――Velocity 模板语言(VTL)。在手册上的许多例子,都是用 Velocity 插入动态的内容到网页上,但是所有的 VLT 例子都能应用到其他的页面和模板中。

知之

知之平台是全球领先的知识付费平台。提供各个领域的项目实战经验分享,提供优质的行业解决方案信息,来帮助您的工作和学习

使用指南 建议意见 用户协议 友情链接 隐私政策 Powered by NOOU ©2020 知之