1. 创建class----SourceType.java
public enum SourceType {
suning,
english,
gehualily
}
2. 创建class ---DynamicDataSource.java
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource{
protected Object determineCurrentLookupKey() {
return JdbcContextHolder.getJdbcType();
}
}
3. 创建class ----JdbcContextHolder.java
public class JdbcContextHolder {
private static final ThreadLocal<SourceType> contextHolder = new ThreadLocal<SourceType>();
public static void setJdbcType(SourceType jdbcType) {
contextHolder.set(jdbcType);
}
/*
* public static String getJdbcType() { return (String) contextHolder.get(); }
*/
//默认的数据源
public static SourceType getJdbcType() {
SourceType str = (SourceType) contextHolder.get();
if(str==null){
str=SourceType.english;
}
return str;
}
public static void clearJdbcType() {
contextHolder.remove();
}
}
4. spring.xml:
<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<!--以下为数据源,可根据需求添加多个-->
<bean id="SuNingDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="driverUrl" value="jdbc:mysql://localhost:3306/suning" />
<property name="user" value="root" />
<property name="password" value="123" />
</bean>
<bean id="EnglishataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="driverUrl" value="jdbc:mysql://localhost:3306/lilye" />
<property name="user" value="root" />
<property name="password" value="123" />
</bean>
<bean id="GHLilyDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="driverUrl" value="jdbc:mysql://192.168.1.1:3306/test" />
<property name="user" value="root" />
<property name="password" value="123" />
</bean>
<!-- DynamicDataSource为上面的类,sourceType为枚举类,key为枚举的值,对应不同的数据源-->
<bean id="dataSource" class="cn.com.fly.util.DynamicDataSource">
<property name="targetDataSources">
<map key-type="cn.com.fly.util.SourceType">
<entry key="suning" value-ref="SuNingDataSource"/>
<entry key="english" value-ref="EnglishDataSource"/>
<entry key="gehualily" value-ref="GHLilyDataSource"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="LilyEnglishDataSource"/>
</bean>
<!-- end defaultTargetDataSource为默认数据库-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="cn.com.fly.domain" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</prop>
<prop key="connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hiberante.format_sql">true</prop>
<prop key="hibernate.connection.release_mode">after_statement</prop>
<prop key="hibernate.connection.autocommit">false</prop>
</props>
</property>
</bean>
<bean id="hibernateTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="hibernateTransactionManager" />
<!-- 自动扫描的包名 -->
<context:component-scan base-package="cn.com.abc" />
<!-- 默认的注解映射的支持 -->
<mvc:annotation-driven />
<!-- 视图解释类 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 定时任务 -->
<task:annotation-driven/>
<!--
拦截器 <mvc:interceptors> <bean class="cn.com.fly.MyInteceptor" />
</mvc:interceptors>
-->
<!-- 对静态资源文件的访问
<mvc:default-servlet-handler/> -->
</beans>
5.应用案例:
在使用方法之前,加上
JdbcContextHolder.setJdbcType(SourceType.english);
若不用枚举类,key值可以直接用字符串。
实体类和表都不用添加什么别的代码,经过测试,每个方法只可切换一次数据库。
分享到:
相关推荐
本案例中,"springboot+druid+mybatis多数据源动态切换"主要涉及以下几个核心知识点: 1. **SpringBoot多数据源配置**:SpringBoot通过@ConfigurationProperties注解可以从配置文件中读取数据源的相关信息,如URL、...
如`Spring Boot中使用多数据库 - JDBC.url`、`spring-boot jpa 配置两个数据源 - CSDN博客.url`以及`spring boot(七):springboot+mybatis多数据源最简解决方案 - 纯洁的微笑 - 博客园.url`,了解更多详细信息和实践...
本文将详细讲解如何将这两个框架整合,实现多数据源配置,并利用AOP(面向切面编程)进行动态切换,以达到数据库读写分离的目的。 **SpringMVC简介** SpringMVC是Spring框架的一部分,它是一个基于模型-视图-控制器...
Struts 2、Spring 2、JPA 和 AJAX 是企业级 Web 应用开发中的四大核心技术,它们在构建高效、可扩展的系统中扮演着重要角色。本示例结合这四种技术,提供了一个完整的应用实例,帮助开发者了解如何将它们整合在一起...
它涉及到了数据库设计、前端开发、后端服务架构等多个方面,是学习微服务架构和实战项目开发的良好案例。通过深入学习和分析这个系统,开发者可以掌握如何运用SpringCloud构建大规模、高可用的云原生应用。
2. **AOP(面向切面编程)**:Spring Boot中的AOP允许我们在不修改业务代码的情况下添加横切关注点,例如日志记录、事务管理或在此案例中的数据源切换。 3. **自定义注解**:自定义注解可以让我们以声明式的方式...
为了解决上述问题,本文将介绍一种利用Spring框架结合Decorator设计模式来实现多数据源动态切换的方法。 #### 解决方案设计 ##### 1. 设计思路 - **多数据源配置**:在Spring的`applicationContext`中配置所有的...
在Spring Boot应用中,多数据源配置是一项关键的技术,它允许我们连接并操作多个数据库,例如MySQL和SQL Server。在本场景中,我们将探讨如何在Spring Boot中设置和管理这样的多数据源配置。 首先,我们需要了解`...
### JavaEE多层架构Struts2+Spring3+Hibernate3+Ajax的整合 #### 概述 随着软件开发技术的不断进步,构建可复用、易于扩展并经过良好测试的软件组件变得尤为重要。在此背景下,Struts、Spring 和 Hibernate 这三大...
此外,使用Spring的AOP(面向切面编程)和Spring Cloud Data Flow等工具也可以实现数据源的动态切换。 接着,我们来看分布式事务的处理。JTA是Java平台中用于管理跨系统事务的标准API,它允许在分布式环境中协调多...
总结来说,`sqlSessionFactory`方式的多数据源案例代码实现了在MyBatis中灵活地管理和切换多个数据库连接,这在大型分布式系统中尤为重要,能有效提高系统的扩展性和可靠性。通过理解和实践这样的案例,开发者可以更...
总的来说,"java多数据源案例使用项目"展示了如何通过Java和Spring框架实现跨数据库的业务代码复用。它利用动态数据源技术解决了两个子公司的员工信息管理问题,降低了系统复杂性和开发成本。通过深入理解这一技术,...
在Spring JDBC模块中,RoutingDataSource是一个动态数据源,它可以根据一定的规则(比如基于数据库连接池的名字、运行时环境等)来决定使用哪个具体的数据源。这种方式允许我们在应用程序中灵活地切换或组合不同的...
"TestSpringIbatis"则可能是Spring与Ibatis集成的测试案例,展示了如何配置Ibatis的SqlSessionFactory和Mapper接口,以及如何在Spring中调用Ibatis的SQL查询。 集成Spring、Hibernate和Ibatis的过程通常包括以下...
当点击Tree中的“查询订单”或“创建订单”节点时,页面会动态添加或切换到相应的标签页,如`searchorder.jsp`(订单查询列表页)和`createorder.jsp`(创建订单页)。 总的来说,这个案例展示了如何在一个Java Web...
这只是一个基础的小案例,实际项目中可能还需要考虑更多因素,比如数据源的负载均衡、动态切换等高级功能。通过深入学习Spring Boot的自动配置机制和AOP原理,你可以进一步优化和扩展多数据源的实现。
这个"struts2+hibernate3+spring2.5的完整框架"是一个典型的MVC(Model-View-Controller)架构,用于构建动态、数据驱动的Web应用程序。 Struts2是Action导向的框架,负责控制应用程序的流程。它通过定义Action类来...
本案例聚焦于使用MySQL数据库来存储商品图片,这是很多在线商店常见的做法。MySQL是一个流行的关系型数据库管理系统,因其高效、稳定和易于使用而备受青睐。在这个事例中,我们将深入探讨如何使用BLOB(Binary Large...