[新增功能](master): 整合多数据源

JPA整合多数据源来实现
现在就是在JPA + ShardingJDBC + 热切换数据源 的时候会有点问题
master
土豆兄弟 3 years ago
parent 24f37e5382
commit 58160cc13c

@ -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,57 @@
<?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>jpa-multi-data-source</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>
</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</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,29 @@
package com.baiye;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter;
@SpringBootApplication
public class JpaMultiDataSourceApplication {
public static void main(String[] args) {
SpringApplication.run(JpaMultiDataSourceApplication.class, args);
}
/**
* open-in-view=false使 no session
*
* OpenEntityManagerInViewFiltersessionwebsession
*/
@Bean
public FilterRegistrationBean<OpenEntityManagerInViewFilter> openEntityManagerInViewFilterFilterRegistrationBean(){
FilterRegistrationBean<OpenEntityManagerInViewFilter> filterRegistrationBean = new FilterRegistrationBean<>();
OpenEntityManagerInViewFilter filter = new OpenEntityManagerInViewFilter();
filterRegistrationBean.setFilter(filter);
filterRegistrationBean.setOrder(5);
return filterRegistrationBean;
}
}

@ -0,0 +1,36 @@
package com.baiye.conf;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfiguration {
/**
*
* @return
*/
@Bean(name = "dataSourceFirst")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.first")
public DataSource dataSourceFirst() {
//这种方式的配置默认只满足spring的配置方式如果使用其他数据连接druid,需要自己独立获取配置
return DataSourceBuilder.create().build();
}
/**
*
* @return
*/
@Bean(name = "dataSourceSecond")
@ConfigurationProperties(prefix = "spring.datasource.second")
public DataSource dataSourceSecond() {
return DataSourceBuilder.create().build();
}
}

@ -0,0 +1,108 @@
package com.baiye.conf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;
import java.util.Objects;
/**
* jpa
*
* 1
* 2ref
* 3
*/
@Configuration
@EntityScan(basePackages = "com.baiye.domain.first")
@EnableJpaRepositories(
basePackages = "com.baiye.domain.first",
entityManagerFactoryRef = "firstEntityManagerFactoryBean",
transactionManagerRef = "firstTransactionManager")
@EnableTransactionManagement
public class JpaFirstConfiguration {
@Autowired
private HibernateProperties hibernateProperties;
/**
* Qualifier
*/
@Autowired
@Qualifier("dataSourceFirst")
private DataSource dataSource;
/**
* jpa
*/
@Autowired
private JpaProperties jpaProperties;
/**
* builder
*/
@Autowired
private EntityManagerFactoryBuilder factoryBuilder;
/**
* bean
*
* @return
*/
@Bean(name = "firstEntityManagerFactoryBean")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
Map<String, Object> properties = hibernateProperties
.determineHibernateProperties(
jpaProperties.getProperties(),
new HibernateSettings()
);
return factoryBuilder.dataSource(dataSource)
//这一行的目的是加入jpa的其他配置参数比如ddl-auto: update等
//当然这个参数配置可以在事务配置的时候也可以
.properties(properties)
.packages("com.baiye.domain.first")
.persistenceUnit("firstPersistenceUnit")
.build();
}
/**
* EntityManagerjpa
* @return
*/
@Bean(name = "firstEntityManager")
@Primary
public EntityManager entityManager() {
return Objects.requireNonNull(entityManagerFactoryBean().getObject()).createEntityManager();
}
/**
* jpa
* @return
*/
@Bean(name = "firstTransactionManager")
@Primary
public JpaTransactionManager transactionManager() {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
return jpaTransactionManager;
}
}

@ -0,0 +1,100 @@
package com.baiye.conf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;
import java.util.Objects;
/**
* jpa
*
* 1
* 2ref
* 3
*/
@Configuration
@EntityScan(basePackages = "com.baiye.domain.second")
@EnableJpaRepositories(
basePackages = "com.baiye.domain.second",
entityManagerFactoryRef = "secondEntityManagerFactoryBean",
transactionManagerRef = "secondTransactionManager")
@EnableTransactionManagement
public class JpaSecondConfiguration {
@Autowired
private HibernateProperties hibernateProperties;
/**
* Qualifier
*/
@Autowired
@Qualifier("dataSourceSecond")
private DataSource dataSource;
/**
* jpa
*/
@Autowired
private JpaProperties jpaProperties;
/**
* builder
*/
@Autowired
private EntityManagerFactoryBuilder factoryBuilder;
/**
* bean
*
* @return
*/
@Bean(name = "secondEntityManagerFactoryBean")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
Map<String, Object> properties = hibernateProperties.determineHibernateProperties(
jpaProperties.getProperties(),
new HibernateSettings()
);
return factoryBuilder.dataSource(dataSource)
.properties(properties)
.packages("com.baiye.domain.second")
.persistenceUnit("secondPersistenceUnit")
.build();
}
/**
* EntityManagerjpa
*
* @return
*/
@Bean(name = "secondEntityManager")
public EntityManager entityManager() {
return Objects.requireNonNull(entityManagerFactoryBean().getObject()).createEntityManager();
}
/**
* jpa
*
* @return
*/
@Bean(name = "secondTransactionManager")
public JpaTransactionManager transactionManager() {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
return jpaTransactionManager;
}
}

@ -1,6 +1,6 @@
package com.baiye.dao; package com.baiye.dao;
import com.baiye.domain.Price; import com.baiye.domain.first.Price;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
public interface PriceRepository extends JpaRepository<Price,Integer> { public interface PriceRepository extends JpaRepository<Price,Integer> {

@ -1,6 +1,6 @@
package com.baiye.dao; package com.baiye.dao;
import com.baiye.domain.User; import com.baiye.domain.second.User;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
/** /**

@ -0,0 +1,22 @@
package com.baiye.domain.first;
import lombok.Data;
import javax.persistence.*;
import java.math.BigDecimal;
@Entity
@Data
@Table(name = "price")
public class Price {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Integer id;
@Column(name = "user_id")
private Integer userId;
@Column(name = "cost")
private BigDecimal cost;
}

@ -0,0 +1,20 @@
package com.baiye.domain.second;
import lombok.Data;
import javax.persistence.*;
@Entity
@Data
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Integer id;
private String name;
private String city;
}

@ -0,0 +1,23 @@
server:
port: 8082
spring:
datasource:
first:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/master-1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true
username: root
password: root
second:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/slave-1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true
username: root
password: root
jpa:
hibernate:
ddl-auto: update
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
database: mysql

@ -9,6 +9,7 @@
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<modules> <modules>
<module>sharding-multiple-data-sources</module> <module>sharding-multiple-data-sources</module>
<module>jpa-multi-data-source</module>
</modules> </modules>
<properties> <properties>

@ -49,10 +49,10 @@
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
</dependency> </dependency>
<!-- <dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>--> </dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>

@ -5,7 +5,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter; import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/** /**
* @author q * @author q

@ -0,0 +1,120 @@
package com.baiye.config;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.apache.shardingsphere.shardingjdbc.jdbc.adapter.AbstractDataSourceAdapter;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Map;
/**
*
*
* 使{@link com.baomidou.dynamic.datasource.annotation.DS}
*
* <code>@DS(DataSourceConfiguration.SHARDING_DATA_SOURCE_NAME)</code>
*
* @author q
*/
@Configurable
@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class,
SpringBootConfiguration.class})
public class DataSourceConfiguration {
/**
*
*/
private static final String SHARDING_DATA_SOURCE_NAME = "sharding_ds";
@Resource
private DynamicDataSourceProperties properties;
/**
* shardingjdbc
*
* <p>1. 使, (): shardingDataSource;
* <p>2. : masterSlaveDataSource;
* <p>3. encryptDataSource;
* <p>4. shadowDataSource
*
* fixme springLazy lazy
*
*/
@Lazy
@Resource(name = "masterSlaveDataSource")
AbstractDataSourceAdapter shardingDataSource;
@Bean
public DynamicDataSourceProvider dynamicDataSourceProvider() {
Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();
return new AbstractDataSourceProvider() {
@Override
public Map<String, DataSource> loadDataSources() {
Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);
// 将 shardingjdbc 管理的数据源也交给动态数据源管理
dataSourceMap.put(SHARDING_DATA_SOURCE_NAME, shardingDataSource);
//打开下面的代码可以把 shardingJdbc 内部管理的子数据源也同时添加到动态数据源里 (根据自己需要选择开启)
// dataSourceMap.putAll(((MasterSlaveDataSource) masterSlaveDataSource).getDataSourceMap());
return dataSourceMap;
}
};
}
/**
*
* spring,
* shardingjdbc
* 3.4.0使, -
*/
@Primary
@Bean
public DataSource dataSource() {
DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
dataSource.setPrimary(properties.getPrimary());
dataSource.setStrict(properties.getStrict());
dataSource.setStrategy(properties.getStrategy());
dataSource.setP6spy(properties.getP6spy());
dataSource.setSeata(properties.getSeata());
return dataSource;
}
/**
*
* @return
*/
@Bean(name = "dataSourceFirst")
@ConfigurationProperties(prefix = "spring.datasource.first")
public DataSource dataSourceFirst() {
//这种方式的配置默认只满足spring的配置方式如果使用其他数据连接druid,需要自己独立获取配置
return DataSourceBuilder.create().build();
}
/**
*
* @return
*/
@Bean(name = "dataSourceSecond")
@ConfigurationProperties(prefix = "spring.datasource.second")
public DataSource dataSourceSecond() {
return DataSourceBuilder.create().build();
}
}

@ -0,0 +1,108 @@
package com.baiye.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;
import java.util.Objects;
/**
* jpa
*
* 1
* 2ref
* 3
*/
@Configuration
@EntityScan(basePackages = "com.baiye.domain.first")
@EnableJpaRepositories(
basePackages = "com.baiye.domain.first",
entityManagerFactoryRef = "firstEntityManagerFactoryBean",
transactionManagerRef = "firstTransactionManager")
@EnableTransactionManagement
public class JpaFirstConfiguration {
@Autowired
private HibernateProperties hibernateProperties;
/**
* Qualifier
*/
@Autowired
@Qualifier("dataSourceFirst")
private DataSource dataSource;
/**
* jpa
*/
@Autowired
private JpaProperties jpaProperties;
/**
* builder
*/
@Autowired
private EntityManagerFactoryBuilder factoryBuilder;
/**
* bean
*
* @return
*/
@Bean(name = "firstEntityManagerFactoryBean")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
Map<String, Object> properties = hibernateProperties
.determineHibernateProperties(
jpaProperties.getProperties(),
new HibernateSettings()
);
return factoryBuilder.dataSource(dataSource)
//这一行的目的是加入jpa的其他配置参数比如ddl-auto: update等
//当然这个参数配置可以在事务配置的时候也可以
.properties(properties)
.packages("com.baiye.domain.first")
.persistenceUnit("firstPersistenceUnit")
.build();
}
/**
* EntityManagerjpa
* @return
*/
@Bean(name = "firstEntityManager")
@Primary
public EntityManager entityManager() {
return Objects.requireNonNull(entityManagerFactoryBean().getObject()).createEntityManager();
}
/**
* jpa
* @return
*/
@Bean(name = "firstTransactionManager")
@Primary
public JpaTransactionManager transactionManager() {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
return jpaTransactionManager;
}
}

@ -0,0 +1,100 @@
package com.baiye.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;
import java.util.Objects;
/**
* jpa
*
* 1
* 2ref
* 3
*/
@Configuration
@EntityScan(basePackages = "com.baiye.domain.second")
@EnableJpaRepositories(
basePackages = "com.baiye.domain.second",
entityManagerFactoryRef = "secondEntityManagerFactoryBean",
transactionManagerRef = "secondTransactionManager")
@EnableTransactionManagement
public class JpaSecondConfiguration {
@Autowired
private HibernateProperties hibernateProperties;
/**
* Qualifier
*/
@Autowired
@Qualifier("dataSourceSecond")
private DataSource dataSource;
/**
* jpa
*/
@Autowired
private JpaProperties jpaProperties;
/**
* builder
*/
@Autowired
private EntityManagerFactoryBuilder factoryBuilder;
/**
* bean
*
* @return
*/
@Bean(name = "secondEntityManagerFactoryBean")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
Map<String, Object> properties = hibernateProperties.determineHibernateProperties(
jpaProperties.getProperties(),
new HibernateSettings()
);
return factoryBuilder.dataSource(dataSource)
.properties(properties)
.packages("com.baiye.domain.second")
.persistenceUnit("secondPersistenceUnit")
.build();
}
/**
* EntityManagerjpa
*
* @return
*/
@Bean(name = "secondEntityManager")
public EntityManager entityManager() {
return Objects.requireNonNull(entityManagerFactoryBean().getObject()).createEntityManager();
}
/**
* jpa
*
* @return
*/
@Bean(name = "secondTransactionManager")
public JpaTransactionManager transactionManager() {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
return jpaTransactionManager;
}
}

@ -0,0 +1,7 @@
package com.baiye.dao.first;
import com.baiye.domain.first.Price;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PriceRepository extends JpaRepository<Price,Integer> {
}

@ -0,0 +1,14 @@
package com.baiye.dao.second;
import com.baiye.domain.second.User;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* user -> test_sharding_1
*
*
*
* @author q
*/
public interface UserRepository extends JpaRepository<User,Integer> {
}

@ -1,4 +1,4 @@
package com.baiye.domain; package com.baiye.domain.second;
import lombok.Data; import lombok.Data;

@ -3,6 +3,7 @@ package com.baiye.service;
import com.baiye.dao.OrderRepository; import com.baiye.dao.OrderRepository;
import com.baiye.domain.Order; import com.baiye.domain.Order;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.apache.shardingsphere.transaction.annotation.ShardingTransactionType; import org.apache.shardingsphere.transaction.annotation.ShardingTransactionType;
import org.apache.shardingsphere.transaction.core.TransactionType; import org.apache.shardingsphere.transaction.core.TransactionType;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -16,6 +17,7 @@ import java.util.Optional;
* @author q * @author q
*/ */
@Service @Service
@DS("sharding_ds")
public class ShardService { public class ShardService {
@Autowired @Autowired
@ -24,6 +26,7 @@ public class ShardService {
/** /**
* *
*/ */
@DS("sharding_ds")
public Order insertOne(Order order) { public Order insertOne(Order order) {
return orderRepository.save(order); return orderRepository.save(order);
} }
@ -31,10 +34,12 @@ public class ShardService {
/** /**
* *
*/ */
@DS("sharding_ds")
public List<Order> batchInsert(List<Order> orders) { public List<Order> batchInsert(List<Order> orders) {
return orderRepository.saveAll(orders); return orderRepository.saveAll(orders);
} }
@DS("sharding_ds")
public Order queryOne(Long id) { public Order queryOne(Long id) {
Optional<Order> optional = orderRepository.findById(id); Optional<Order> optional = orderRepository.findById(id);
return optional.orElse(null); return optional.orElse(null);
@ -44,6 +49,7 @@ public class ShardService {
/** /**
* *
*/ */
@DS("sharding_ds")
public List<Order> queryByCondition(List<Long> ids) { public List<Order> queryByCondition(List<Long> ids) {
return orderRepository.findAllById(ids); return orderRepository.findAllById(ids);
} }
@ -55,6 +61,7 @@ public class ShardService {
*/ */
@Transactional(value = "transactionManager") @Transactional(value = "transactionManager")
@ShardingTransactionType(TransactionType.XA) @ShardingTransactionType(TransactionType.XA)
@DS("sharding_ds")
public Order updateByCondition(Order order) { public Order updateByCondition(Order order) {
return orderRepository.save(order); return orderRepository.save(order);
} }
@ -62,6 +69,7 @@ public class ShardService {
/** /**
* *
*/ */
@DS("sharding_ds")
public void deleterByCondition(Order order) { public void deleterByCondition(Order order) {
orderRepository.delete(order); orderRepository.delete(order);
} }

@ -1,3 +1,4 @@
# ??????
spring.shardingsphere.datasource.names=ds0,ds1 spring.shardingsphere.datasource.names=ds0,ds1
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
@ -20,4 +21,20 @@ spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-col
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{user_id % 2} spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{user_id % 2}
spring.shardingsphere.sharding.tables.t_order.key-generator.column=id spring.shardingsphere.sharding.tables.t_order.key-generator.column=id
spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.tables.t_order.key-generator.props.worker.id=13
# ??????
spring.datasource.primary.key=ds-1
spring.datasource.primary.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.primary.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.primary.url=jdbc:mysql://127.0.0.1:3306/master-1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.secondary.key=ds-2
spring.datasource.secondary.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.secondary.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.url=jdbc:mysql://127.0.0.1:3306/slave-2?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root

@ -5,10 +5,29 @@ spring:
name: sharding-multiple-data-sources name: sharding-multiple-data-sources
profiles: profiles:
active: sharddb active: sharddb
# jpa配置
jpa: jpa:
properties: properties:
hibernate: hibernate:
show_sql: true show_sql: true
ddl-auto: update
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
database: mysql database: mysql
open-in-view: false # true会让数据库连接绑定请求线程,jpa查询是只读事务,会造成主从不能切换!
main: main:
allow-bean-definition-overriding: true allow-bean-definition-overriding: true
# 多数据源配置
datasource:
first:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/master-1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true
username: root
password: root
second:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/slave-1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true
username: root
password: root
Loading…
Cancel
Save