- 浏览: 115320 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
ron.luo:
干货,必须得顶。
JAXB使用经验总结 -
csdn_zuoqiang:
能否看下DWR的配置情况?谢谢
结合webservice实现dwr推送 -
友友水:
。。。。不好意思,无心之失,删不掉前一条评论
JAXB使用经验总结 -
友友水:
[/flash][/flash][/flash][/flash ...
JAXB使用经验总结 -
lihong11:
大哥,加加注释好不?看不懂唉
小玩dwr实现服务器推送
背景: 目前基于连接了mobile库 从库的 项目(spring+mybatis), 需要将从库配置调整为多个直连数据源, 即 配置多个从库的需要
下面以配置两个mobile从库数据源为例,进行配置示例:
数据源配置文件appContext-jdbc.xml
2. 动态数据源工具类 com.yy.sv.base.db.dynamic.DynamicRoutingDataSource
使用该工具类需要依赖jar
DynamicRoutingDataSource内部实现了多个数据源间的负载均衡机制(从数据源的bean id名并不作为均衡机制中的key,可以随意命名),想了解的可以读下源码
3. 基于目前默认连接的是从库的配置, 业务代码在需要切换至主库进行写操作时,代码如下:
4. 之前代码中已经使用了如下代码的可以这样切换:
将DynamicDataSourceHolder的setDataSourceKey以及clearDataSourceMapKey方法的实现调整为:
这样业务代码中进行主从切换的代码就不需要改动, 减少改动和入侵
5. 如果项目中没有使用到写主库数据源, 那么可以这样配置(紫色部分),因为没有进行过主从切换, 所以用从库数据源顶替主写数据源:
<!-- mobile 动态数据源配置,目前是1主2从, 默认连接从库 -->
下面以配置两个mobile从库数据源为例,进行配置示例:
数据源配置文件appContext-jdbc.xml
<!-- mobile 从库 --> <bean id="mobileReadDataSource0" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="maxPoolSize" value="200" /> <property name="minPoolSize" value="50" /> <property name="idleConnectionTestPeriod" value="60" /> <property name="autoCommitOnClose" value="true" /> <property name="initialPoolSize" value="10" /> <property name="jdbcUrl" value="jdbc:mysql://${jdbc.mobile.host}:${jdbc.mobile.port}/${jdbc.mobile.dbname}?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true" /> <property name="user" value="${jdbc.mobile.username}" /> <property name="checkoutTimeout" value="5000" /> <property name="password" value="${jdbc.mobile.password}" /> <property name="acquireRetryAttempts" value="30" /> <property name="acquireRetryDelay" value="1000" /> <property name="breakAfterAcquireFailure" value="false" /> <property name="driverClass" value="com.mysql.jdbc.Driver" /> </bean> <!-- mobile 从库 --> <bean id="mobileReadDataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="maxPoolSize" value="200" /> <property name="minPoolSize" value="50" /> <property name="idleConnectionTestPeriod" value="60" /> <property name="autoCommitOnClose" value="true" /> <property name="initialPoolSize" value="10" /> <property name="jdbcUrl" value="jdbc:mysql://${jdbc.mobile.host}:${jdbc.mobile.port}/${jdbc.mobile.dbname}?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true" /> <property name="user" value="${jdbc.mobile.username}" /> <property name="checkoutTimeout" value="5000" /> <property name="password" value="${jdbc.mobile.password}" /> <property name="acquireRetryAttempts" value="30" /> <property name="acquireRetryDelay" value="1000" /> <property name="breakAfterAcquireFailure" value="false" /> <property name="driverClass" value="com.mysql.jdbc.Driver" /> </bean> <!-- mobile 写主库 --> <bean id="mobileWriteDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="maxPoolSize" value="200" /> <property name="minPoolSize" value="50" /> <property name="idleConnectionTestPeriod" value="60" /> <property name="autoCommitOnClose" value="true" /> <property name="initialPoolSize" value="10" /> <property name="jdbcUrl" value="jdbc:mysql://${jdbc.write.mobile.host}:${jdbc.write.mobile.port}/${jdbc.write.mobile.dbname}?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true" /> <property name="user" value="${jdbc.write.mobile.username}" /> <property name="checkoutTimeout" value="5000" /> <property name="password" value="${jdbc.write.mobile.password}" /> <property name="acquireRetryAttempts" value="30" /> <property name="acquireRetryDelay" value="1000" /> <property name="breakAfterAcquireFailure" value="false" /> <property name="driverClass" value="com.mysql.jdbc.Driver" /> </bean> <!-- mobile 动态数据源配置,目前是1主2从, 默认连接从库 --> <bean id="mobileDataSource" class="com.yy.sv.base.db.dynamic.DynamicRoutingDataSource"> <property name="master" ref="mobileWriteDataSource" /> <property name="slaves"> <list> <ref bean="mobileReadDataSource0" /> <ref bean="mobileReadDataSource1" /> </list> </property> <property name="defaultTargetDataSource" ref="mobileReadDataSource0"/> <!-- <property name="maxFailCount" value="5" /> --> <!--可选配置,设置从库检查maxFailCount次失败后(默认5次),回调处理接口--> <!-- <property name="HandleFailedPattern" ref="handleFailedPattern" /> --><!--可选配置,业务方实现回调处理接口--> </bean>
2. 动态数据源工具类 com.yy.sv.base.db.dynamic.DynamicRoutingDataSource
使用该工具类需要依赖jar
<dependency> <groupId>com.yy.cs</groupId> <artifactId>sv-base</artifactId> <version>1.2.1</version> </dependency>
DynamicRoutingDataSource内部实现了多个数据源间的负载均衡机制(从数据源的bean id名并不作为均衡机制中的key,可以随意命名),想了解的可以读下源码
3. 基于目前默认连接的是从库的配置, 业务代码在需要切换至主库进行写操作时,代码如下:
@Override public Set<Long> checkReidsInStore(List<Long> resids) { DynamicRoutingDataSourceHolder.useMaster();//切换至主库 Set<Long> residSet = shenquStoreMapper.checkResidsExist(resids); DynamicRoutingDataSourceHolder.reset();//切换至默认连接从库 return residSet; }
4. 之前代码中已经使用了如下代码的可以这样切换:
@Override public Set<Long> checkReidsInStore(List<Long> resids) { DynamicDataSourceHolder.setDataSourceKey(Constants.MOBILE_DATA_SOURCE_SPRING_BEAD_ID, Constants.WRITE_DATA_SOURCE); Set<Long> residSet = shenquStoreMapper.checkResidsExist(resids); DynamicDataSourceHolder.clearDataSourceMapKey(); return residSet; }
将DynamicDataSourceHolder的setDataSourceKey以及clearDataSourceMapKey方法的实现调整为:
public static void setDataSourceKey(String dataSource,String dataSourceKey) { DynamicRoutingDataSourceHolder.useMaster();//基于目前默认连从库,切换至主库才需要手动设置dataSourceKey } public static void clearDataSourceMapKey() { DynamicRoutingDataSourceHolder.reset(); }
这样业务代码中进行主从切换的代码就不需要改动, 减少改动和入侵
5. 如果项目中没有使用到写主库数据源, 那么可以这样配置(紫色部分),因为没有进行过主从切换, 所以用从库数据源顶替主写数据源:
<!-- mobile 动态数据源配置,目前是1主2从, 默认连接从库 -->
<bean id="mobileDataSource" class="com.yy.sv.base.db.dynamic.DynamicRoutingDataSource"> <property name="master" ref="mobileReadDataSource0" /> <property name="slaves"> <list> <ref bean="mobileReadDataSource0" /> <ref bean="mobileReadDataSource1" /> </list> </property> <property name="defaultTargetDataSource" ref="mobileReadDataSource0"/> <!-- <property name="maxFailCount" value="5" /> --> <!--可选配置,设置从库检查maxFailCount次失败后(默认5次),回调处理接口--> <!-- <property name="HandleFailedPattern" ref="handleFailedPattern" /> --><!--可选配置,业务方实现回调处理接口--> </bean>
发表评论
-
RPC调用之微博 motan
2018-02-23 16:42 1512这边文章将偏实战, 至于motan,可以去了解如何实现、比普通 ... -
java快速读取大文件
2018-02-08 11:19 370public static String readCon ... -
微信JSSDK 使用
2016-05-26 11:49 1952获取微信JSAPI_TICKET package com ... -
Netty服务构建实践
2016-05-26 11:40 731用main的形式在服务器上启动了一个netty服务,有端口有地 ... -
push数据结构设计
2016-03-14 16:23 1700根据目前使用的极光推送, 设计一个合理的服务端,而且满足一 ... -
安全性,加密
2016-03-07 15:55 658/** * 随机字符串集 */ pri ... -
并发队列
2015-12-03 15:26 640import java.util.concurrent ... -
一致性hash算法测试
2014-12-17 18:40 1312因为用memcached集群缓存数据,所以增删服务器节点 对缓 ... -
ant脚本编译部署java工程到tomcat服务器
2013-06-28 15:35 1099<?xml version="1.0& ... -
Myeclipse反向生成pojo及hibernate映射文件(由数据库表)
2013-03-18 14:38 1086在这之前请创建一个web工程,然后右键选择myeclipse- ... -
结合webservice实现dwr推送
2012-08-22 13:26 5321情景: 客户端需要实时提醒服务,比如某个日程已过期的提醒, ... -
spring定时任务之cronJob
2012-08-21 14:13 1213情景: 数据库中的数据需要根据formula在一定时间上计 ... -
手写比较器comparator
2012-07-12 15:47 1297项目中需要对一些数据进行排序,应用到了个比较强大的比较器,感觉 ... -
copy到粘贴板
2012-05-22 11:39 1183直接上代码,实现了IE和火狐下的copy content ... -
项目中很强大的两个DAO
2011-12-02 11:37 1289直接贴代码了 public class DaoBase& ... -
Spring 定时任务quartz配置
2011-11-18 17:39 1627贴上xml文件, <?xml version= ... -
取两个集合的交集数据
2011-08-30 11:13 1280List<String> a = new A ... -
常用正则表达式收藏
2011-04-26 12:26 7311。^\d+$ //匹配非负整数(正整数 + 0) 2。 ... -
spring 与Hibernate集成的配置
2011-04-16 08:44 1699首先建个web项目,导入所需要的包,包名在这列出: hib ... -
spring 对jdbc的支持
2011-04-15 15:19 1397我写了个小测试,熟悉一下spring对JDBC的支持与配置过程 ...
相关推荐
总结来说,SpringBoot实现多数据源和动态切换的关键在于正确配置多个数据源,创建自定义的AOP切面和ThreadLocal上下文。在实际项目中,还需要考虑事务管理、异常处理等复杂情况,确保数据的一致性和安全性。通过理解...
- **动态数据源切换逻辑**:核心逻辑是在AOP切面的Advice中实现。当一个需要切换数据源的方法被调用时,通过反射或其他机制获取该方法上标注的数据源信息,然后根据这些信息从数据源池中获取对应的数据源,并将其...
DynamicDataSource是继承自AbstractRoutingDataSource抽象类的动态数据源实现类,该类的作用是根据配置参数创建数据源。DynamicDataSource类中定义了一个etermineCurrentLookupKey方法,该方法用于确定当前的数据源...
本主题将深入探讨如何利用SpringBoot结合Atomikos实现动态多数据源以及事务管理,并介绍两种切换数据源的方法。 首先,SpringBoot简化了传统Spring应用的初始化过程,它通过自动配置和starter包让开发者快速搭建...
要实现动态数据源,我们需要以下几个步骤: 1. **配置Spring**:首先,我们需要在Spring的配置文件中声明多个数据源。这些数据源可以是JDBC的DataSource实例,如Apache的DBCP或C3P0。每个数据源都有其特定的数据库...
本示例代码将介绍如何在项目中配置和使用MyBatis-Plus实现多数据源和动态数据源切换。 首先,我们需要理解多数据源的概念。多数据源意味着系统中存在不止一个数据存储,每个数据源可能对应不同的数据库,如MySQL、...
本资源针对的是Spring Boot动态多数据源和JTA(Java Transaction API)分布式事务的实现,对于初学者来说非常实用。下面我们将深入探讨这些知识点。 首先,让我们了解一下Spring Boot的多数据源。在许多业务场景下...
总结起来,使用`ThreadLocal`和`AbstractRoutingDataSource`实现动态数据源切换的关键步骤包括: 1. 创建`ThreadLocal`实例来保存线程的数据源信息。 2. 实现`AbstractRoutingDataSource`,并重写`...
通过这样的方式,Spring的动态数据源实现为开发者提供了极大的便利,使得在多数据库环境中编写代码变得更加简单和灵活。在实际项目中,我们还可以结合Spring的事务管理、AOP切面等特性,实现更加复杂的数据源切换...
在SpringBoot项目中,整合Mybatis-Plus并实现多数据源的动态切换,同时支持分页查询是一项常见的需求。以下将详细阐述这个过程中的关键步骤和技术要点。 首先,我们需要引入必要的Maven依赖。这里提到了四个关键...
总的来说,这个项目是关于在SpringBoot应用中实现动态多数据源切换的实例,它涵盖了SpringBoot、MyBatis和Druid的高级用法,以及如何设计和实现动态数据源管理的策略。对于希望了解和掌握这一技术的开发者来说,这是...
在大型分布式系统中,通常需要处理多个数据库,这就涉及到了动态数据源的概念。本文将深入探讨如何在Spring Boot 1.5.9版本中结合MyBatis实现动态指定数据源,并通过自定义注解来实现这一功能。 首先,我们需要理解...
项目实现了使用SpringBoot实现动态数据源,实现步骤: 1.租户通过域名访问接口,用filter获取租户独立标识,比如 zhangsan.localhost.com 、lisi.localhost.com 2.实现AbstractRoutingDataSource类来跟进当前访问的...
3. **动态数据源**:为了能够在运行时动态选择数据源,我们可以使用`AbstractRoutingDataSource`。这个抽象类会根据当前的上下文(比如方法注解)来决定使用哪个数据源。我们需要覆盖其`determineCurrentLookupKey`...
实现多数据源通常有以下步骤: 1. **配置数据源**:首先,你需要配置多个数据源,可以使用Spring的AbstractRoutingDataSource作为基础,该类可以根据某种路由策略(如线程本地变量、请求参数等)动态选择数据源。 ...
本示例主要讲解如何使用Spring Boot结合MyBatis实现多数据源切换,并确保AOP事务管理仍然有效。 首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两...
Spring提供了多种方式来管理多数据源,例如通过`AbstractRoutingDataSource`实现动态数据源切换。这个类可以根据某些条件(如事务的标识、请求上下文等)动态决定使用哪个数据源。在`dynamicDatasourceDemo`项目中,...
在实际项目中,有时我们需要访问多个数据库,这时就需要实现多数据源配置。 在SSM框架中实现多数据源配置,主要涉及以下几个关键步骤和知识点: 1. **配置文件设置**:首先,你需要在`applicationContext.xml`或`...
Spring Boot通过DataSourceProperties和AbstractRoutingDataSource等组件,可以实现动态数据源的配置。通过编程或配置文件的方式,我们可以设置数据源的优先级、权重以及自动切换规则。 接下来,我们关注如何在...
在动态数据源的场景下,Druid的灵活性和强大的监控特性使其成为理想的选择。 实现**运行时动态多数据源**的核心在于,我们需要能够在程序运行过程中动态地添加、删除或切换数据源。SpringBoot的`...