sharding-jdbc主要为了简化大数据量要做分库分表,自己要写分库分表代码的一个框架,当然这个框架功能非常强大,还支持读写分离,简单配置即可使用,注意这个为java定制化框架,当然其他语言想要用可以用mycat或者sharding-proxy。官方资料:https://shardingsphere.apache.org/document/current/cn/overview/
用之前需要了解几个基本概念
逻辑表
水平拆分的数据库(表)的相同逻辑和数据结构表的总称。例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order。
真实表
在分片的数据库中真实存在的物理表。即上个示例中的t_order_0到t_order_9。
数据节点
数据分片的最小单元。由数据源名称和数据表组成,例:ds_0.t_order_0。
绑定表
指分片规则一致的主表和子表。例如:t_order表和t_order_item表,均按照order_id分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。
广播表
指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表。
注意:分库和分表都要配置各自的规则
1.pom文件
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>3.1.0</version>
</dependency>
2.加入配置
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource(KeyGenerator keyGenerator) {
// 配置真实数据源
Map<String, DataSource> dataSourceMap = new HashMap<>(2);
// 配置第一个数据源
DruidDataSource dataSource1 = new DruidDataSource();
dataSource1.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource1.setUrl(
"jdbc:mysql://xxxxx?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true");
dataSource1.setUsername("xx");
dataSource1.setPassword("xxx");
List<String> connectionInitSqlsList = new ArrayList<>();
connectionInitSqlsList.add("set names utf8mb4");
dataSource1.setConnectionInitSqls(connectionInitSqlsList);
dataSource1.setInitialSize(5);
dataSource1.setMinIdle(5);
dataSource1.setMaxActive(20);
dataSource1.setMaxWait(60000);
dataSource1.setTimeBetweenEvictionRunsMillis(60000);
dataSource1.setMinEvictableIdleTimeMillis(300000);
dataSource1.setTestWhileIdle(true);
dataSource1.setTestOnBorrow(false);
dataSource1.setTestOnReturn(false);
dataSource1.setPoolPreparedStatements(true);
dataSourceMap.put("ds0", dataSource1);
// 配置第二个数据源
DruidDataSource dataSource2 = new DruidDataSource();
dataSource2.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource2.setUrl(
"jdbc:mysql://xxx?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true");
dataSource2.setUsername("xxx");
dataSource2.setPassword("xxx");
dataSource2.setConnectionInitSqls(connectionInitSqlsList);
dataSource2.setInitialSize(5);
dataSource2.setMinIdle(5);
dataSource2.setMaxActive(20);
dataSource2.setMaxWait(60000);
dataSource2.setTimeBetweenEvictionRunsMillis(60000);
dataSource2.setMinEvictableIdleTimeMillis(300000);
dataSource2.setTestWhileIdle(true);
dataSource2.setTestOnBorrow(false);
dataSource2.setTestOnReturn(false);
dataSource2.setPoolPreparedStatements(true);
dataSourceMap.put("ds1", dataSource2);
// 配置Order表规则
TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration();
//逻辑表
orderTableRuleConfig.setLogicTable("t_order");
//实际节点
orderTableRuleConfig.setActualDataNodes("ds${0..1}.t_order${0..1}");
//自动id生成对应的conlumn
orderTableRuleConfig.setKeyGeneratorColumnName("order_id");
//自动id生成策略
orderTableRuleConfig.setKeyGenerator(keyGenerator);
// 配置分库 策略
orderTableRuleConfig.setDatabaseShardingStrategyConfig(
new InlineShardingStrategyConfiguration("order_id", "ds${order_id % 2}"));
// 配置分表策略
orderTableRuleConfig.setTableShardingStrategyConfig(
new InlineShardingStrategyConfiguration("order_id", "t_order${order_id % 2}"));
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);
// shardingRuleConfig.getBindingTableGroups().add("t_order");
// 获取数据源对象
try {
return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, Collections.emptyMap(),
null);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 需要手动配置事务管理器
*
* @param dataSource
* @return
*/
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
/**
* EntityManagerFactory类似于Hibernate的SessionFactory,mybatis的SqlSessionFactory
* 总之,在执行操作之前,我们总要获取一个EntityManager,这就类似于Hibernate的Session, mybatis的sqlSession.
*
* @return
*/
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factory.setPackagesToScan("org.shardingtest");
factory.setDataSource(dataSource);// 数据源
return factory;
}
@Bean
public KeyGenerator keyGenerator() {
//默认雪花算法
return new DefaultKeyGenerator();
}
}
注意我orm使用jpa,你们可以使用其他的orm配置
浙公网安备 33010602011771号