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数据库按月分片】相关推荐

  1. Oracle数据库按月统计(候,旬,月,季,年)

    Oracle数据库按月统计 SELECT TO_CHAR(ds.date_time,'YYYY-MM'),count(*) FROM tab_name ds GROUP BY TO_CHAR(ds.d ...

  2. oracle 字符串 年月,oracle数据库dd-m月-yy字符串转为日期格式

    最近项目提出了个新需求,要根据k表的zfrq字段查询数据,而zfrq这个字段varchar2的日期格式是dd-m月-yy,例子:10-4月 -20或者10-11月-20,所以按日期查询的时候需要转换为 ...

  3. oracle数据库dd-m月-yy字符串转为日期格式

    最近项目提出了个新需求,要根据k表的zfrq字段查询数据,而zfrq这个字段varchar2的日期格式是dd-m月-yy,例子:10-4月 -20或者10-11月-20,所以按日期查询的时候需要转换为 ...

  4. 重磅!分布式数据库解决方案Apache ShardingSphere毕业成为顶级项目

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 全球最大的开源软件基金会 Apache 软件基金会(以下简称 Ap ...

  5. 分布式数据库解决方案Apache ShardingSphere毕业成为顶级项目

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「ShardingSphere官微」 全 ...

  6. Apache ShardingSphere 毕业成为 Apache 顶级项目,系业界首个 Apache 分布式数据库中间件项目

    全球最大的开源软件基金会 Apache 软件基金会(以下简称 Apache)近日宣布京东数科主导的 Apache ShardingSphere 毕业成为 Apache 顶级项目. Apache Sha ...

  7. Apache ShardingSphere 首篇论文被 ICDE 收录,全球数据库发展迎来新局面

    01 Apache ShardingSphere 论文被 ICDE 收录 近日,由 Apache ShardingSphere 社区.SphereEx 以及重庆大学计算机系团队共同撰写的 " ...

  8. Apache ShardingSphere 一文读懂

    一.Apache ShardingSphere的概述 1.概述 官网:http://shardingsphere.apache.org/index_zh.html 下载地址:https://shard ...

  9. Oracle数据库解决方案集锦

    前言 大家好,在进入正题之前,首先想说一下为什么会有这篇文章.经常有用户或者销售来问我,我们Oracle有没有数字化转型的方案?有没有数据底座,湖仓一体的方案?有没有大数据,数据治理的方案?诸如此类. ...

最新文章

  1. NDuiker项目第2天总结
  2. .net oa 用到那些技术_一起来看看选择免费OA办公系统的难点
  3. 程序物语(四):苹果是如何落到牛顿头上的?
  4. System.load 和 System.loadLibrary详解
  5. C++ 日期 时间
  6. NYOJ 42一笔画问题||欧拉图
  7. 公式编辑器mathtype中插入空格与公式编号右对齐
  8. 微信mysql抽奖系统源码_微信互动游戏营销活动抽奖系统 v1.0
  9. android 开门动画,Android之高仿微信“开门动画”(六)
  10. Shell - 常用压缩文件处理 zip、gz、tar、rar
  11. Vivado IP核之复数浮点数乘法 Floating-point
  12. 服务器通过ilo安装系统,如何通过ilo开启服务器远程桌面
  13. 计算机毕业设计Java心理健康管理系统(源码+系统+mysql数据库+Lw文档)
  14. 微信公众号-- 微信分享功能(分享到朋友和朋友圈显示图片和简介)
  15. Sutherland-Hodgeman 多边形裁剪算法
  16. 快速保存网页中所有图片的方法
  17. 使用Hibernate,一对多和多对一的实现(双向).
  18. Excel 神器 —— OpenPyXl
  19. AI中的变形,扭曲和变化,栅格化命令,裁剪标记,路径,路径查找器,转化为形状
  20. SurfaceView出现ANR:Surface has already been released的解决办法

热门文章

  1. unity打飞机游戏简单制作
  2. java app后台_java开发app后台杂记
  3. QQ引流赚钱吗?如何利用QQ赚钱的技巧和方法
  4. 时间序列预测:用电量预测 07 灰色预测算法
  5. mysql check 字段 0_怎么用PHP显示出mysql中 pwn_dingcan_order这个表中 ifcheck 这个字段为0 的这条数据呢。...
  6. 忘记电脑开机密码怎么办?2个妙招能解决
  7. 碰到困难,心情有点沉重
  8. 做网站需要艰苦奋斗而不是坐享其成
  9. 关于window10系统命令行界面无法显示中文的坑
  10. 总结Java开发面试常问的问题,持续更新中~