Spring动态切换多数据源
来源:互联网 发布:pc端微信多开软件 编辑:程序博客网 时间:2024/06/06 02:35
声明:本文纯属个人随手笔记,如果对您有参考价值我十分开心,如果有存在错误,或者有更好的解决办法也麻烦您留言告诉我,大家共同成长,切勿恶言相。 欢迎加入资源共享QQ群:275343679,一起发现知识、了解知识、学习知识、分享知识。
个人网站:www.itlantian.top www.blueskyui.cn
=================================================================================
Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据。
Spring2.x以后的版本中采用Proxy模式,就是我们在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样就可以有效地将数据源选择逻辑从Client中分离出来。Client提供选择所需的上下文(因为这是Client所知道的),由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。
实现
- /**
- * 动态配置多数据源
- * 数据源的名称常量类
- *
- */
- public class DataSourceConst {
- public static final String TEST="test";
- public static final String USER="User";
- }
2. 建立一个获得和设置上下文环境的类,主要负责改变上下文数据源的名称:
- /**
- * 获得和设置上下文环境 主要负责改变上下文数据源的名称
- *
- */
- public class DataSourceContextHolder {
- 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();
- }
- }
3. 建立动态数据源类,注意,这个类必须继承AbstractRoutingDataSource,且实现方法determineCurrentLookupKey,该方法返回一个Object,一般是返回字符串:
- /**
- * 建立动态数据源
- *
- */
- public class DynamicDataSource extends AbstractRoutingDataSource {
- protected Object determineCurrentLookupKey() {
- // 在进行DAO操作前,通过上下文环境变量,获得数据源的类型
- return DataSourceContextHolder.getDataSourceType();
- }
- }
4. 编写spring的配置文件配置多个数据源
- <!-- 数据源相同的内容 -->
- <bean
- id="parentDataSource"
- class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property
- name="driverClassName"
- value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
- <property name="username" value="sa" />
- <property name="password" value="net2com" />
- </bean>
- <!-- start以下配置各个数据源的特性 -->
- <bean parent="parentDataSource" id="testDataSource">
- <propertynamepropertyname="url" value="jdbc:sqlserver://localhost:1433;databaseName=test" />
- </bean>
- <bean parent="parentDataSource" id="UserDataSource">
- <property
- name="url"
- value="jdbc:sqlserver://localhost:1433;databaseName=User" />
- </bean>
- <!-- end 配置各个数据源的特性 -->
5. 编写spring配置文件配置多数据源映射关系
- <bean class="com.xxxx.datasouce.DynamicDataSource" id="dataSource">
- <property name="targetDataSources">
- <map key-type="java.lang.String">
- <entry value-ref="testDataSource" key="test"></entry>
- <entry value-ref="UserDataSource" key="User"></entry>
- </map>
- </property>
- <property name="defaultTargetDataSource" ref="testDataSource" ></property>
- </bean>
在这个配置中第一个property属性配置目标数据源,<map key-type="java.lang.String">中的key-type必须要和静态键值对照类DataSourceConst中的值的类型相 同;<entry key="User" value-ref="userDataSource"/>中key的值必须要和静态键值对照类中的值相同,如果有多个值,可以配置多个< entry>标签。第二个property属性配置默认的数据源。
动态切换是数据源
- DataSourceContextHolder.setDataSourceType(DataSourceConst.TEST);
该方案的优势
该方案的缺点
- Spring多数据源的动态切换
- Spring动态切换多数据源解决方案
- Spring多数据源的动态切换
- Spring实现多数据源动态切换
- Spring动态切换多数据源解决方案
- Spring > 动态切换多数据源
- Spring动态切换多数据源解决方案
- Spring 多数据源动态切换
- spring框架---动态切换多数据源
- Spring动态切换多数据源
- spring boot 多数据源动态切换
- Spring动态切换多数据源解决方案
- Spring动态切换多数据源
- Spring动态切换多数据源解决方案
- Spring动态切换多数据源解决方案
- spring+hibernate多数据源+动态切换 事务 lazyload一应俱全
- proxool+spring多数据源动态切换配置问题
- Spring多数据源配置 及 动态额切换
- 欧拉路径 Play on Words
- ubuntu 禁止手机插入自动弹窗
- 推荐一篇讲解非线性最小二乘问题的博文
- java分页技术
- SylixOS移植Boa服务器
- Spring动态切换多数据源
- SVM多类划分问题 one vs rest 和 one vs one理解
- HashMap的工作原理
- Lcd水波纹现象排除
- MySQL使用中遇到的一个问题
- 访问localhost和127.0.0.1是否完全一样?
- caffe message学习之Datum
- Kotlin 接口
- leetcode 520. Detect Capital