[新增功能](master): 新建项目

建立项目
master
土豆兄弟 3 years ago
commit 8cc2fef1c3

46
.gitignore vendored

@ -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,53 @@
spring:
datasource:
# 动态数据源配置
dynamic:
primary: ${db.db1-name} # 指定默认数据源名称
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
${db.db1-name}:
url: jdbc:mysql://127.0.0.1:3306/test_sharding_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true
#driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
username: root
password: root
${db.db2-name}:
url: jdbc:mysql://127.0.0.1:3306/test_sharding_2?useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true
#driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
username: root
password: root
# 分表配置
shardingsphere:
datasource:
# 分库
names: ${db.db3-name}, ${db.db4-name}
${db.db3-name}:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/test_sharding_3?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true
username: root
password: root
${db.db4-name}:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/test_sharding_4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true
username: root
password: root
props:
# 日志显示SQL
sql.show: true
sharding:
tables:
# 订单表 分表20
order:
# 真实表 order_0
actualDataNodes: ${db.db3-name}.order_$->{0..19}
# 分库策略
databaseStrategy:
none:
# 分表策略
tableStrategy:
inline:
shardingColumn: id
# 分片算法行表达式需符合groovy语法 '& Integer.MAX_VALUE' 位运算使hash值为正数
algorithmExpression: order_$->{(order_key.hashCode() & Integer.MAX_VALUE) % 20}

@ -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…
Cancel
Save