Spring+spring mvc+mybatis+多数据源切换

spring mvc+mybatis+多数据源切换 选取oracle,mysql作为例子切换数据源。oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换。

web.xml

Java代码  

  1. <context-param>
  2. <param-name>webAppRootKey</param-name>
  3. <param-value>trac</param-value>
  4. </context-param>
  5. <!-- Spring的log4j监听器 -->
  6. <listener>
  7. <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  8. </listener>
  9. <!-- 字符集 过滤器 -->
  10. <filter>
  11. <filter-name>CharacterEncodingFilter</filter-name>
  12. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  13. <init-param>
  14. <param-name>encoding</param-name>
  15. <param-value>utf8</param-value>
  16. </init-param>
  17. <init-param>
  18. <param-name>forceEncoding</param-name>
  19. <param-value>true</param-value>
  20. </init-param>
  21. </filter>
  22. <filter-mapping>
  23. <filter-name>CharacterEncodingFilter</filter-name>
  24. <url-pattern>/*</url-pattern>
  25. </filter-mapping>
  26. <!-- Spring view分发器 -->
  27. <servlet>
  28. <servlet-name>dispatcher</servlet-name>
  29. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  30. <init-param>
  31. <param-name>contextConfigLocation</param-name>
  32. <param-value>/WEB-INF/dispatcher.xml</param-value>
  33. </init-param>
  34. <load-on-startup>1</load-on-startup>
  35. </servlet>
  36. <servlet-mapping>
  37. <servlet-name>dispatcher</servlet-name>
  38. <url-pattern>*.action</url-pattern>
  39. </servlet-mapping>
  40. <listener>
  41. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  42. </listener>

dispatcher.xml

Java代码  

  1. <mvc:annotation-driven />
  2. <context:component-scan base-package="com.trac" />
  3. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
  4. <!-- freemarker config -->
  5. <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  6. <property name="templateLoaderPath" value="/WEB-INF/freemarker/" />
  7. <property name="freemarkerVariables">
  8. <map>
  9. <entry key="xml_escape" value-ref="fmXmlEscape" />
  10. </map>
  11. </property>
  12. <property name="freemarkerSettings">
  13. <props>
  14. <prop key="defaultEncoding">UTF-8</prop>
  15. </props>
  16. </property>
  17. </bean>
  18. <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />
  19. <!-- View resolvers can also be configured with ResourceBundles or XML files.
  20. If you need different view resolving based on Locale, you have to use the
  21. resource bundle resolver. -->
  22. <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
  23. <property name="exposeRequestAttributes" value="true" />
  24. <property name="exposeSessionAttributes" value="true" />
  25. <property name="exposeSpringMacroHelpers" value="true" />
  26. <property name="contentType" value="text/html;charset=UTF-8" />
  27. <property name="cache" value="true" />
  28. <property name="prefix" value="" />
  29. <property name="suffix" value=".ftl" />
  30. </bean>

applicationContext.xml

Java代码  

  1. <bean id="parentDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  2. </bean>
  3. <bean id="mySqlDataSource" parent="parentDataSource">
  4. <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
  5. <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
  6. <property name="username" value="root"></property>
  7. <property name="password" value="root"></property>
  8. </bean>
  9. <bean id="oracleDataSource" parent="parentDataSource">
  10. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
  11. <property name="url" value="jdbc:oracle:thin:@10.16.17.40:1531:addb"></property>
  12. <property name="username" value="trac"></property>
  13. <property name="password" value="trac"></property>
  14. </bean>
  15. <bean id="dataSource" class="com.trac.dao.datasource.DataSources">
  16. <property name="targetDataSources">
  17. <map key-type="java.lang.String">
  18. <entry value-ref="mySqlDataSource" key="MYSQL"></entry>
  19. <entry value-ref="oracleDataSource" key="ORACLE"></entry>
  20. </map>
  21. </property>
  22. <property name="defaultTargetDataSource" ref="oracleDataSource"></property>
  23. </bean>
  24. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  25. <property name="dataSource" ref="dataSource" />
  26. </bean>
  27. <!-- 创建SqlSessionFactory,同时指定数据源和mapper -->
  28. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  29. <property name="dataSource" ref="dataSource" />
  30. <property name="mapperLocations" value="classpath*:com/trac/ibatis/dbcp/*.xml" />
  31. </bean>
  32. <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  33. <constructor-arg index="0" ref="sqlSessionFactory" />
  34. </bean>
  35. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  36. <property name="basePackage" value="com.trac.dao" />
  37. </bean>

配置 parentDataSource 的父bean.再配置多个数据源继承这个父bean,对driverClass,url,username,password,等数据源连接参数进行各自的重写。例如 mySqlDataSource ,在 DataSources bean中注入所有要切换的数据源,并且设置默认的数据源。

DataSourceInstances.java

Java代码  

  1. public class DataSourceInstances{
  2. public static final String MYSQL="MYSQL";
  3. public static final String ORACLE="ORACLE";
  4. }
  5. 定义数据源的标识, 和applicationContext.xml中 DataSources 的 targetDataSources 的key对应

DataSourceSwitch.java

Java代码  

  1. public class DataSourceSwitch{
  2. private static final ThreadLocal contextHolder=new ThreadLocal();
  3. public static void setDataSourceType(String dataSourceType){
  4. contextHolder.set(dataSourceType);
  5. }
  6. public static String getDataSourceType(){
  7. return (String) contextHolder.get();
  8. }
  9. public static void clearDataSourceType(){
  10. contextHolder.remove();
  11. }
  12. }

DataSources.java

Java代码  

  1. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  2. public class DataSources extends AbstractRoutingDataSource{
  3. @Override
  4. protected Object determineCurrentLookupKey() {
  5. return DataSourceSwitch.getDataSourceType();
  6. }
  7. }
  8. 配置于applicationContext 中,线程局部变量ThreadLocal contextHolder 保存当前需要的数据源类型,当 DataSourceSwitch.setDataSourceType(DataSourceInstances.XXX) 保存当前需要的数据源类型的时候,DataSources 会从当前线程中查找线程变量的数据源类型,从而决定使用何种数据源

TestAction.java

Java代码  

  1. @Controller
  2. @SuppressWarnings("unused")
  3. public class TestAction {
  4. @Autowired
  5. TestMapper testMapper;
  6. @RequestMapping("/test.action")
  7. public ModelAndView test(
  8. HttpServletRequest request,
  9. HttpServletResponse resp){
  10. ModelAndView model = new ModelAndView("test");
  11. model.addObject("test1", "这是一个测试,获取默认数据连接MYSQL:"+testMapper.test());
  12. DataSourceSwitch.setDataSourceType(DataSourceInstances.ORACLE);
  13. model.addObject("test2", "这是一个测试,获取数据连接ORACLE:"+testMapper.test());
  14. DataSourceSwitch.setDataSourceType(DataSourceInstances.MYSQL);
  15. model.addObject("test3", "这是一个测试,获取数据连接MYSQL:"+testMapper.test());
  16. return model;
  17. }
  18. }

《源码地址下载

》》源码地址获取

springmvc + mybatis整合详细,及遇到的问题请参看以下资料:

参考资料:

http://www.springmvc,net/detail/6074493.html

http://my.spring.net/wangbiglei/blog/489583

http://my.springmvc.net/wangbiglei/blog/489604

时间: 2024-10-13 08:09:02

Spring+spring mvc+mybatis+多数据源切换的相关文章

spring mvc+mybatis+多数据源切换

spring mvc+mybatis+多数据源切换 选取oracle,mysql作为例子切换数据源.oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换. web.xml Java代码   <context-param> <param-name>webAppRootKey</param-name> <param-value>trac</param-value> </context-param> &l

spring boot+mybatis 多数据源切换

由于公司业务划分了多个数据库,开发一个项目会同事调用多个库,经过学习我们采用了注解+aop的方式实现的 1.首先定义一个注解类 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface TargetDataSource { String value();//此处接收的是数据源的名称 } 2.然后建一个配置类,这个在项目启动时会加载数据源,一开始采用了HikariCP,查资料说是最快性能最好的

spring+mybatis 多数据源切换

DbContextHolder public class DbContextHolder { //线程安全的ThreadLocal private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setDbType(String dbType) { contextHolder.set(dbType); } public static Stri

spring+mybatis多数据源动态切换

spring mvc+mybatis+多数据源切换 选取oracle,mysql作为例子切换数据源.oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换. web.xml <context-param> <param-name>webAppRootKey</param-name> <param-value>trac</param-value> </context-param> <!-- Spr

Spring Boot 整合 Mybatis 实现 Druid 多数据源详解

一.多数据源的应用场景 目前,业界流行的数据操作框架是 Mybatis,那 Druid 是什么呢? Druid 是 Java 的数据库连接池组件.Druid 能够提供强大的监控和扩展功能.比如可以监控 SQL ,在监控业务可以查询慢查询 SQL 列表等.Druid 核心主要包括三部分: 1. DruidDriver 代理 Driver,能够提供基于 Filter-Chain 模式的插件体系. 2. DruidDataSource 高效可管理的数据库连接池 3. SQLParser 当业务数据量达

Spring Profile和Mybatis进行多个数据源(H2和Mysql)的切换

总结: 最近在做WebMagic的后台,遇到一个问题:后台用到了数据库,本来理想情况下是用Mysql,但是为了做到开箱即用,也整合了一个嵌入式数据库H2.这里面就有个问题了,如何用一套代码,提供对Mysql和H2两种方案的支持?博主收集了一些资料,也调试了很久,终于找到一套可行方案,记录下来.代码贴的有点多,主要是为了以后方便自己查找. H2的使用 H2是一个嵌入式,纯Java实现的数据库,它各方面都要好于Java的sqlitejdbc.它可以使用内存模式,也可以使用磁盘模式.具体使用可以看攻略

java企业架构 spring mvc +mybatis + KafKa+Flume+Zookeep

开发工具 1.Eclipse IDE:采用Maven项目管理,模块化. 2.代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改查):单表.一对多.树结构.生成后的代码如果不需要注意美观程度,生成后即可用. 技术选型(只列了一部分技术) 1.后端 服务框架:Dubbo.zookeeper.Rest服务 缓存:Redis.ehcache 消息中间件:ActiveMQ 负载均衡:Nginx 分布式文件:FastDFS 数据库连接池:Alibaba Druid 1.0 核心框

spring mvc +mybatis + KafKa+Flume+Zookeeper分布式架构

开发工具 1.Eclipse IDE:采用Maven项目管理,模块化. 2.代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改查):单表.一对多.树结构.生成后的代码如果不需要注意美观程度,生成后即可用. 技术选型(只列了一部分技术) 1.后端 服务框架:Dubbo.zookeeper.Rest服务 缓存:Redis.ehcache 消息中间件:ActiveMQ 负载均衡:Nginx 分布式文件:FastDFS 数据库连接池:Alibaba Druid 1.0 核心框

基于Spring + Spring MVC + Mybatis + shiro 高性能web构建

一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详细的配置,详细的注释,看起来应该很容易懂. 用最合适的技术去实现,并不断追求最佳实践.这就是架构之道. 希望这篇文章能给你们带来一些帮助,同时希望你们可以为这个项目贡献你的想法. 源码地址:https://github.com/starzou/quick4j 点击打开 看我们的项目结构: 是一个典型