SpringMVC配置雙數據源,一個java項目同時連接兩個數據庫

數據源在配置文件中的配置

<pre name="code" class="java"><?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:cache="http://www.springframework.org/schema/cache"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:jms="http://www.springframework.org/schema/jms" xmlns:lang="http://www.springframework.org/schema/lang"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd  
   	http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-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/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd  
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd  
    http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.1.xsd  
  	http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.1.xsd  
   	http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd  
  	http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd  
 	http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-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/util http://www.springframework.org/schema/util/spring-util-3.1.xsd">

	<context:annotation-config />

	<context:component-scan base-package="com"></context:component-scan>

	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:com/resource/config.properties</value>
			</list>
		</property>
	</bean>

	<bean id="dataSourceOne" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="${dbOne.jdbc.driverClass}" />
		<property name="jdbcUrl" value="${dbOne.jdbc.url}" />
		<property name="user" value="${dbOne.jdbc.user}" />
		<property name="password" value="${dbOne.jdbc.password}" />
		<property name="initialPoolSize" value="${dbOne.jdbc.initialPoolSize}" />
		<property name="minPoolSize" value="${dbOne.jdbc.minPoolSize}" />
		<property name="maxPoolSize" value="${dbOne.jdbc.maxPoolSize}" />
	</bean>

	<bean id="dataSourceTwo" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="${dbTwo.jdbc.driverClass}" />
		<property name="jdbcUrl" value="${dbTwo.jdbc.url}" />
		<property name="user" value="${dbTwo.jdbc.user}" />
		<property name="password" value="${dbTwo.jdbc.password}" />
		<property name="initialPoolSize" value="${dbTwo.jdbc.initialPoolSize}" />
		<property name="minPoolSize" value="${dbTwo.jdbc.minPoolSize}" />
		<property name="maxPoolSize" value="${dbTwo.jdbc.maxPoolSize}" />
	</bean>

	<bean id="dynamicDataSource" class="com.core.DynamicDataSource">
		<property name="targetDataSources">
			<map key-type="java.lang.String">
				<entry value-ref="dataSourceOne" key="dataSourceOne"></entry>
				<entry value-ref="dataSourceTwo" key="dataSourceTwo"></entry>
			</map>
		</property>
		<property name="defaultTargetDataSource" ref="dataSourceOne">
		</property>
	</bean>

	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dynamicDataSource" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
				<prop key="hibernate.show_sql">false</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hbm2ddl.auto">create</prop>
			</props>
		</property>
		<property name="packagesToScan">
			<list>
				<value>com.po</value>
			</list>
		</property>
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<aop:config>
		<aop:pointcut id="transactionPointCut" expression="execution(* com.dao..*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointCut" />
	</aop:config>

	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
			<tx:method name="*" read-only="true" />
		</tx:attributes>
	</tx:advice>

	<aop:config>
		<aop:aspect id="dataSourceAspect" ref="dataSourceInterceptor">
			<aop:pointcut id="daoOne" expression="execution(* com.dao.one.*.*(..))" />
			<aop:pointcut id="daoTwo" expression="execution(* com.dao.two.*.*(..))" />
			<aop:before pointcut-ref="daoOne" method="setdataSourceOne" />
			<aop:before pointcut-ref="daoTwo" method="setdataSourceTwo" />
		</aop:aspect>
	</aop:config>
</beans>

DynamicDataSource.class

 

package com.core;

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

public class DynamicDataSource extends AbstractRoutingDataSource{

	@Override
	protected Object determineCurrentLookupKey() {
		return DatabaseContextHolder.getCustomerType(); 
	}

}

 DatabaseContextHolder.class設置數據源的類

 

 

package com.core;

public class DatabaseContextHolder {

	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
<span style="white-space:pre">	</span>//設置要使用的數據源
	public static void setCustomerType(String customerType) {
		contextHolder.set(customerType);
	}
<span style="white-space:pre">	</span>//獲取數據源
	public static String getCustomerType() {
		return contextHolder.get();
	}
<span style="white-space:pre">	</span>//清除數據源,使用默認的數據源
	public static void clearCustomerType() {
		contextHolder.remove();
	}
}

DataSourceInterceptor.class

 

package com.core;

import org.aspectj.lang.JoinPoint;
import org.springframework.stereotype.Component;

@Component
public class DataSourceInterceptor {
	//數據源1
	public static final String SOURCE_PLAN = "dataSourceOne;
	//數據源2
        public static final String SOURCE_FUND = dataSourceTwo;	//數據源1
	public static final String SOURCE_PLAN = "dataSourceOne;
	//數據源2
        public static final String SOURCE_FUND = dataSourceTwo;

 

}springMVC數據源

jdbc_driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
dataSourceOne=jdbc:sqlserver://115.29.***.**;DatabaseName=DB_GuiHua

jdbc_username=**jdbc_password=**

dataSourceTwo=jdbc:sqlserver://115.29.***.*;DatabaseName=DB_Fund

 


 

Spring MVC會默認有一個數據源,當需要更換數據源時,要在調用事務之前配置

 

 

DataSourceContextHolder.setDbType(DataSourceType.SOURCE_FUND);//更換數據源
/**
 * @ClassName: DataSourceContextHolder
 * @Description: 數據庫切換工具類
 * @author: wzx
 * @date: 2016-07-27 上午10:26:01
 */
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();
	}
}
關注公衆號,我們一起學java
關注公衆號,我們一起學java

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章