springjpa的多数据源使用方法(with springboot)

网上大牛们的建议:一个系统最好一个数据源,多个数据源考虑使用微服务。

一、开发环境:

1.maven(version3.8.1)依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

2.java版本:17

3.springboot版本:2.7.4

4.mysql5.8

二、开发步骤

包路径约定:com.example.multiple-database.one 下放数据库1对应的类,com.example.multiple-database.two下放数据库2对应的类

1.在配置文件application.properties里添加参数:

spring.jpa.open-in-view=false

spring.datasource.jdbc-url=jdbc:mysql://127.0.0.1:3306/my_database_one?useUnicode=true&characterEncoding=UTF-8&useSSL=true&serverTimezone=Asia/Shanghai
spring.datasource.username=your database one username
spring.datasource.password=your database one password

spring.second-datasource.jdbc-url=jdbc:mysql://127.0.0.1:3306/my_database_two?useUnicode=true&characterEncoding=UTF-8&useSSL=true&serverTimezone=Asia/Shanghai
spring.second-datasource.username=your database two username
spring.second-datasource.password=your database two password

2.添加数据库1的配置类

package com.example.multiple-database.config;

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 org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
@EnableJpaRepositories(
        basePackages = "com.example.multiple-database.one",
        entityManagerFactoryRef = "dbOneEntityManager",         //对应下面定义的entityManager函数名字
        transactionManagerRef = "dbOneTransactionManager") //对应下面事务管理的函数名字
public class DatabaseOneConfig {
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dbOneDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean dbOneEntityManager(){
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();

        em.setDataSource(mainDataSource());
        em.setPackagesToScan("com.example.multiple-database.one"); //这个包路径下放跟dbOne相关的类
        HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(adapter);
        Map<String, Object> properties = new HashMap<>();
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");
        properties.put("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy");
        properties.put("hibernate.implicit_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
        em.setJpaPropertyMap(properties);

        return em;
    }

    @Bean
    @Primary
    public PlatformTransactionManager dbOneTransactionManager(){
        JpaTransactionManager manager = new JpaTransactionManager();
        manager.setEntityManagerFactory(dbOneEntityManager().getObject());
        return manager;
    }

}

3.添加数据库2的配置类

package com.example.multiple-database.config;

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.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
@EnableJpaRepositories(
        basePackages = "com.example.multiple-database.two",
        entityManagerFactoryRef = "dbTwoEntityManager", //对应下面实体类管理函数名
        transactionManagerRef = "dbTwoTransactionManager")//对应下面事务管理函数名
public class DatabaseTwoConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.second-datasource")
    public DataSource oldDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean dbTwoEntityManager(){
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();

        em.setDataSource(oldDataSource());
        em.setPackagesToScan("com.example.multiple-database.two"); //数据库2的实体类扫描路径
        HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(adapter);
        Map<String, Object> properties = new HashMap<>();
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");
        properties.put("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy");
        properties.put("hibernate.implicit_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
        em.setJpaPropertyMap(properties);

        return em;
    }

    @Bean
    public PlatformTransactionManager dbTwoTransactionManager(){
        JpaTransactionManager manager = new JpaTransactionManager();
        manager.setEntityManagerFactory(dbTwoEntityManager().getObject());
        return manager;
    }

}

三、使用

1.查询:跟单数库使用好像没啥区别

2.(增删改)事务:
   @Transactional
   public void save(Project project){
        projectRepository.save(project);
   }
 

更多参考:

Spring JPA – Multiple Databases | Baeldung

猜你喜欢

转载自blog.csdn.net/miaowansheng/article/details/127294203