[新增功能](master): JPA多数据源
dev-protocol-shardingtask 目前支持了JPA的多数据源方案1 待补充:JPA的多数据源2 及 ShardingJDBC的多数据源master
parent
d72f2ce8b4
commit
1f5c08df34
@ -1,4 +1,4 @@
|
|||||||
package com.baiye.entity;
|
package com.baiye.dao.entity;
|
||||||
|
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
@ -0,0 +1,10 @@
|
|||||||
|
## 场景描述
|
||||||
|
场景:
|
||||||
|
假设订单库使用了分表分库
|
||||||
|
订单相关的SKU使用的是别的库
|
||||||
|
|
||||||
|
技术框架:
|
||||||
|
SpringBoot + ShardingSphere + JPA / dynamic-datasource
|
||||||
|
## 实现功能
|
||||||
|
多数据源动态切换整合分表分库实现
|
||||||
|
|
@ -0,0 +1,20 @@
|
|||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for order
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `order`;
|
||||||
|
CREATE TABLE `order`
|
||||||
|
(
|
||||||
|
`id` bigint(20) NOT NULL COMMENT 'id',
|
||||||
|
`order_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
|
`order_price` decimal(10, 2) NOT NULL,
|
||||||
|
`order_time` datetime(0) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
CHARACTER SET = utf8mb4
|
||||||
|
COLLATE = utf8mb4_general_ci
|
||||||
|
ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
SET FOREIGN_KEY_CHECKS = 1;
|
@ -0,0 +1,65 @@
|
|||||||
|
<?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>dev-protocol</artifactId>
|
||||||
|
<groupId>org.example</groupId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>dev-protocol-shardingtask</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>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 目前不使用这个来切换数据源 -->
|
||||||
|
<!-- <dependency>
|
||||||
|
<groupId>com.baomidou</groupId>
|
||||||
|
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
|
||||||
|
<version>3.3.2</version>
|
||||||
|
</dependency>-->
|
||||||
|
|
||||||
|
<!-- <dependency>-->
|
||||||
|
<!-- <groupId>org.apache.shardingsphere</groupId>-->
|
||||||
|
<!-- <artifactId>sharding-jdbc-spring-boot-starter</artifactId>-->
|
||||||
|
<!-- <version>4.1.1</version>-->
|
||||||
|
<!-- </dependency>-->
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.baiye;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开发协议appication分片任务
|
||||||
|
*
|
||||||
|
* @author q
|
||||||
|
* @date 2021/11/29
|
||||||
|
*/
|
||||||
|
@SpringBootApplication
|
||||||
|
public class DevProtocolsShardingTaskApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
// todo 这里先拿到上下文一会检查下配置
|
||||||
|
ConfigurableApplicationContext context = new SpringApplicationBuilder(DevProtocolsShardingTaskApplication.class)
|
||||||
|
.run(args);
|
||||||
|
|
||||||
|
// 检查Beans加载
|
||||||
|
checkAllBeansWithName(context);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkAllBeansWithName(ConfigurableApplicationContext context) {
|
||||||
|
|
||||||
|
Iterator<String> beanNamesIterator = context.getBeanFactory().getBeanNamesIterator();
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while (beanNamesIterator.hasNext()) {
|
||||||
|
System.out.println("bean number is : " + (i++) + "name is : " + beanNamesIterator.next());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package com.baiye.controller;
|
||||||
|
|
||||||
|
import com.baiye.dao.db1.Order;
|
||||||
|
import com.baiye.dao.db1.OrderRepository;
|
||||||
|
import com.baiye.dao.db2.Sku;
|
||||||
|
import com.baiye.dao.db2.SkuRepository;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
public class OrderController {
|
||||||
|
@Autowired
|
||||||
|
private OrderRepository orderRepository;
|
||||||
|
@Autowired
|
||||||
|
private SkuRepository skuRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存订单
|
||||||
|
*
|
||||||
|
* @param order 订单
|
||||||
|
* @return {@link Order}
|
||||||
|
*/
|
||||||
|
@PostMapping("/user")
|
||||||
|
public Order saveOrder(@RequestBody Order order) {
|
||||||
|
return orderRepository.save(order);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@PostMapping("/user/info")
|
||||||
|
public Sku saveUserInfo(@RequestBody Sku sku) {
|
||||||
|
return skuRepository.save(sku);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package com.baiye.dao.db1;
|
||||||
|
|
||||||
|
|
||||||
|
import javax.persistence.*;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单 -数据源1
|
||||||
|
*
|
||||||
|
* @author q
|
||||||
|
* @date 2021/11/29
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
@Table(name = "order")
|
||||||
|
public class Order {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* id
|
||||||
|
*/
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单名称
|
||||||
|
*/
|
||||||
|
@Column(name = "order_name")
|
||||||
|
private String orderName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单价格
|
||||||
|
*/
|
||||||
|
@Column(name = "order_price")
|
||||||
|
private BigDecimal orderPrice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单时间
|
||||||
|
*/
|
||||||
|
@Column(name = "order_time")
|
||||||
|
private Date orderTime;
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.baiye.dao.db1;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 顺序存储库
|
||||||
|
*
|
||||||
|
* @author q
|
||||||
|
* @date 2021/11/29
|
||||||
|
*/
|
||||||
|
@Repository
|
||||||
|
public interface OrderRepository extends JpaRepository<Order, Long> {
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package com.baiye.dao.db2;
|
||||||
|
|
||||||
|
|
||||||
|
import javax.persistence.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sku -数据源2
|
||||||
|
*
|
||||||
|
* @author q
|
||||||
|
* @date 2021/11/29
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
@Table(name = "sku")
|
||||||
|
public class Sku {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* id
|
||||||
|
*/
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 名字
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 等级
|
||||||
|
*/
|
||||||
|
private String level;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 颜色
|
||||||
|
*/
|
||||||
|
private String color;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规格
|
||||||
|
*/
|
||||||
|
private String size;
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.baiye.dao.db2;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sku库
|
||||||
|
*
|
||||||
|
* @author q
|
||||||
|
* @date 2021/11/29
|
||||||
|
*/
|
||||||
|
@Repository
|
||||||
|
public interface SkuRepository extends JpaRepository<Sku, Long> {
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
# 加载不同的配置文件,进行配置文件分离
|
||||||
|
spring:
|
||||||
|
profiles:
|
||||||
|
include:
|
||||||
|
- jpa
|
||||||
|
# - shardingSphere
|
||||||
|
# - dynamicDatasource
|
@ -0,0 +1,10 @@
|
|||||||
|
# 基本配置
|
||||||
|
server:
|
||||||
|
port: 8088
|
||||||
|
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: dev-protocol-shardingtask
|
||||||
|
# 加载不同环境
|
||||||
|
profiles:
|
||||||
|
active: dev
|
@ -0,0 +1,28 @@
|
|||||||
|
spring:
|
||||||
|
###########datasource1 采用Mysql数据库
|
||||||
|
datasource1:
|
||||||
|
url: jdbc:mysql://localhost:3306/test2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true
|
||||||
|
username: root
|
||||||
|
password: root
|
||||||
|
datasource:
|
||||||
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
|
hikari:
|
||||||
|
##数据源1的连接池的名字
|
||||||
|
db1:
|
||||||
|
pool-name: jpa-hikari-pool-db1
|
||||||
|
## 最长生命周期15分钟
|
||||||
|
maxLifetime: 900000
|
||||||
|
maximumPoolSize: 8
|
||||||
|
###########datasource2 采用h2内存数据库
|
||||||
|
datasource2:
|
||||||
|
url: jdbc:h2:~/test
|
||||||
|
username: sa
|
||||||
|
password: sa
|
||||||
|
datasource:
|
||||||
|
driver-class-name: org.h2.Driver
|
||||||
|
hikari:
|
||||||
|
##数据源2的连接池的名字
|
||||||
|
db2:
|
||||||
|
pool-name: jpa-hikari-pool-db2
|
||||||
|
maxLifetime: 500000
|
||||||
|
maximumPoolSize: 6
|
Loading…
Reference in New Issue