JavaWEB项目之如何配置动态数据源
作者: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);
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
