jfinal使⽤sharding-jdbc分库分表
参考
/document/4.1.1/cn/overview/
github/apache/shardingsphere/tree/4.1.1/examples
⽬录
⼀、代码实现
引⼊依赖
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>4.9.15</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>4.1.1</version>
</dependency>
数据库配置
public void configPlugin(Plugins me) {
//数据分⽚——单库分表
ShardDruidPlugin shardDruidPlugin = ShardTablePlugin();
ActiveRecordPlugin arp = new ActiveRecordPlugin(shardDruidPlugin);
_MappingKit.mapping(arp);
arp.setDevMode(true);
arp.setShowSql(true);
me.add(arp);
}jfinal极速开发
数据分⽚配置-单库分表
/**
* 数据分⽚,单库分表
*/
public static ShardDruidPlugin getShardTablePlugin() {
DruidPlugin dp0 = new ("jdbc.master.url"), ("jd
bc.master.user"), ("jdbc.master.passw Map<String, DruidPlugin> druidPluginMap = new HashMap<>();
druidPluginMap.put("ds0", dp0);
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration("t_order", "ds0.t_order_${0..1}");
StandardShardingStrategyConfiguration strategyConfiguration = new StandardShardingStrategyConfiguration("order_id", new PreciseModuloShardingTableAlg shardingRuleConfig.setDefaultTableShardingStrategyConfig(strategyConfiguration);
Properties props = new Properties();
props.setProperty(ConfigurationPropertyKey.Key(), "true");
return new ShardDruidPlugin(shardingRuleConfig, druidPluginMap, props);
}
⾃定义Druid插件
import com.jfinal.plugin.IPlugin;
import com.jfinal.plugin.activerecord.IDataSourceProvider;
import com.jfinal.plugin.druid.DruidPlugin;
import org.apache.fig.sharding.ShardingRuleConfiguration;
import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class ShardDruidPlugin implements IPlugin, IDataSourceProvider {
//分表分库的rule
ShardingRuleConfiguration shardingRuleConfig;
//数据源map
Map<String, DruidPlugin> druidPlugins;
//原数据库连接源map
Map<String, DataSource> dataSourceMap;
//最终sharding-jdbc封装后的数据库连接源
DataSource dataSource;
//配置
Properties props;
public ShardDruidPlugin(ShardingRuleConfiguration shardingRuleConfig, Map<String, DruidPlugin> druidPlugins, Properties props) { this.shardingRuleConfig = shardingRuleConfig;
this.druidPlugins = druidPlugins;
this.dataSourceMap = new HashMap<>();
this.props = props;
}
public boolean start() {
//遍历数据源,将数据源加⼊sharding jdbc
for (Map.Entry<String, DruidPlugin> entry : Set()) {
dataSourceMap.Key(), Value().getDataSource());
}
try {
//获得数据库连接类
dataSource = ateDataSource(dataSourceMap, shardingRuleConfig, props);
} catch (SQLException e) {
e.printStackTrace();
}
return true;
}
public boolean stop() {
for (Map.Entry<String, DruidPlugin> entry : Set()) {
dataSourceMap.Key(), Value().getDataSource());
}
return true;
}
public DataSource getDataSource() {
return dataSource;
}
}
分表算法
(1)精准分表算法
分⽚算法可以根据需要⾃⾏实现,可实现的灵活度⾮常⾼。
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import java.util.Collection;
public final class PreciseModuloShardingTableAlgorithm implements PreciseShardingAlgorithm<Integer> {
@Override
public String doSharding(final Collection<String> tableNames, final PreciseShardingValue<Integer> shardingValue) {
for (String each : tableNames) {
if (Value() % 2))) {
System.out.println("each = " + each);
return each;
}
}
throw new UnsupportedOperationException();
}
}
(2)范围分表算法
import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;
public final class RangeModuloShardingTableAlgorithm implements RangeShardingAlgorithm<Integer> {
@Override
public Collection<String> doSharding(final Collection<String> tableNames, final RangeShardingValue<Integer> shardingValue) { Set<String> result = new LinkedHashSet<>();
/*if (Range.closed(0, 1000).ValueRange())) {
for (String each : tableNames) {
if (dsWith("0")) {
result.add(each);
}
}
} else {
throw new UnsupportedOperationException();
}*/
result.addAll(tableNames);
return result;
}
}
测试数据库创建
-- 创建库
create database ds_0;
create database ds_1;
create database ds_2;
-- 每个库创建表
CREATE TABLE `t_order` (
`order_id` int NOT NULL,
`order_name` varchar(100) NOT NULL,
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB;
CREATE TABLE `t_order_0` (
`order_id` int NOT NULL,
`order_name` varchar(100) NOT NULL,
PRIMARY KEY (`order_id`)
)
ENGINE=InnoDB;
CREATE TABLE `t_order_1` (
`order_id` int NOT NULL,
`order_name` varchar(100) NOT NULL,
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB;
-- 测试数据
INSERT INTO `t_order`(`order_id`, `order_name`) VALUES (1, 'name1');
INSERT INTO `t_order`(`order_id`, `order_name`) VALUES (2, 'name2');
INSERT INTO `t_order_1`(`order_id`, `order_name`) VALUES (1, 'name1');
INSERT INTO `t_order_0`(`order_id`, `order_name`) VALUES (2, 'name2');
以上是⼀个简单的单库分表实现,更多读写分离和分库分表配置可以参考,⾥⾯有⼀些简单代码实现。更详细的配置建议还是看。Sharding-JDBC介绍可以看看⽂章。
⼆、sharding-jdbc概念
分⽚算法
通过分⽚算法将数据分⽚,⽀持通过=、>=、<=、>、<、BETWEEN和IN分⽚。分⽚算法需要应⽤⽅开发者⾃⾏实现,可实现的灵活度⾮常⾼。
⽬前提供4种分⽚算法。由于分⽚算法和业务实现紧密相关,因此并未提供内置分⽚算法,⽽是通过分⽚策略将各种场景提炼出来,提供更⾼层级的抽象,并提供接⼝让应⽤开发者⾃⾏实现分⽚算法。
精确分⽚算法
对应PreciseShardingAlgorithm,⽤于处理使⽤单⼀键作为分⽚键的=与IN进⾏分⽚的场景。需要配合StandardShardingStrategy使⽤。
范围分⽚算法
对应RangeShardingAlgorithm,⽤于处理使⽤单⼀键作为分⽚键的BETWEEN AND、>、<、>=、<=进⾏分⽚的场景。需要配合StandardShardingStrategy使⽤。
复合分⽚算法
对应ComplexKeysShardingAlgorithm,⽤于处理使⽤多键作为分⽚键进⾏分⽚的场景,包含多个分⽚键的逻辑较复杂,需要应⽤开发者⾃⾏处理其中的复杂度。需要配合ComplexShardingStrategy使⽤。
Hint分⽚算法
对应HintShardingAlgorithm,⽤于处理使⽤Hint⾏分⽚的场景。需要配合HintShardingStrategy使⽤。
分⽚策略
包含分⽚键和分⽚算法,由于分⽚算法的独⽴性,将其独⽴抽离。真正可⽤于分⽚操作的是分⽚键 + 分⽚算法,也就是分⽚策略。⽬前提供5种分⽚策略。
标准分⽚策略
对应StandardShardingStrategy。提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分⽚操作⽀持。
StandardShardingStrategy只⽀持单分⽚键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分⽚算法。
PreciseShardingAlgorithm是必选的,⽤于处理=和IN的分⽚。
RangeShardingAlgorithm是可选的,⽤于处理BETWEEN AND, >, <, >=, <=分⽚,如果不配置RangeShardingAlgorithm,SQL 中的BETWEEN AND将按照全库路由处理。
复合分⽚策略
对应ComplexShardingStrategy。复合分⽚策略。提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分⽚操作⽀持。
ComplexShardingStrategy⽀持多分⽚键,由于多分⽚键之间的关系复杂,因此并未进⾏过多的封装,⽽是直接将分⽚键值组合以及分⽚操作符透传⾄分⽚算法,完全由应⽤开发者实现,提供最⼤的灵活度。
⾏表达式分⽚策略
对应InlineShardingStrategy。使⽤Groovy的表达式,提供对SQL语句中的=和IN的分⽚操作⽀持,只⽀持单分⽚键。
对于简单的分⽚算法,可以通过简单的配置使⽤,从⽽避免繁琐的Java代码开发,如: t_user_$->{u_id % 8} 表⽰t_user表根据u_id模8,⽽分成8张表,表名称为t_user_0到t_user_7。
Hint分⽚策略
对应HintShardingStrategy。通过Hint指定分⽚值⽽⾮从SQL中提取分⽚值的⽅式进⾏分⽚的策略。
不分⽚策略
对应NoneShardingStrategy。不分⽚的策略。
分⽚策略配置
对于分⽚策略存有数据源分⽚策略和表分⽚策略两种维度。两种策略的API完全相同。
数据源分⽚策略
对应于DatabaseShardingStrategy。⽤于配置数据被分配的⽬标数据源。
表分⽚策略
对应于TableShardingStrategy。⽤于配置数据被分配的⽬标表,该⽬标表存在与该数据的⽬标数据源内。故表分⽚策略是依赖与数据源分⽚策略的结果的。
后记
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论