博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring mvc+mybatis+多数据源切换
阅读量:5160 次
发布时间:2019-06-13

本文共 4513 字,大约阅读时间需要 15 分钟。

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

web.xml

webAppRootKey
trac
org.springframework.web.util.Log4jConfigListener
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf8
forceEncoding
true
CharacterEncodingFilter
/*
dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/dispatcher.xml
1
dispatcher
*.action
org.springframework.web.context.ContextLoaderListener

dispatcher.xml

UTF-8

applicationContext.xml

配置 parentDataSource 的父bean。再配置多个数据源继承这个父bean,对driverClass,url,username,password等数据源连接参数进行各自的重写。

例如:mySqlDataSource,在DataSources bean中注入所有要切换的数据源,并且设置默认的数据源。

DataSourceInstances.java

public class DataSourceInstances{      public static final String MYSQL="MYSQL";      public static final String ORACLE="ORACLE";  }

定义数据源的标识, 和applicationContext.xml中 DataSources 的 targetDataSources 的key对应。

DataSourceSwitch.java

public class DataSourceSwitch{      private static final ThreadLocal contextHolder=new ThreadLocal();            public static void setDataSourceType(String dataSourceType){          contextHolder.set(dataSourceType);      }            public static String getDataSourceType(){          return (String) contextHolder.get();      }            public static void clearDataSourceType(){          contextHolder.remove();      }  }

DataSources.java

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;    public class DataSources extends AbstractRoutingDataSource{        @Override      protected Object determineCurrentLookupKey() {          return DataSourceSwitch.getDataSourceType();      }    }

配置于applicationContext 中,线程局部变量ThreadLocal contextHolder 保存当前需要的数据源类型,当 DataSourceSwitch.setDataSourceType(DataSourceInstances.XXX) 保存当前需要的数据源类型的时候,DataSources 会从当前线程中查找线程变量的数据源类型,从而决定使用何种数据源。

TestAction.java

@Controller  @SuppressWarnings("unused")  public class TestAction {  @Autowired      TestMapper testMapper;       @RequestMapping("/test.action")      public ModelAndView test(              HttpServletRequest request,              HttpServletResponse resp){          ModelAndView model = new ModelAndView("test");          model.addObject("test1", "这是一个测试,获取默认数据连接MYSQL:"+testMapper.test());          DataSourceSwitch.setDataSourceType(DataSourceInstances.ORACLE);          model.addObject("test2", "这是一个测试,获取数据连接ORACLE:"+testMapper.test());          DataSourceSwitch.setDataSourceType(DataSourceInstances.MYSQL);          model.addObject("test3", "这是一个测试,获取数据连接MYSQL:"+testMapper.test());          return model;      }  }

本文转自:http://leoyy.iteye.com/blog/1624704

转载于:https://www.cnblogs.com/dreammyle/p/5392305.html

你可能感兴趣的文章
js深度克隆对象、数组
查看>>
socket阻塞与非阻塞,同步与异步
查看>>
团队工作第二天
查看>>
System类
查看>>
tableView
查看>>
Happy Great BG-卡精度
查看>>
Xamarin Visual Studio不识别JDK路径
查看>>
菜鸟“抄程序”之道
查看>>
Ubuntu下关闭防火墙
查看>>
TCP/IP 邮件的原理
查看>>
原型设计工具
查看>>
windows下的C++ socket服务器(4)
查看>>
css3 2d转换3d转换以及动画的知识点汇总
查看>>
【Java】使用Eclipse进行远程调试,Linux下开启远程调试
查看>>
对Vue为什么不支持IE8的解释之一
查看>>
计算机改名导致数据库链接的诡异问题
查看>>
Java8内存模型—永久代(PermGen)和元空间(Metaspace)(转)
查看>>
ObjectiveC基础教程(第2版)
查看>>
centos 引导盘
查看>>
Notes of Daily Scrum Meeting(12.8)
查看>>