今天遇见直接用spring处理多数据源问题,原来都是spring+hibernate/ibatis做的,现在做这个一下有点晕,网上也搜了下,基本上都是上面的框架结构,下面直接上代码,大部分都一样的:
applicationContext.xml 配置两个数据源dataSource1和dataSource2
<bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>${jdbc.driverClassName}</value>
</property>
<property name="jdbcUrl">
<value>${jdbc.url}</value>
</property>
<property name="user">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
<property name="unreturnedConnectionTimeout"><value>120</value></property>
<property name="debugUnreturnedConnectionStackTraces"><value>true</value></property>
</bean>
<bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>${jdbc.driverClassName2}</value>
</property>
<property name="jdbcUrl">
<value>${jdbc.url2}</value>
</property>
<property name="user">
<value>${jdbc.username2}</value>
</property>
<property name="password">
<value>${jdbc.password2}</value>
</property>
<property name="unreturnedConnectionTimeout"><value>120</value></property>
<property name="debugUnreturnedConnectionStackTraces"><value>true</value></property>
</bean>
jdbc.properties
#jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
#jdbc.url=jdbc\:oracle\:thin\:@192.168.199.128\:1521\:orcl\t
#jdbc.username=bob
#jdbc.password=bob
#jdbc.driverClassName2=oracle.jdbc.OracleDriver
#jdbc.url2=jdbc:oracle:thin:@localhost:1521:imagedb
#jdbc.username2=scott
#jdbc.password2=tiger
下面是配置jdbc配置文件和创建dynamicDataSource
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dynamicDataSource" class="com.harbortek.dynamic.DynamicDataSource" >
<!-- 通过key-value的形式来关联数据源 -->
<property name="targetDataSources">
<map>
<entry value-ref="dataSource1" key="dataSource1"></entry>
<entry value-ref="dataSource2" key="dataSource2"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource1" />
</bean>
设置jdbcTemplate
<!-- JdbcTemplate使用动态数据源的配置 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" abstract="false"
lazy-init="false" autowire="default" dependency-check="default">
<property name="dataSource">
<ref bean="dynamicDataSource" />
</property>
</bean>
DBContextHolder
public class DBContextHolder {
public static final String DATA_SOURCE_A = "dataSource1";
public static final String DATA_SOURCE_B = "dataSource2";
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();
}
}
DynamicDataSource
引用
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// TODO Auto-generated method stub
return DBContextHolder.getDBType();
}
}
Service 里处理如下
//VIP查询
public List queryCustomer(String phoneNumber, String idcardNumber) {
//在这里切换数据源就可以了
DBContextHolder.setDBType(DBContextHolder.DATA_SOURCE_A);
return webServiceJdbcDao.getVipCustomer(phoneNumber, idcardNumber);
}
在配置bean里要特别注意一点,就是autowire在多个datasource时要用byName,如果用byType的话spring不知道用那个提示有多个dataSource。配置如下
service.xml
<bean id="services" class="com.test.service.Services" autowire="byName" />
dao.xml
<bean id="webServiceJdbcDao" class="com.test.dao.WebServiceJdbcDao" autowire="byName">
ok 测试一下,数据保存成功。
分享到:
相关推荐
基于注解的Spring多数据源配置和使用 前一段时间研究了一下spring多数据源的配置和使用,为了后期从多个数据源拉取数据定时进行数据分析和报表统计做准备。由于之前做过的项目都是单数据源的,没有遇到这种场景,...
Spring多数据源配置_分布式数据 Tomcat服务器下的多数据源配置详情 一、环境及框架 Tomcat+spring+hibernate+jotm,还有就是struts、Oracle等 二、需求说明 系统里有2套不同网域的oracle数据库,之间的数据需要进行...
spring数据源配置
spring 动态多数据源配置代码,本项目是maven项目,里面有完成的配资好的spring多数据源代码和配置文件。
springboot多数据源配置
通过注解实现数据源的灵活切换
一个springboot的多数据配置,从mapper到controller完整的一个业务流程
主要介绍了spring多数据源配置实现方法,结合实例形式分析了spring多数据源配置相关操作技巧与使用注意事项,需要的朋友可以参考下
SSM(Spring+SpringMVC+MyBatis)多数据源配置框架,精简版
spring 配置多数据源
Spring Boot+Jpa多数据源配置Demo,可同时支持多种数据库,不同数据库,同时支持不同数据库的JdbcTemplate
搭建好eclipse版的ssm+maven+tk.mybatis+redis集成的demo。新手快速上手直接demo。完整高质量。整理不少时间分享没人赞好心疼吖吖。。。 或者直接看下面地址博客(由于太长所以博客不全) ...
阐述spring的数据源配置
项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此。本篇文章主要介绍了spring多数据源配置,有兴趣的可以了解一下。
通过简单的demo实现SpingBoot多数据源配置并动态切换多数据源
Spring Boot使用spring-data-jpa配置Mysql多数据源,可用版本
spring配置JNDI数据源
spring实现多数据源,可以在配置文件中添加