`
fred_张浩
  • 浏览: 31211 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

小码农的代码(三)----------SpringJDBC多数据源应用

阅读更多
前面项目中基础的SpringJdbc的配置说明已经简单总结,接下去就是项目中使用到多数据源这个问题了。
对于多数据源的实现,我的想法是首先配置多个数据源,然后在数据操作时通过切换数据源的方式来达到目的,那么如何在保持jdbctmplate只有一个的时候进行数据源切换呢,我考虑到可以起一个线程来实现在操作中的自由切换。
首先配置3个数据源,为方便测试就直接在本机新建了三个mysql数据库(实际过程中是使用mysql与多个sql server)来写测试用例
<bean id="defaultDateSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="${jdbc.driverClass}" />
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}" />
		<property name="user" value="${jdbc.user}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
<bean id="dataSource01" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="${jdbc.driverClass01}" />
		<property name="jdbcUrl" value="${jdbc.jdbcUrl01}" />
		<property name="user" value="${jdbc.user01}" />
		<property name="password" value="${jdbc.password01}" />
	</bean>
<bean id="dataSource02" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="${jdbc.driverClass02}" />
		<property name="jdbcUrl" value="${jdbc.jdbcUrl02}" />
		<property name="user" value="${jdbc.user02}" />
		<property name="password" value="${jdbc.password02}" />
	</bean>
习惯使用c3p0数据库连接池,下次尝试试用下阿里DruidDataSource,据说功能更加强大,但是一直没有使用过-,-跑题了 新建三个数据库还是只有一个表user(id,name,age;id逐渐自增)。
然后新建一个单例的线程ThreadLocal(这是一个很好用的东西,下次专门写个测试用例总结下,做项目总是能够不断的引出新的东西,这点真的很好),能够set/get/remove数据源
public class DatabaseContextHolder {
	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

	public static void setDateBaseType(String database) {
		Assert.notNull(database, "DatabaseType cannot be null");
		contextHolder.set(database);
	}

	public static String getDateBaseType() {
		return contextHolder.get();
	}

	public static void clearDatabaseType() {
		contextHolder.remove();
	}
}

接下来是Spring支持多数据源切换的核心类AbstractRoutingDataSource,新建一个继承这个抽象类的子类DynamicDataSource,并实现determineCurrentLookupKey方法(抽象类与接口的相似性
public class DynamicDataSource extends AbstractRoutingDataSource {

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

继续回到spring的配置文件,通过DynamicDataSource管理多数据源,并设置默认的数据源
<bean id="dynamicDataSource" class="com.zh.demo.base.tool.DynamicDataSource">
		<property name="targetDataSources">
			<map key-type="java.lang.String">
				<entry value-ref="defaultDateSource" key="defaultDateSource"></entry>
				<entry value-ref="dataSource01" key="dataSource01"></entry>
				<entry value-ref="dataSource02" key="dataSource02"></entry>
			</map>
		</property>
		<property name="defaultTargetDataSource" ref="defaultDateSource">
		</property>
	</bean>
当然jdbctemplate中指向的数据源也需要切换成它
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dynamicDataSource" />
最后新建一个DataBaseType类与配置中的数据源名称相关联
public class DataBaseType {
	public static final String DATABASE_DEFAULT = "defaultDateSource";
	public static final String DATABASE_01 = "dataSource01";
	public static final String DATABASE_02 = "dataSource02";
}
这样就可以写测试用例了。
简单的新增语句在测试类中进行数据库切换
public void test(){
		userService.saveUser(("insert into user (name,age)values('张三',13)");
		DatabaseContextHolder.clearDatabaseType();
		DatabaseContextHolder.setDateBaseType(DataBaseType.DATABASE_01);
		userService.saveUser("insert into user (name,age)values('张三',13)");
		DatabaseContextHolder.clearDatabaseType();
		DatabaseContextHolder.setDateBaseType(DataBaseType.DATABASE_02);
		userService.saveUser("insert into user (name,age)values('张三',13)");
	}
结果是三个数据库中都插入了数据,多数据源配置成功。
注意点与总结:
一、实际项目中发现一个问题,就是在同一个事务中不能够进行数据库切换,该问题暂时未解决,有方法的朋友可以的话烦请指导下。
二、在使用过程中扩展想到能否通过请求来动态的切换数据源,目前考虑到还是需要在请求中带参数来让后台识别进行数据库切换,不知道有没有更好的方法。
以下内容如存在错误之处烦请斧正以达到共同进步的效果,多谢。
3
1
分享到:
评论

相关推荐

    JavaEE源代码 spring-jdbc

    JavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源...

    开发工具 spring-jdbc-4.3.6.RELEASE

    开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6....

    spring-jdbc-5.3.15-API文档-中文版.zip

    赠送源代码:spring-jdbc-5.3.15-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.3.15.pom; 包含翻译后的API文档:spring-jdbc-5.3.15-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework:...

    mysql-jdbc-Spring源代码分析

    mysql-jdbc-Spring源代码分析 mysql-jdbc-Spring源代码分析 mysql-jdbc-Spring源代码分析

    spring-jdbc-5.3.10-API文档-中文版.zip

    赠送源代码:spring-jdbc-5.3.10-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.3.10.pom; 包含翻译后的API文档:spring-jdbc-5.3.10-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework:...

    spring-jdbc-5.2.7.RELEASE-API文档-中文版.zip

    赠送源代码:spring-jdbc-5.2.7.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.2.7.RELEASE.pom; 包含翻译后的API文档:spring-jdbc-5.2.7.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:...

    spring-jdbc-5.2.0.RELEASE-API文档-中文版.zip

    赠送源代码:spring-jdbc-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.2.0.RELEASE.pom; 包含翻译后的API文档:spring-jdbc-5.2.0.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:...

    spring-jdbc-5.0.10.RELEASE-API文档-中文版.zip

    赠送源代码:spring-jdbc-5.0.10.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.0.10.RELEASE.pom; 包含翻译后的API文档:spring-jdbc-5.0.10.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven...

    spring-jdbc-5.3.7-API文档-中英对照版.zip

    赠送源代码:spring-jdbc-5.3.7-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.3.7.pom; 包含翻译后的API文档:spring-jdbc-5.3.7-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.spring...

    spring-jdbc-5.3.15-API文档-中英对照版.zip

    赠送源代码:spring-jdbc-5.3.15-sources.jar 包含翻译后的API文档:spring-jdbc-5.3.15-javadoc-API文档-中文(简体)-英语-对照版.zip 对应Maven信息:groupId:org.springframework,artifactId:spring-jdbc,...

    spring-jdbc-4.3.20.RELEASE-API文档-中英对照版.zip

    赠送源代码:spring-jdbc-4.3.20.RELEASE-sources.jar 包含翻译后的API文档:spring-jdbc-4.3.20.RELEASE-javadoc-API文档-中文(简体)-英语-对照版.zip 对应Maven信息:groupId:org.springframework,artifactId:...

    spring-jdbc-5.0.8.RELEASE-API文档-中英对照版.zip

    赠送源代码:spring-jdbc-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.0.8.RELEASE.pom; 包含翻译后的API文档:spring-jdbc-5.0.8.RELEASE-javadoc-API文档-中文(简体)-英语-对照版.zip; ...

    spring-jdbc-3.2.5.RELEASE.jar

    spring-jdbc-3.2.5.RELEASE.jar spring-jdbc-3.2.5.RELEASE.jar

    spring-jdbc-5.3.7-API文档-中文版.zip

    赠送源代码:spring-jdbc-5.3.7-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.3.7.pom; 包含翻译后的API文档:spring-jdbc-5.3.7-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework:...

    spring-jdbc-4.0.0.RELEASE-sources.jar

    spring-jdbc-4.0.0.RELEASE-sources.jar

    spring-jdbc-5.1.5.RELEASE.jar

    spring-jdbc-5.1.5.RELEASE.jar

    spring-jdbc-4.3.6.RELEASE.jar

    spring-jdbc-4.3.6.RELEASE.jar

    spring-jdbc-4.3.9.RELEASE

    spring-jdbc连接jar包,spring对于jdbc技术的封装,spring容器组成部分

    spring-jdbc-5.2.6.RELEASE.jar

    spring-jdbc-5.2.6.RELEASE.jar

Global site tag (gtag.js) - Google Analytics