- 浏览: 112186 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
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 1450这边文章将偏实战, 至于motan,可以去了解如何实现、比普通 ... -
java快速读取大文件
2018-02-08 11:19 322public static String readCon ... -
微信JSSDK 使用
2016-05-26 11:49 1912获取微信JSAPI_TICKET package com ... -
Netty服务构建实践
2016-05-26 11:40 688用main的形式在服务器上启动了一个netty服务,有端口有地 ... -
push数据结构设计
2016-03-14 16:23 1630根据目前使用的极光推送, 设计一个合理的服务端,而且满足一 ... -
安全性,加密
2016-03-07 15:55 616/** * 随机字符串集 */ pri ... -
并发队列
2015-12-03 15:26 603import java.util.concurrent ... -
一致性hash算法测试
2014-12-17 18:40 1245因为用memcached集群缓存数据,所以增删服务器节点 对缓 ... -
ant脚本编译部署java工程到tomcat服务器
2013-06-28 15:35 1061<?xml version="1.0& ... -
Myeclipse反向生成pojo及hibernate映射文件(由数据库表)
2013-03-18 14:38 1054在这之前请创建一个web工程,然后右键选择myeclipse- ... -
结合webservice实现dwr推送
2012-08-22 13:26 5274情景: 客户端需要实时提醒服务,比如某个日程已过期的提醒, ... -
spring定时任务之cronJob
2012-08-21 14:13 1171情景: 数据库中的数据需要根据formula在一定时间上计 ... -
手写比较器comparator
2012-07-12 15:47 1258项目中需要对一些数据进行排序,应用到了个比较强大的比较器,感觉 ... -
copy到粘贴板
2012-05-22 11:39 1146直接上代码,实现了IE和火狐下的copy content ... -
项目中很强大的两个DAO
2011-12-02 11:37 1254直接贴代码了 public class DaoBase& ... -
Spring 定时任务quartz配置
2011-11-18 17:39 1587贴上xml文件, <?xml version= ... -
取两个集合的交集数据
2011-08-30 11:13 1237List<String> a = new A ... -
常用正则表达式收藏
2011-04-26 12:26 6941。^\d+$ //匹配非负整数(正整数 + 0) 2。 ... -
spring 与Hibernate集成的配置
2011-04-16 08:44 1662首先建个web项目,导入所需要的包,包名在这列出: hib ... -
spring 对jdbc的支持
2011-04-15 15:19 1351我写了个小测试,熟悉一下spring对JDBC的支持与配置过程 ...
相关推荐
通过简单的demo实现SpingBoot多数据源配置并动态切换多数据源
通过SpringAop实现多数据源的动态切换 并采用Druid连接池,可扩展继续增加数据库配置。
mybatis+spring实现动态切换数据源,修改数据源配置信息之后,直接运行test可进行测试
SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询,案例以postgresql和oracle数据库为数据源,分别使用mybatis-plus分页插件和pagehelper分页插件实现分页查询。
项目实现了使用SpringBoot实现动态数据源,实现步骤: 1.租户通过域名访问接口,用filter获取租户独立标识,比如 zhangsan.localhost.com 、lisi.localhost.com 2.实现AbstractRoutingDataSource类来跟进当前访问的...
基于Springboot+MyBatis-Plus实现多租户动态数据源模式源码.zip 基于Springboot+MyBatis-Plus实现多租户动态数据源模式源码.zip 基于Springboot+MyBatis-Plus实现多租户动态数据源模式源码.zip 【备注】 主要针对...
使用springboot + JPA / MyBatis 实现多数据源动态切换
SpringBoot+gradle+mybatis多数据源动态配置 AOP的方式实现数据源动态切换。
用springboot 集成mybatis多数据源,用aop实现的动态切换,支持事务,不会使aop动态切换失效。注意:此代码不涉及分布式事务,如果需要分布式事务 需要采取其他方案。
springboot 1.5.9+mybatis 自定义注解,在方法上添加注解实现动态绑定数据源
springboot+mybatis多数据源+动态数据源配置(连接池),mysql数据库,代码实现了简单的读写分离,但是不建议这种操作,建议使用数据库中间件进行读写分离,例如使用mycat进行读写分离主从热备,使用该代码对于多个...
springboot 根据用户动态切换数据源java代码实现
数据源连接池的基本用法,...实现数据源的动态切换和案例 数据源连接池的基本用法,配置信息,代码案例、 实现数据源的动态切换和案例 数据源连接池的基本用法,配置信息,代码案例、 实现数据源的动态切换和案例
主要介绍了通过Spring Boot配置动态数据源访问多个数据库的实现代码,需要的朋友可以参考下
SPRING框架中,动态数据源连接的实现。 可以根据用户来选择连接的数据库。
最近项目中的工作流需要查询多个数据源的数据,数据源可能是不同种类的:如sql server,oracl等等,一开始是用的配置实现,后来发现在项目运行中,可能需要动态的添加更多不同类型的数据源,所以最终的逻辑是将数据源...
1. 基于Aspectj实现动态数据源切换,支持类级、方法级,方法级优先于类级 2. 实现数据源动态注册、修改、删除,无需重启服务 3. 实现同时兼容多种数据源连接池 4. 实现动态数据源连接池属性配置 5. 采用双端队列实现...
请自行修改com/resources/datasource.properties中数据库配置,Demo中配置的两个数据源,一个是Mysql,一个是Oracle。 运行之前请自行建立数据库的表。
自定义多数据源类MultiplyDataSource(继承HikariDataSource),通过多线程类ThreadLocal控制当前需要使用的数据源id,实现多数据源动态切换查询功能(默认数据源和其他数据源都统一使用这一个,简化了配置)。...
Spring+SpringMvc+MybatisPlus实现多数据源切换、利用自定义Aop注解,只需要在需要切换数据库的方法上加上注解即可实现、极大避免了代码冗余。