[新增功能](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;
|
@ -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