`
fred_张浩
  • 浏览: 32214 次
  • 性别: 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
分享到:
评论

相关推荐

    springboot整合sharding-jdbc完整代码

    3. **定义数据源**:配置数据源,可以是单个数据库,也可以是多个读写分离的数据库集群。 4. **启动ShardingRule**:通过Spring Boot的自动配置功能,Sharding-JDBC会根据配置启动并生效。 5. **编写SQL**:由于...

    mybatis-3.4.1-all & mybatis-spring-1.3.0

    通过这个库,我们可以方便地在 Spring 应用中配置 MyBatis 数据源、SqlSessionFactory、MapperScannerConfigurer 等,使得 MyBatis 与 Spring 的协作变得更加无缝。 "mybatis-3.4.1.pdf"文件很可能是一个 MyBatis ...

    springboot适配多数据源,多类型数据库代码

    在Spring Boot中,多数据源意味着在一个应用程序中可以连接并操作多个不同的数据库。这通常通过Spring的DataSource Bean来实现,每个数据源都有自己的DataSource实例。在Spring Boot中,我们可以利用@...

    Springboot整合Druid与Mybatis的多数据源切换

    在现代企业级应用开发中,数据源管理是一个关键部分,特别是在多租户或者需要根据业务需求动态切换数据库的场景下。本教程将详细介绍如何在Spring Boot项目中整合Druid数据源池与Mybatis,实现多数据源切换的功能,...

    shardingJdbc功能代码

    ShardingJDBC支持动态数据源,这意味着在运行时可以根据业务条件选择合适的数据源。例如,可以通过读写分离、分片策略等来动态切换数据源,提高系统性能。 **3. SQL路由与执行** ShardingJDBC能够解析SQL语句,并...

    Spring面试题(2024最新版)-重点.docx

    - BeanFactory是Spring的基本容器,而ApplicationContext添加了更多的企业级服务,如消息源、国际化和AOP支持。 12. **Spring Beans** - Spring Beans是被Spring管理的对象,它们的定义包括属性、构造器、初始化...

    common-quartz.zip

    在IT行业中,SpringBoot是一个非常流行的轻量级Java框架,它简化了Spring应用程序的开发过程。而Quartz则是一个强大的、开源的作业调度框架,用于在Java应用中安排任务执行。"springboot整合quartz"这个主题就是关于...

    nacos+人大金仓数据源

    4. **服务引用数据源**:在应用中,通过Nacos提供的客户端API或Spring Boot的Nacos Discovery & Config Starter,引用创建的数据源,使应用能够透明地使用人大金仓数据库。 5. **动态配置**:当需要更改数据库配置...

    ssm学子商城资源文件-java

    该项目作为毕业设计的界面设计实例,提供了完整的源代码,是学习SSM集成开发的理想材料。 1. **Spring框架**:Spring是一个开源的应用框架,它提供了依赖注入(DI)和面向切面编程(AOP)等功能,用于简化Java应用...

    基于SSM+vue的小码创客教育教学资源库.zip

    描述与标题相同,"基于SSM+vue的小码创客教育教学资源库.zip",这表明提供的压缩包是一个完整的项目,可能包含了所有必要的源代码、配置文件以及可能的文档,以实现一个基于SSM和Vue技术的小码创客教育平台。...

    基于SpringBoot+mysql聊天微信小程序源码

    - **JDBC**:SpringBoot通过`spring-jdbc`模块与MySQL交互,可以使用JdbcTemplate或NamedParameterJdbcTemplate进行数据库操作。 - **MyBatis**:SpringBoot也可以与MyBatis集成,实现ORM(对象关系映射),通过...

    springboot整合lucence完整代码

    然后,配置SpringBoot的数据源和JPA属性,如数据库连接信息、实体扫描路径等,在`application.properties`中: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username...

    成绩管理系统-基础班(JAVA WEB).zip

    在StuAMS这个文件夹中,可能包含了项目的所有源代码,包括Java类、JSP页面、配置文件等。通过分析这些文件,你可以深入理解Java Web应用程序的结构和工作原理,同时也能学习到如何组织和管理一个实际的Web项目。 ...

    c3p0配置mysql8.0.21的3个jar包

    2. **创建C3P0数据源**:在Java代码或配置文件(如Spring的`application.properties`或`context.xml`)中定义C3P0数据源。 ```java import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0...

    ojdbc6.jar

    总的来说,将`ojdbc6.jar`集成到Spring Boot项目需要正确配置Maven依赖和数据源,同时,参考`Maven oracle jdbc.pdf`这样的官方文档可以提升你对Oracle JDBC驱动的使用技巧。在实际项目中,你可能还需要考虑数据库...

    ssm 所有jar包 lib.zip

    3. **MyBatis的配置文件**(`mybatis-config.xml`):包含MyBatis的全局配置,如数据源、事务管理器等。 4. **数据库连接配置**:如`dataSource.properties`,设置数据库连接参数。 5. **MyBatis的Mapper配置**:...

    JAVA网上购物系统

    通过深入分析这个源代码,我们可以学习到多个关键的IT知识点。 首先,核心编程语言——Java。Java以其跨平台性、面向对象和安全性等特点,在开发大型分布式应用如网上购物系统时被广泛采用。在本系统中,开发者可能...

    基于springboot+mybatis+mysql+html公交管理系统

    2. 配置SpringBoot应用,设置数据源、MyBatis的配置等。 3. 编写MyBatis的Mapper接口和XML文件,定义SQL操作。 4. 实现Service接口,处理业务逻辑,如添加、删除、更新公交信息,查询线路等。 5. 设计并编写HTML页面...

    springboot说明文档中文版

    SpringBoot是Java后端开发领域中的一个热门框架,由Pivotal团队开发,它简化了Spring应用程序的初始搭建以及开发过程。SpringBoot的核心理念是“约定优于配置”,它旨在通过提供预配置的“起步依赖”来减少项目初始...

Global site tag (gtag.js) - Google Analytics