parent
1f5c08df34
commit
9bfea90f0b
@ -0,0 +1,58 @@
|
||||
<?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>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>dev-protocol-jpaauditing</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>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
@ -0,0 +1,56 @@
|
||||
package com.baiye;
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* 开发协议jpa应用程序审计
|
||||
*
|
||||
* @author q
|
||||
* @date 2021/11/30
|
||||
*/
|
||||
@SpringBootApplication
|
||||
public class DevProtocolJpaAuditingApplication {
|
||||
public static void main(String[] args) {
|
||||
// todo 这里先拿到上下文一会检查下配置
|
||||
ConfigurableApplicationContext context = new SpringApplicationBuilder(DevProtocolJpaAuditingApplication.class)
|
||||
.run(args);
|
||||
|
||||
List<String> beanNames = new ArrayList<>(Arrays.asList("db1DataSource", "db2DataSource"));
|
||||
// 检查Beans加载
|
||||
checkBeansWithName(context, beanNames);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 检查指定Bean的注册
|
||||
*
|
||||
* @param context
|
||||
*/
|
||||
private static void checkBeansWithName(ConfigurableApplicationContext context, List<String> beanNames){
|
||||
|
||||
Iterator<String> beanNamesIterator = context.getBeanFactory().getBeanNamesIterator();
|
||||
|
||||
AtomicInteger i = new AtomicInteger();
|
||||
while (beanNamesIterator.hasNext()) {
|
||||
String next = beanNamesIterator.next();
|
||||
|
||||
beanNames.forEach(
|
||||
one->{
|
||||
if (!next.equalsIgnoreCase(one)) {
|
||||
return;
|
||||
}
|
||||
System.out.println("bean number is : " + (i.getAndIncrement()) + ", name is : " + next);
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.baiye.config;
|
||||
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
|
||||
|
||||
/**
|
||||
* jpa配置
|
||||
*
|
||||
* @author q
|
||||
* @date 2021/11/30
|
||||
*/
|
||||
@Configuration
|
||||
@EnableJpaAuditing
|
||||
public class JpaConfiguration {
|
||||
@Bean
|
||||
@ConditionalOnMissingBean(name = "myAuditorAware")
|
||||
MyAuditorAware myAuditorAware() {
|
||||
return new MyAuditorAware();
|
||||
}
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
package com.baiye.entity;
|
||||
|
||||
import lombok.*;
|
||||
import org.springframework.data.annotation.CreatedBy;
|
||||
import org.springframework.data.annotation.CreatedDate;
|
||||
import org.springframework.data.annotation.LastModifiedBy;
|
||||
import org.springframework.data.annotation.LastModifiedDate;
|
||||
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
|
||||
|
||||
import javax.persistence.EntityListeners;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 审计基础类
|
||||
*
|
||||
* @author q
|
||||
* @date 2021/11/30
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@RequiredArgsConstructor
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@EntityListeners(AuditingEntityListener.class)
|
||||
public class AuditingBase {
|
||||
|
||||
/**
|
||||
* 创建用户id
|
||||
*/
|
||||
@CreatedBy
|
||||
private Integer createUserId;
|
||||
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@CreatedDate
|
||||
private Date createTime;
|
||||
|
||||
/**
|
||||
* 最后修改的用户id
|
||||
*/
|
||||
@LastModifiedBy
|
||||
private Integer lastModifiedUserId;
|
||||
|
||||
|
||||
/**
|
||||
* 最后修改时间
|
||||
*/
|
||||
@LastModifiedDate
|
||||
private Date lastModifiedTime;
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package com.baiye.entity;
|
||||
|
||||
import lombok.*;
|
||||
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 用户
|
||||
*
|
||||
* @author q
|
||||
* @date 2021/11/30
|
||||
*/
|
||||
@Entity
|
||||
@Getter
|
||||
@Setter
|
||||
@RequiredArgsConstructor
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@ToString()
|
||||
public class User extends AuditingBase implements Serializable {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Long id;
|
||||
private String name;
|
||||
private String email;
|
||||
private Integer age;
|
||||
private Boolean deleted;
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
# 加载不同的配置文件,进行配置文件分离
|
||||
spring:
|
||||
profiles:
|
||||
include:
|
||||
- jpa
|
||||
# - shardingSphere
|
||||
# - dynamicDatasource
|
@ -0,0 +1,10 @@
|
||||
# 基本配置
|
||||
server:
|
||||
port: 8900
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: dev-protocol-jpaauditing1
|
||||
# 加载不同环境
|
||||
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
|
@ -0,0 +1,58 @@
|
||||
<?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>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>dev-protocol-jpaauditing2</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>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
@ -0,0 +1,56 @@
|
||||
package com.baiye;
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* 开发协议jpa应用程序审计
|
||||
*
|
||||
* @author q
|
||||
* @date 2021/11/30
|
||||
*/
|
||||
@SpringBootApplication
|
||||
public class DevProtocolJpaAuditing2Application {
|
||||
public static void main(String[] args) {
|
||||
// todo 这里先拿到上下文一会检查下配置
|
||||
ConfigurableApplicationContext context = new SpringApplicationBuilder(DevProtocolJpaAuditing2Application.class)
|
||||
.run(args);
|
||||
|
||||
List<String> beanNames = new ArrayList<>(Arrays.asList("db1DataSource", "db2DataSource"));
|
||||
// 检查Beans加载
|
||||
checkBeansWithName(context, beanNames);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 检查指定Bean的注册
|
||||
*
|
||||
* @param context
|
||||
*/
|
||||
private static void checkBeansWithName(ConfigurableApplicationContext context, List<String> beanNames){
|
||||
|
||||
Iterator<String> beanNamesIterator = context.getBeanFactory().getBeanNamesIterator();
|
||||
|
||||
AtomicInteger i = new AtomicInteger();
|
||||
while (beanNamesIterator.hasNext()) {
|
||||
String next = beanNamesIterator.next();
|
||||
|
||||
beanNames.forEach(
|
||||
one->{
|
||||
if (!next.equalsIgnoreCase(one)) {
|
||||
return;
|
||||
}
|
||||
System.out.println("bean number is : " + (i.getAndIncrement()) + ", name is : " + next);
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,78 @@
|
||||
package com.baiye.entity;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.*;
|
||||
import org.hibernate.Hibernate;
|
||||
import org.springframework.data.domain.Auditable;
|
||||
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.io.Serializable;
|
||||
import java.time.Instant;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 用户
|
||||
*
|
||||
* @author q
|
||||
* @date 2021/11/30
|
||||
*/
|
||||
@Entity
|
||||
@Getter
|
||||
@Setter
|
||||
@RequiredArgsConstructor
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@EntityListeners(AuditingEntityListener.class)
|
||||
public class User implements Serializable, Auditable<Integer, Long, Instant> {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy= GenerationType.AUTO)
|
||||
private Long id;
|
||||
private String name;
|
||||
private String email;
|
||||
private Integer age;
|
||||
private Integer createUserId;
|
||||
private Instant createTime;
|
||||
private Integer lastModifiedUserId;
|
||||
private Instant lastModifiedTime;
|
||||
|
||||
@Override
|
||||
public Optional<Integer> getCreatedBy() {
|
||||
return Optional.ofNullable(this.createUserId);
|
||||
}
|
||||
@Override
|
||||
public void setCreatedBy(Integer createdBy) {
|
||||
this.createUserId = createdBy;
|
||||
}
|
||||
@Override
|
||||
public Optional<Instant> getCreatedDate() {
|
||||
return Optional.ofNullable(this.createTime);
|
||||
}
|
||||
@Override
|
||||
public void setCreatedDate(Instant creationDate) {
|
||||
this.createTime = creationDate;
|
||||
}
|
||||
@Override
|
||||
public Optional<Integer> getLastModifiedBy() {
|
||||
return Optional.ofNullable(this.lastModifiedUserId);
|
||||
}
|
||||
@Override
|
||||
public void setLastModifiedBy(Integer lastModifiedBy) {
|
||||
this.lastModifiedUserId = lastModifiedBy;
|
||||
}
|
||||
@Override
|
||||
public void setLastModifiedDate(Instant lastModifiedDate) {
|
||||
this.lastModifiedTime = lastModifiedDate;
|
||||
}
|
||||
@Override
|
||||
public Optional<Instant> getLastModifiedDate() {
|
||||
return Optional.ofNullable(this.lastModifiedTime);
|
||||
}
|
||||
@Override
|
||||
public boolean isNew() {
|
||||
return id==null;
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
# 加载不同的配置文件,进行配置文件分离
|
||||
spring:
|
||||
profiles:
|
||||
include:
|
||||
- jpa
|
||||
# - shardingSphere
|
||||
# - dynamicDatasource
|
@ -0,0 +1,10 @@
|
||||
# 基本配置
|
||||
server:
|
||||
port: 8900
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: dev-protocol-jpaauditing2
|
||||
# 加载不同环境
|
||||
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
|
@ -0,0 +1,58 @@
|
||||
<?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>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>dev-protocol-jpaauditing3</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>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
@ -0,0 +1,20 @@
|
||||
<?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>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>dev-protocol-jpaentity-callback</artifactId>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
</project>
|
@ -0,0 +1,4 @@
|
||||
package com.baiye;
|
||||
|
||||
public class DevProtocolJpaEntityCallbackApplication {
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
<?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>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>dev-protocol-jpashard1</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>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,38 @@
|
||||
package com.baiye;
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* 开发协议appication分片任务
|
||||
*
|
||||
* @author q
|
||||
* @date 2021/11/29
|
||||
*/
|
||||
@SpringBootApplication
|
||||
public class DevProtocolJpaShard1Application {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
// todo 这里先拿到上下文一会检查下配置
|
||||
ConfigurableApplicationContext context = new SpringApplicationBuilder(DevProtocolJpaShard1Application.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: 8900
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: dev-protocol-jpashard1
|
||||
# 加载不同环境
|
||||
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
|
@ -0,0 +1,52 @@
|
||||
<?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>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>dev-protocol-jpashard2</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>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,56 @@
|
||||
package com.baiye;
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* 开发协议jpa shard2应用程序
|
||||
*
|
||||
* @author q
|
||||
* @date 2021/11/30
|
||||
*/
|
||||
@SpringBootApplication
|
||||
public class DevProtocolJpaShard2Application {
|
||||
public static void main(String[] args) {
|
||||
// todo 这里先拿到上下文一会检查下配置
|
||||
ConfigurableApplicationContext context = new SpringApplicationBuilder(DevProtocolJpaShard2Application.class)
|
||||
.run(args);
|
||||
|
||||
List<String> beanNames = new ArrayList<>(Arrays.asList("db1DataSource", "db2DataSource"));
|
||||
// 检查Beans加载
|
||||
checkBeansWithName(context, beanNames);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 检查指定Bean的注册
|
||||
*
|
||||
* @param context
|
||||
*/
|
||||
private static void checkBeansWithName(ConfigurableApplicationContext context, List<String> beanNames){
|
||||
|
||||
Iterator<String> beanNamesIterator = context.getBeanFactory().getBeanNamesIterator();
|
||||
|
||||
AtomicInteger i = new AtomicInteger();
|
||||
while (beanNamesIterator.hasNext()) {
|
||||
String next = beanNamesIterator.next();
|
||||
|
||||
beanNames.forEach(
|
||||
one->{
|
||||
if (!next.equalsIgnoreCase(one)) {
|
||||
return;
|
||||
}
|
||||
System.out.println("bean number is : " + (i.getAndIncrement()) + ", name is : " + next);
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -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,39 @@
|
||||
package com.baiye.web;
|
||||
|
||||
import com.baiye.configuration.DataSourceRoutingHolder;
|
||||
import com.baiye.configuration.RoutingDataSourceEnum;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
/**
|
||||
* 数据源拦截器
|
||||
*
|
||||
* @author q
|
||||
* @date 2021/11/30
|
||||
*/
|
||||
@Component
|
||||
public class DataSourceInterceptor extends HandlerInterceptorAdapter {
|
||||
|
||||
/**
|
||||
* 请求处理之前更改线程里面的数据源
|
||||
*/
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request,
|
||||
HttpServletResponse response, Object handler) throws Exception {
|
||||
String dbRouting = request.getHeader("db-routing");
|
||||
DataSourceRoutingHolder.setBranchContext(RoutingDataSourceEnum.findbyCode(dbRouting));
|
||||
return super.preHandle(request, response, handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求结束之后清理线程里面的数据源
|
||||
*/
|
||||
@Override
|
||||
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
|
||||
super.afterCompletion(request, response, handler, ex);
|
||||
DataSourceRoutingHolder.clearBranchContext();
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
# 加载不同的配置文件,进行配置文件分离
|
||||
spring:
|
||||
profiles:
|
||||
include:
|
||||
- jpa
|
||||
# - shardingSphere
|
||||
# - dynamicDatasource
|
@ -0,0 +1,12 @@
|
||||
# 基本配置
|
||||
server:
|
||||
port: 8900
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: dev-protocol-jpashard1
|
||||
# 加载不同环境
|
||||
profiles:
|
||||
active: dev
|
||||
main:
|
||||
allow-bean-definition-overriding: true
|
@ -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
|
Binary file not shown.
After Width: | Height: | Size: 184 KiB |
Loading…
Reference in New Issue