JavaWEB项目之如何配置动态数据源

 更新时间:2023年06月20日 10:38:50   作者:hongmin.shm  
这篇文章主要介绍了JavaWEB项目之如何配置动态数据源问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

JavaWEB项目配置动态数据源

说明

项目中如果需要连接多个数据库,则需要配置动态数据源,对于使用Spring+MyBatis框架的项目来说配置动态数据源一般需要在SqlMapConfig.xml中配置

接下来是配置步骤:

步骤

在配置JDBC连接的文件中配置动态数据源

<?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:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"  xmlns:util="http://www.springframework.org/schema/util" 
     xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:cache="http://www.springframework.org/schema/cache"
     xsi:schemaLocation="
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/cache  
        http://www.springframework.org/schema/cache/spring-cache.xsd 
        http://www.springframework.org/schema/jdbc  
        http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
        http://www.springframework.org/schema/util  
        http://www.springframework.org/schema/util/spring-util.xsd"
        >
			<context:annotation-config/>
			    <tx:annotation-driven transaction-manager="transactionManager"/>
			    <!-- 引入配置文件 -->
			    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
			        <property name="locations">
			            <list>
			                <value>classpath*:application.properties</value>
			            </list>
			        </property>
			    </bean>
		<!--数据源一-->		    
				<bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">  
		     <property name="driverClassName"  value="${jdbc1.driver}"/>  
		    <!-- 基本属性 url、user、password -->
		        <property name="url" value="${jdbc1.url}"/>
		        <property name="username" value="${jdbc1.username}"/>
		        <property name="password" value="${jdbc1.password}"/> 
		  </bean>  
		  <!--数据源二-->		    
				<bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">  
		     <property name="driverClassName"  value="${jdbc1.driver}"/>  
		    <!-- 基本属性 url、user、password -->
		        <property name="url" value="${jdbc1.url}"/>
		        <property name="username" value="${jdbc1.username}"/>
		        <property name="password" value="${jdbc1.password}"/> 
		  </bean>  
			 <!--这里配置数据源管理工具类,自定义一个管理类用于设置以及获取当前数据源名称等操作,该类需要继承AbstractRoutingDataSource类并实现其中的抽象方法-->		     
				<bean id="dataSource" class="自定义DbcontrxtHolder类的全线名称(包名.类名)">
				<!-- 设置默认数据源 -->
			        <property name="defaultTargetDataSource" ref="dataSource1"/>
			        <property name="targetDataSources">
			            <map>
			            <!-- 配置数据源列表  key为切换数据源时所用的名称,value-ref为配置datasource的bean的id值 -->
			                <entry key="dataSource1" value-ref="dataSource1"/>
			                <entry key="dataSource2" value-ref="dataSource2"/>
			            </map>
			        </property>
			    </bean>	
			    <!--后面配置事务等其他项,这里不再列出-->! 
    </beans>     

新建数据源管理工具DbcontrxtHolder类

package com.framework;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DbcontextHolder extends AbstractRoutingDataSource{
	public static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
    //添加动态数据源时指定名称,用于切换数据源时获取连接对象    其变量值为 targetDataSources键值 
	public static final String DATASOURCE1 = "dataSource1";
	public static final String DATASOURCE2 = "dataSource2";
    /**
     * 设置当前数据源
     * @param dbType
     */
    public static void setDbType(String dbType){
        contextHolder.set(dbType);
    }
    /**
     * 获得当前数据源
     * @return
     */
    public static String getDbType(){
        String dbType = (String)contextHolder.get();
        return dbType;
    }
    /**
     *清除上下文
     *
     */
    public static void clearContext(){
        contextHolder.remove();
    }
    @Override
    protected Object determineCurrentLookupKey() {
        return DbcontextHolder.getDbType();
    }
}

在业务中切换数据源

public void test(){
...业务代码
DbcontextHolder.setDbType(DbcontextHolder.DATASOURCE2);//切换数据源2
     //保存信息当前数据源
     if(!saveSendTaskSimple(sendTask)){
            return false;
        }
//清理上下文信息,恢复到默认数据源        
DbcontextHolder.clearContext();
...业务代码
}

web项目中配置多个数据源

spring + mybatis 多数据源配置有两种解决方案

1、配置多个不同的数据源,使用一个sessionFactory,在业务逻辑使用的时候自动切换到不同的数据源,有一个种是在拦截器里面根据不同的业务现切换到不同的datasource; 有的会在业务层根据业务来自动切换。

2、在spring项目中配置多个不同的数据源datasource,配置多个sqlSessionFactory,每个sqlSessionFactory对应一个datasource,在dao层根据不同业务自行选择使用哪个数据源的session来操作。

(一)定义数据源名称常量

public class DataSourceType {
    public  static final String  SOURCE_MYSQL = "mysql_dataSource";
    public  static final String  SOURCE_POSTGS = "postgs_dataSource";
}

(二)创建负责切换数据源的类

public class DataSourceContextHolder {
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  
    public static void setDbType(String dbType) {  
           contextHolder.set(dbType);  
    }  
    public static String getDbType() {  
           return ((String) contextHolder.get());  
    }  
    public static void clearDbType() {  
           contextHolder.remove();  
    }  
}

(三) 建立动态数据源类

该类必须继承AbstractRoutingDataSource,且实现方法determineCurrentLookupKey

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource{
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder. getDbType();
    }
}

(四)配置xml

<!-- 配置mysql -->
    <bean id="mysql_dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/colleges" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>
    <!-- 配置postgs -->
     <bean id="postgs_dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://114.215.83.3:5432/coges" />
        <property name="username" value="postgres" />
        <property name="password" value="postgres" />
    </bean>
    <!-- 配置动态数据源 -->
     <bean id ="dataSource" class= "com.mote.dc.changedb.DynamicDataSource" >  
          <property name ="targetDataSources">  
                <map key-type ="java.lang.String">  
                      <entry value-ref ="postgs_dataSource" key= "postgs_dataSource"></entry >  
                      <entry value-ref ="mysql_dataSource" key= "mysql_dataSource"></entry >  
                </map >  
          </property>  
          <!-- 默认使用mysql -->  
          <property name ="defaultTargetDataSource" ref= "mysql_dataSource"></property >      
   </bean>

(五)当需要使用某个数据库的时候

使用下面一行代码进行切换

//切换数据库
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_POSTGS);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Freemaker Replace函数的正则表达式运用

    Freemaker Replace函数的正则表达式运用

    这篇文章主要介绍了Freemaker Replace函数的正则表达式运用 的相关资料,需要的朋友可以参考下
    2015-12-12
  • Idea2023配置JavaWeb项目(最新)

    Idea2023配置JavaWeb项目(最新)

    本文将介绍如何配置JavaWeb项目,以在Idea中实现开发环境,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • feign客户端HTTP状态码为204时 响应体被忽略的问题

    feign客户端HTTP状态码为204时 响应体被忽略的问题

    这篇文章主要介绍了feign客户端HTTP状态码为204时 响应体被忽略的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java mysql特殊形式的查询语句详解

    Java mysql特殊形式的查询语句详解

    这篇文章主要介绍了Java mysql特殊形式的查询,包括子查询和联合查询、自身连接查询问题,本文通过sql语句给大家介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Java编程实现统计数组中各元素出现次数的方法

    Java编程实现统计数组中各元素出现次数的方法

    这篇文章主要介绍了Java编程实现统计数组中各元素出现次数的方法,涉及java针对数组的遍历、比较、运算等相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • Mybatis-Plus中updateById方法不能更新空值问题解决

    Mybatis-Plus中updateById方法不能更新空值问题解决

    本文主要介绍了Mybatis-Plus中updateById方法不能更新空值问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 浅谈JAVA并发之ReentrantLock

    浅谈JAVA并发之ReentrantLock

    本文主要介绍了基于AQS实现的ReentrantLock(重入锁),感兴趣的同学,可以参考下。
    2021-06-06
  • java实现顺时针打印矩阵

    java实现顺时针打印矩阵

    这篇文章主要为大家详细介绍了java实现顺时针打印矩阵的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • JDBC中PreparedStatement详解以及应用场景实例介绍

    JDBC中PreparedStatement详解以及应用场景实例介绍

    PreparedStatement对象代表的是一个预编译的SQL语句,用它提供的setter方法可以传入查询的变量,这篇文章主要给大家介绍了关于JDBC中PreparedStatement详解以及应用场景实例介绍的相关资料,需要的朋友可以参考下
    2024-02-02
  • Java8中常见函数式接口的使用示例详解

    Java8中常见函数式接口的使用示例详解

    在 Java 8 中,函数式接口是一个关键的特性,它们允许将方法作为参数传递或返回类型,本文为大家整理了一些常见的函数式接口的使用,希望对大家有所帮助
    2023-12-12

最新评论