commit
8cc2fef1c3
@ -0,0 +1,46 @@
|
||||
### Java template
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
|
||||
### Maven template
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
### Example user template template
|
||||
### Example user template
|
||||
|
||||
# IntelliJ project files
|
||||
.idea
|
||||
*.iml
|
||||
out
|
||||
gen
|
@ -0,0 +1,21 @@
|
||||
<div style="text-align: center; color: orangered">sharding JDBC的一般性 DEMO</div>
|
||||
|
||||
|
||||
## 具体实践
|
||||
|
||||
### 0. 业务场景
|
||||
解决问题: 同一项目在多数据源场景下, 订单,会员,价格统计都在不同的库里, 综合 JPA + ShardingJDBC + 动态数据源(跨库) + 怎么实现数据源切换及跨库查询?
|
||||
|
||||
跨库查询: 用户 (用户信息库) 有及相关的总价统计在price表里(业务库),来实现跨库查询
|
||||
|
||||
跨库查询结合分表: 短期业务场景下对用户及总价对关联订单进行查询,订单采用分表进行存储
|
||||
|
||||
跨库结合分表分库: 长期业务场景下不能满足分表的场景,然后进行分表分库进行查询
|
||||
|
||||
|
||||
|
||||
### 1. 多数据源下对其中一个数据源进行分表分库
|
||||
|
||||
查看配置文件
|
||||
|
||||
### 2.
|
@ -0,0 +1,89 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.baiye</groupId>
|
||||
<artifactId>sharding-demo</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<modules>
|
||||
<module>sharding-multiple-data-sources</module>
|
||||
<module>sharding-multiple-data-sources</module>
|
||||
</modules>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.3.2.RELEASE</version>
|
||||
</parent>
|
||||
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- for spring boot -->
|
||||
<dependency>
|
||||
<groupId>org.apache.shardingsphere</groupId>
|
||||
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- for spring namespace -->
|
||||
<dependency>
|
||||
<groupId>org.apache.shardingsphere</groupId>
|
||||
<artifactId>sharding-jdbc-spring-namespace</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.20</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.13.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
</project>
|
@ -0,0 +1,46 @@
|
||||
### Java template
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
|
||||
### Maven template
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
### Example user template template
|
||||
### Example user template
|
||||
|
||||
# IntelliJ project files
|
||||
.idea
|
||||
*.iml
|
||||
out
|
||||
gen
|
@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>sharding-demo</artifactId>
|
||||
<groupId>com.baiye</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>sharding-multiple-data-sources</artifactId>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- for spring boot -->
|
||||
<dependency>
|
||||
<groupId>org.apache.shardingsphere</groupId>
|
||||
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- for spring namespace -->
|
||||
<dependency>
|
||||
<groupId>org.apache.shardingsphere</groupId>
|
||||
<artifactId>sharding-jdbc-spring-namespace</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- <dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
|
||||
</dependency>-->
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
@ -0,0 +1,15 @@
|
||||
package com.baiye;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
/**
|
||||
* @author q
|
||||
*/
|
||||
@SpringBootApplication
|
||||
public class ShardingMultipleDataSourceApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(ShardingMultipleDataSourceApplication.class, args);
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.dao;
|
||||
|
||||
|
||||
import com.baiye.domain.Order;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
public interface OrderRepository extends JpaRepository<Order,Integer> {
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package com.baiye.dao;
|
||||
|
||||
import com.baiye.domain.Price;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
public interface PriceRepository extends JpaRepository<Price,Integer> {
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.baiye.dao;
|
||||
|
||||
import com.baiye.domain.User;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
/**
|
||||
* 对应user表 -> 存储在库 test_sharding_1
|
||||
*
|
||||
* 代表业务主库
|
||||
*
|
||||
* @author q
|
||||
*/
|
||||
public interface UserRepository extends JpaRepository<User,Integer> {
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.baiye.domain;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
import java.io.Serializable;
|
||||
|
||||
@Entity
|
||||
@Data
|
||||
@Table(name = "order")
|
||||
public class Order implements Serializable {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private Integer userid;
|
||||
|
||||
private String ordername;
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.baiye.domain;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@Data
|
||||
@Table(name = "price")
|
||||
public class Price {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private Integer userId;
|
||||
|
||||
private BigDecimal cost;
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.baiye.domain;
|
||||
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
|
||||
@Data
|
||||
@Table(name = "user")
|
||||
public class User {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String name;
|
||||
|
||||
private String city;
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package com.baiye.service;
|
||||
|
||||
|
||||
import com.baiye.dao.OrderRepository;
|
||||
import com.baiye.domain.Order;
|
||||
import com.baiye.domain.User;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author q
|
||||
*/
|
||||
@Service
|
||||
public class ShardService {
|
||||
|
||||
@Autowired
|
||||
private OrderRepository orderRepository;
|
||||
|
||||
/**
|
||||
* 增
|
||||
*/
|
||||
public Order insertOne(Order order){
|
||||
return orderRepository.save(order);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量增加
|
||||
*/
|
||||
public List<Order> batchInsert(List<Order> orders){
|
||||
return orderRepository.saveAll(orders);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查
|
||||
*/
|
||||
public List<Order> queryByCondition(){
|
||||
return orderRepository.findAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改
|
||||
*/
|
||||
public Order updateByCondition(Order order){
|
||||
return orderRepository.save(order);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public void deleterByCondition(Order order){
|
||||
orderRepository.delete(order);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
db:
|
||||
# 多数据源1
|
||||
# db1-name: master
|
||||
# 多数据源2
|
||||
# db2-name: 'slave_1'
|
||||
# 分表分库1
|
||||
db3-name: 'ds1'
|
||||
# 分表分库2
|
||||
db4-name: 'ds2'
|
||||
tb:
|
||||
name1: order
|
||||
|
||||
|
||||
# 分库
|
||||
spring:
|
||||
shardingsphere:
|
||||
datasource:
|
||||
names: ${db.db3-name}, ${db.db4-name}
|
||||
${db.db3-name}:
|
||||
type: com.alibaba.druid.pool.DruidDataSource
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
jdbc-url: jdbc:mysql://127.0.0.1:3306/shard-3?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true
|
||||
username: root
|
||||
password: root
|
||||
${db.db4-name}:
|
||||
type: com.alibaba.druid.pool.DruidDataSource
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
jdbc-url: jdbc:mysql://127.0.0.1:3306/shard-4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true
|
||||
username: root
|
||||
password: root
|
||||
# 设置分片策略
|
||||
sharding:
|
||||
default-database-strategy:
|
||||
inline:
|
||||
sharding-column: userid
|
||||
algorithm-expression: ds$->{userid % 10}
|
||||
# 表分片策略
|
||||
tables:
|
||||
${tb.name1}:
|
||||
actual-data-nodes: ds$->{0..1}.order
|
||||
key-generator:
|
||||
column: userid
|
||||
type: SNOWFLAKE
|
||||
props:
|
||||
worker:
|
||||
id: 33
|
||||
|
@ -0,0 +1,35 @@
|
||||
db:
|
||||
# 多数据源1
|
||||
db1-name: master
|
||||
# 多数据源2
|
||||
db2-name: 'slave_1'
|
||||
# 分表分库1
|
||||
db3-name: ds1
|
||||
# 分表分库2
|
||||
db4-name: ds2
|
||||
tb:
|
||||
name1: order
|
||||
|
||||
|
||||
|
||||
|
||||
# 分表相关的逻辑
|
||||
spring:
|
||||
shardingsphere:
|
||||
datasource:
|
||||
names: ${db.db3-name}
|
||||
${db.db3-name}:
|
||||
type: com.zaxxer.hikari.HikariDataSource
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
jdbc-url: jdbc:mysql://127.0.0.1:3306/shard-3?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true
|
||||
username: root
|
||||
password: root
|
||||
sharding:
|
||||
tables:
|
||||
${tb.name1}:
|
||||
table-strategy:
|
||||
inline:
|
||||
sharding-column: id
|
||||
algorithm-expression: order$-> {id % 10}
|
||||
|
||||
# todo 设置了绑定表和广播表 提供性能
|
@ -0,0 +1,15 @@
|
||||
# 配置环境分离
|
||||
application-all:
|
||||
app-properties-name-1: shardtable # 分表
|
||||
app-properties-name-2: sharddatabase # 分库
|
||||
|
||||
|
||||
server:
|
||||
port: 8080
|
||||
spring:
|
||||
application:
|
||||
name: sharding-multiple-data-sources
|
||||
profiles:
|
||||
active: sharddatabase
|
||||
|
||||
|
@ -0,0 +1,49 @@
|
||||
package com.baiye.service;
|
||||
|
||||
|
||||
import com.baiye.ShardingMultipleDataSourceApplication;
|
||||
import com.baiye.domain.Order;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(classes = ShardingMultipleDataSourceApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||
public class ShardServiceTest {
|
||||
|
||||
@Autowired
|
||||
private ShardService shardService;
|
||||
|
||||
@Test
|
||||
public void insertOne() {
|
||||
Order order = new Order();
|
||||
order.setUserid(9999);
|
||||
order.setOrdername("testOrder" + 9999);
|
||||
Order order1 = shardService.insertOne(order);
|
||||
System.out.println("order1 = " + order1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void batchInsert() {
|
||||
for (int i = 1; i < 1000; i++) {
|
||||
Order order = new Order();
|
||||
order.setUserid(i);
|
||||
order.setOrdername("testOrder" + i);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void queryByCondition() {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateByCondition() {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void deleterByCondition() {
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue