apache shardingsphere 【实现oracle数据库按月分片】
pom文件配置:
注意4.0.0-RC1版本 最低使用ojdbc6版本。
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-namespace</artifactId><version>4.0.0-RC1</version>
</dependency>
<dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>11.2.0.2.0</version>
</dependency>
数据源配置:
这里配置了两个数据源,一个是默认数据源dataSource主要用于非分片的查询,这里配置要注意,spring bean 配置多数据源,启动会提示冲突,要指定首选,用关键字 primary="true" 来配置。
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close" primary="true"><!-- 基本属性 url、user、password --><property name="url" value="${reconciliation.database.url}" /><property name="username" value="${reconciliation.database.username}" /><property name="password" value="${reconciliation.database.password}" /><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="5" /><property name="minIdle" value="5" /><property name="maxActive" value="1000" /><!-- 配置获取连接等待超时的时间 --><!-- c3p0 checkoutTimeout default 0 --><property name="maxWait" value="${reconciliation.database.pool.maxWait}" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><!-- c3p0 idleConnectionTestPeriod our config is 300s --><property name="timeBetweenEvictionRunsMillis" value="300000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><!-- c3p0 maxIdleTime out config is 30s --><property name="minEvictableIdleTimeMillis" value="30000" /><property name="validationQuery" value="SELECT 'x' FROM DUAL" /><!-- property name="testWhileIdle" value="false" / --><property name="testOnBorrow" value="true" /><!-- property name="testOnReturn" value="false" / --><!-- 打开PSCache,并且指定每个连接上PSCache的大小 --><property name="poolPreparedStatements" value="false" /><!-- property name="maxPoolPreparedStatementPerConnectionSize" value="20" / --><!-- 配置监控统计拦截的filters --><!-- property name="filters" value="stat" / --><property name="proxyFilters"><list><ref bean="stat-filter" /></list></property></bean>
下面是分片数据源
<bean id="ds_0" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><!-- 基本属性 url、user、password --><property name="url" value="${reconciliation.database.url}" /><property name="username" value="${reconciliation.database.username}" /><property name="password" value="${reconciliation.database.password}" /><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="5" /><property name="minIdle" value="5" /><property name="maxActive" value="1000" /><!-- 配置获取连接等待超时的时间 --><!-- c3p0 checkoutTimeout default 0 --><property name="maxWait" value="${reconciliation.database.pool.maxWait}" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><!-- c3p0 idleConnectionTestPeriod our config is 300s --><property name="timeBetweenEvictionRunsMillis" value="300000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><!-- c3p0 maxIdleTime out config is 30s --><property name="minEvictableIdleTimeMillis" value="30000" /><property name="validationQuery" value="SELECT 'x' FROM DUAL" /><!-- property name="testWhileIdle" value="false" / --><property name="testOnBorrow" value="true" /><!-- property name="testOnReturn" value="false" / --><!-- 打开PSCache,并且指定每个连接上PSCache的大小 --><property name="poolPreparedStatements" value="false" /><!-- property name="maxPoolPreparedStatementPerConnectionSize" value="20" / --><!-- 配置监控统计拦截的filters --><!-- property name="filters" value="stat" / --><property name="proxyFilters"><list><ref bean="stat-filter" /></list></property></bean>
集成分片数据源及规则:
分片算法有以下四种
- 精确分片算法
对应PreciseShardingAlgorithm,用于处理使用单一键作为分片键的=与IN进行分片的场景。需要配合StandardShardingStrategy使用。
- 范围分片算法
对应RangeShardingAlgorithm,用于处理使用单一键作为分片键的BETWEEN AND、>、<、>=、<=进行分片的场景。需要配合StandardShardingStrategy使用。
- 复合分片算法
对应ComplexKeysShardingAlgorithm,用于处理使用多键作为分片键进行分片的场景,包含多个分片键的逻辑较复杂,需要应用开发者自行处理其中的复杂度。需要配合ComplexShardingStrategy使用。
- Hint分片算法
对应HintShardingAlgorithm,用于处理使用Hint行分片的场景。需要配合HintShardingStrategy使用。
我这里主要实现精确分片算法和范围分片算法。见代码precise-algorithm-ref,range-algorithm-ref。
注意:同一个分片字段如果同时实现精确分片和范围分片 shardingsphere 会根据传入的sql自动匹配相应规则。
<!-- 自定义分片规则 --><bean id="rangeModuloTableShardingAlgorithm" class="com.demo.common.dal.shardingAlgorithm.RangeModuloShardingTableAlgorithm" /><bean id="preciseModuloShardingTableAlgorithm" class="com.demo.common.dal.shardingAlgorithm.PreciseModuloShardingTableAlgorithm" /><!-- 分片字段 标准分片 --><sharding:standard-strategy id="moduloShardingTableAlgorithm" sharding-column="SETT_DATE" precise-algorithm-ref="preciseModuloShardingTableAlgorithm" range-algorithm-ref="rangeModuloTableShardingAlgorithm" /> <!-- 数据池 --><sharding:data-source id="shardingDataSource"><sharding:sharding-rule data-source-names="ds_0"><sharding:table-rules><sharding:table-rule logic-index="1" logic-table="RECONCILIATION_TRAN_INFO" actual-data-nodes="ds_0.RECONCILIATION_TRAN_INFO_$->{1901..1903}" table-strategy-ref="moduloShardingTableAlgorithm" /></sharding:table-rules><sharding:binding-table-rules><sharding:binding-table-rule logic-tables="RECONCILIATION_TRAN_INFO" /></sharding:binding-table-rules></sharding:sharding-rule><sharding:props><prop key="sql.show">true</prop></sharding:props></sharding:data-source>
PreciseModuloShardingTableAlgorithm 自定义精确分片的规则。
package com.demo.common.dal.shardingAlgorithm;import java.util.Collection;import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;public final class PreciseModuloShardingTableAlgorithm implements PreciseShardingAlgorithm<Long>{public String doSharding(final Collection<String> tableNames, final PreciseShardingValue<Long> shardingValue) {for (String each : tableNames) {String s = String.valueOf(shardingValue.getValue()).substring(2, 6);if (each.endsWith(s)) {return each;}}throw new UnsupportedOperationException();}
}
RangeModuloShardingTableAlgorithm 自定义范围分片的规则,这里sql定义之between 会优先匹配范围分片。
这里主要实现了按月自定义分片的时下。
package com.demo.common.dal.shardingAlgorithm;import com.google.common.collect.Lists;
import com.google.common.collect.Range;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;public final class RangeModuloShardingTableAlgorithm implements RangeShardingAlgorithm<Long> {@Overridepublic Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Long> shardingValue) {Collection<String> collect = new ArrayList<String>();Range<Long> valueRange = shardingValue.getValueRange();String s1 = String.valueOf(valueRange.lowerEndpoint()).substring(2, 6);String s2 = String.valueOf(valueRange.upperEndpoint()).substring(2, 6);List<String> betweenDate = getBetweenDate(DateUtils.parseDate(s1, "yyyyMM"), DateUtils.parseDate(s2, "yyyyMM"));for (String each : availableTargetNames) {for (int i = 0; i < betweenDate.size(); i++) {if (each.endsWith(s1)) {collect.add(each);}}}return collect;}private List<String> getBetweenDate(Date startDate, Date endDate) {List<String> dateList = Lists.newArrayList();boolean flag = true;String endDate_string = DateFormatUtils.format(endDate, "yyyyMM");String startDate_string = DateFormatUtils.format(startDate, "yyyyMM");dateList.add(startDate_string);Date nowDate = getDateAddMouth(startDate);while (flag) {String newdate_string = DateFormatUtils.format(nowDate, "yyyyMM");dateList.add(newdate_string);if (newdate_string.equals(endDate_string)) {flag = false;}else {nowDate = getDateAddMouth(nowDate);}};return dateList;}private Date getDateAddMouth(Date date) {return DateUtils.addMonths(date, 1);}}
apache shardingsphere 【实现oracle数据库按月分片】相关推荐
- Oracle数据库按月统计(候,旬,月,季,年)
Oracle数据库按月统计 SELECT TO_CHAR(ds.date_time,'YYYY-MM'),count(*) FROM tab_name ds GROUP BY TO_CHAR(ds.d ...
- oracle 字符串 年月,oracle数据库dd-m月-yy字符串转为日期格式
最近项目提出了个新需求,要根据k表的zfrq字段查询数据,而zfrq这个字段varchar2的日期格式是dd-m月-yy,例子:10-4月 -20或者10-11月-20,所以按日期查询的时候需要转换为 ...
- oracle数据库dd-m月-yy字符串转为日期格式
最近项目提出了个新需求,要根据k表的zfrq字段查询数据,而zfrq这个字段varchar2的日期格式是dd-m月-yy,例子:10-4月 -20或者10-11月-20,所以按日期查询的时候需要转换为 ...
- 重磅!分布式数据库解决方案Apache ShardingSphere毕业成为顶级项目
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 全球最大的开源软件基金会 Apache 软件基金会(以下简称 Ap ...
- 分布式数据库解决方案Apache ShardingSphere毕业成为顶级项目
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「ShardingSphere官微」 全 ...
- Apache ShardingSphere 毕业成为 Apache 顶级项目,系业界首个 Apache 分布式数据库中间件项目
全球最大的开源软件基金会 Apache 软件基金会(以下简称 Apache)近日宣布京东数科主导的 Apache ShardingSphere 毕业成为 Apache 顶级项目. Apache Sha ...
- Apache ShardingSphere 首篇论文被 ICDE 收录,全球数据库发展迎来新局面
01 Apache ShardingSphere 论文被 ICDE 收录 近日,由 Apache ShardingSphere 社区.SphereEx 以及重庆大学计算机系团队共同撰写的 " ...
- Apache ShardingSphere 一文读懂
一.Apache ShardingSphere的概述 1.概述 官网:http://shardingsphere.apache.org/index_zh.html 下载地址:https://shard ...
- Oracle数据库解决方案集锦
前言 大家好,在进入正题之前,首先想说一下为什么会有这篇文章.经常有用户或者销售来问我,我们Oracle有没有数字化转型的方案?有没有数据底座,湖仓一体的方案?有没有大数据,数据治理的方案?诸如此类. ...
最新文章
- NDuiker项目第2天总结
- .net oa 用到那些技术_一起来看看选择免费OA办公系统的难点
- 程序物语(四):苹果是如何落到牛顿头上的?
- System.load 和 System.loadLibrary详解
- C++ 日期 时间
- NYOJ 42一笔画问题||欧拉图
- 公式编辑器mathtype中插入空格与公式编号右对齐
- 微信mysql抽奖系统源码_微信互动游戏营销活动抽奖系统 v1.0
- android 开门动画,Android之高仿微信“开门动画”(六)
- Shell - 常用压缩文件处理 zip、gz、tar、rar
- Vivado IP核之复数浮点数乘法 Floating-point
- 服务器通过ilo安装系统,如何通过ilo开启服务器远程桌面
- 计算机毕业设计Java心理健康管理系统(源码+系统+mysql数据库+Lw文档)
- 微信公众号-- 微信分享功能(分享到朋友和朋友圈显示图片和简介)
- Sutherland-Hodgeman 多边形裁剪算法
- 快速保存网页中所有图片的方法
- 使用Hibernate,一对多和多对一的实现(双向).
- Excel 神器 —— OpenPyXl
- AI中的变形,扭曲和变化,栅格化命令,裁剪标记,路径,路径查找器,转化为形状
- SurfaceView出现ANR:Surface has already been released的解决办法
热门文章
- unity打飞机游戏简单制作
- java app后台_java开发app后台杂记
- QQ引流赚钱吗?如何利用QQ赚钱的技巧和方法
- 时间序列预测:用电量预测 07 灰色预测算法
- mysql check 字段 0_怎么用PHP显示出mysql中 pwn_dingcan_order这个表中 ifcheck 这个字段为0 的这条数据呢。...
- 忘记电脑开机密码怎么办?2个妙招能解决
- 碰到困难,心情有点沉重
- 做网站需要艰苦奋斗而不是坐享其成
- 关于window10系统命令行界面无法显示中文的坑
- 总结Java开发面试常问的问题,持续更新中~