我也是在网上参考了多个资源信息,现总结如下:
一、jdbc配置,我这里使用的两个数据库都是oracle,网友们可以根据自己的情况去调整里面的配置信息
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url1=jdbc\:oracle\:thin\:@192.168.1.88\:1521\:orcl
jdbc.username1=test1
jdbc.password1=password
jdbc.url2=jdbc\:oracle\:thin\:@192.168.1.88\:1521\:orcl
jdbc.username2=test2
jdbc.password2=password
jdbc.acquireIncrement=3
jdbc.initialPoolSize=3
jdbc.minPoolSize=2
jdbc.maxPoolSize=100
jdbc.maxIdleTime=600
jdbc.maxStatements=100
jdbc.numHelperThreads=10
jdbc.idleConnectionTestPeriod=900
二、Spring数据源配置
<!-- 配置properties 开始 -->
<bean id="propertyConfigurer "
class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<!-- <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"
/> <property name="ignoreResourceNotFound" value="false" /> -->
<property name="locations">
<list>
<value>classpath:config/jdbc.properties</value>
</list>
</property>
</bean>
<!-- 配置properties 结束 -->
<!-- 配置第一个DataSource数据源 开始 -->
<bean id="c3p0DataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url1}" />
<property name="user" value="${jdbc.username1}" />
<property name="password" value="${jdbc.password1}" />
<property name="acquireIncrement" value="${jdbc.acquireIncrement}" />
<property name="initialPoolSize" value="${jdbc.initialPoolSize}" />
<property name="minPoolSize" value="${jdbc.minPoolSize}" />
<property name="maxPoolSize" value="${jdbc.maxPoolSize}" />
<property name="maxIdleTime" value="${jdbc.maxIdleTime}" />
<property name="maxStatements" value="${jdbc.maxStatements}" />
<property name="numHelperThreads" value="${jdbc.numHelperThreads}" />
<property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}" />
</bean>
<!-- 配置第一个DataSource数据源 结束 -->
<!-- 配置第一个DataSource数据源 开始 -->
<bean id="c3p0DataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url2}" />
<property name="user" value="${jdbc.username2}" />
<property name="password" value="${jdbc.password2}" />
<property name="acquireIncrement" value="${jdbc.acquireIncrement}" />
<property name="initialPoolSize" value="${jdbc.initialPoolSize}" />
<property name="minPoolSize" value="${jdbc.minPoolSize}" />
<property name="maxPoolSize" value="${jdbc.maxPoolSize}" />
<property name="maxIdleTime" value="${jdbc.maxIdleTime}" />
<property name="maxStatements" value="${jdbc.maxStatements}" />
<property name="numHelperThreads" value="${jdbc.numHelperThreads}" />
<property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}" />
</bean>
<!-- 配置第一个DataSource数据源 结束 -->
<!-- 配置数据源切换工具类,这个;类需要自己去写,后面会有介绍 -->
<bean id="dynamicDataSource" class="com.odon.datasource.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry value-ref="c3p0DataSource1" key="c3p0DataSource1"></entry>
<entry value-ref="c3p0DataSource2" key="c3p0DataSource2"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="c3p0DataSource1"> <!-- 配置默认的数据源 -->
</property>
</bean>
<!--创建sqlSessionFactory 开始 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--引用mybatis配置文件 -->
<property name="configLocation" value="classpath:config/mybatis-config.xml" />
<!--引用数据源配置 这里需要注意一下这里配置的是工具类-->
<property name="dataSource" ref="dynamicDataSource" />
<!--引用mapper配置文件 -->
<property name="mapperLocations" value="classpath:com/odon/mapper/*.xml" />
</bean>
<!--创建sqlSessionFactory 结束 -->
<!-- 自动装配dao 开始-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.odon.dao" />
</bean>
<!-- 自动装配dao 结束-->
<!-- 启用spring注解支持 -->
<context:annotation-config />
<!-- 自动扫描(自动注入) -->
<context:component-scan base-package="com.odon.service..*" />
<!-- 配置事务管理器 开始 -->
<bean id="txmanager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="c3p0DataSource1"></property>
</bean>
<!-- 配置事务管理器 结束 -->
<!--基本事务定义,使用transactionManager作事务管理,默认get*,find*方法的事务为read-only-->
<tx:advice id="txAdvice" transaction-manager="txmanager">
<tx:attributes>
<tx:method name="find*" read-only="true" />
<tx:method name="get*" read-only="true" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- 事物切点 以AspectJ方式 定义AOP
第一个*代表所有的返回值类型
第二个*代表所有的类
第三个*代表类所有方法
最后一个..代表所有的参数。
-->
<aop:config>
<aop:pointcut id="interceptorPointCuts" expression="execution(* com.odon.service.impl.*Impl.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />
</aop:config>
三、数据源切换工具类
package com.odon.datasource;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* @author zhangQiFeng
* @date:2017-11-1 下午3:48:38
* @version :
*
*/
public class DynamicDataSource extends AbstractRoutingDataSource{
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDbType();
}
}
四、数据源切换方法
package com.odon.datasource;
/**
* @author zhangQiFeng
* @date:2017-11-1 下午3:49:23
* @version :
*
*/
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 contextHolder.get();
}
//清除数据源,使用默认的数据源
public static void clearDbType() {
contextHolder.remove();
}
}
五、数据源变量类
package com.odon.datasource;
/**
* @author zhangQiFeng
* @date:2017-11-1 下午3:51:52
* @version :
*
*/
public class DataSourceType {
//数据源1
public static final String SOURCE_1 = "c3p0DataSource1";
//数据源2
public static final String SOURCE_2 = "c3p0DataSource2";
}
六、使用方法
package com.odon.service.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.odon.service.OAFileService;
import com.odon.dao.OAFileMapper;
import com.odon.datasource.DataSourceContextHolder;
import com.odon.datasource.DataSourceType;
/**
* @author zhangQiFeng
* @date:2017-11-1 下午5:01:17
* @version :
*
*/
@Service("OAFileService")
public class OAFileServiceImpl implements OAFileService{
@Autowired
private OAFileMapper OAFileMapper;
@Override
public List<Map<String,Object>> selectOAFileList() {
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
Map<String,Object> _map = new HashMap<String,Object>();
try {
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_2);
list = OAFileMapper.selectOAFileList(_map);
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}