spring怎么建两个数据源

worktile 其他 24

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Spring框架中,我们可以通过配置多个数据源来实现对多个数据库的操作。下面我将介绍两种常用的方法来建立两个数据源。

    方法一:使用Spring的注解配置方式

    1. 引入相关依赖:在项目的pom.xml文件中添加以下依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    
    1. 创建数据源类:新建两个数据源类,分别用于配置不同的数据源连接信息,例如DataSource1和DataSource2。
    @Configuration
    public class DataSource1 {
    
        @Bean
        @ConfigurationProperties(prefix = "spring.datasource.db1")
        public DataSource dataSource1() {
            return DataSourceBuilder.create().build();
        }
    }
    
    @Configuration
    public class DataSource2 {
    
        @Bean
        @ConfigurationProperties(prefix = "spring.datasource.db2")
        public DataSource dataSource2() {
            return DataSourceBuilder.create().build();
        }
    }
    

    其中,"spring.datasource.db1"和"spring.datasource.db2"为配置文件中数据库连接的前缀。

    1. 配置JPA实体管理工厂:创建一个名为EntityManagerFactory1和EntityManagerFactory2的类,用于配置两个数据源的JPA实体管理工厂。
    @Configuration
    @EnableJpaRepositories(basePackages = "com.example.repository.db1",
            entityManagerFactoryRef = "entityManagerFactory1",
            transactionManagerRef = "transactionManager1")
    public class EntityManagerFactory1 {
    
        @Autowired
        @Qualifier("dataSource1")
        private DataSource dataSource1;
    
        @Primary
        @Bean(name = "entityManagerFactory1")
        public LocalEntityManagerFactoryBean entityManagerFactory1(EntityManagerFactoryBuilder builder) {
            return builder
                    .dataSource(dataSource1)
                    .packages("com.example.entity.db1") //实体类所在包路径
                    .persistenceUnit("db1")
                    .build();
        }
    
        @Bean(name = "transactionManager1")
        public PlatformTransactionManager transactionManager1(EntityManagerFactoryBuilder builder) {
            return new JpaTransactionManager(entityManagerFactory1(builder).getObject());
        }
    }
    
    @Configuration
    @EnableJpaRepositories(basePackages = "com.example.repository.db2",
            entityManagerFactoryRef = "entityManagerFactory2",
            transactionManagerRef = "transactionManager2")
    public class EntityManagerFactory2 {
    
        @Autowired
        @Qualifier("dataSource2")
        private DataSource dataSource2;
    
        @Bean(name = "entityManagerFactory2")
        public LocalEntityManagerFactoryBean entityManagerFactory2(EntityManagerFactoryBuilder builder) {
            return builder
                    .dataSource(dataSource2)
                    .packages("com.example.entity.db2") //实体类所在包路径
                    .persistenceUnit("db2")
                    .build();
        }
    
        @Bean(name = "transactionManager2")
        public PlatformTransactionManager transactionManager2(EntityManagerFactoryBuilder builder) {
            return new JpaTransactionManager(entityManagerFactory2(builder).getObject());
        }
    }
    

    其中,com.example.repository.db1和com.example.repository.db2分别为两个数据源对应的repository包路径,com.example.entity.db1和com.example.entity.db2分别为两个数据源对应的实体类所在包路径。

    1. 配置多个数据源的相关配置信息:在配置文件application.properties(application.yml)中添加以下配置,分别设置两个数据源的连接信息。
    # DataSource 1
    spring.datasource.db1.url=jdbc:mysql://localhost:3306/db1
    spring.datasource.db1.username=root
    spring.datasource.db1.password=root
    spring.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driver
    
    # DataSource 2
    spring.datasource.db2.url=jdbc:mysql://localhost:3306/db2
    spring.datasource.db2.username=root
    spring.datasource.db2.password=root
    spring.datasource.db2.driver-class-name=com.mysql.cj.jdbc.Driver
    

    至此,两个数据源的配置就完成了。接下来,我们可以在具体的业务逻辑中使用对应的数据源来进行数据操作。

    方法二:使用Spring Boot的自动配置方式
    在Spring Boot中,我们可以通过在application.properties(application.yml)中进行配置来自动创建并配置多个数据源。

    1. 配置多个数据源的相关配置信息:在配置文件application.properties(application.yml)中添加以下配置,分别设置两个数据源的连接信息。
    # DataSource 1
    spring.datasource.db1.url=jdbc:mysql://localhost:3306/db1
    ...
    # DataSource 2
    spring.datasource.db2.url=jdbc:mysql://localhost:3306/db2
    ...
    
    1. 配置JPA实体管理工厂:使用@EnableJpaRepositories注解来启用JPA自动配置,并在声明repository接口时,使用注解@Qualifier来指定对应的数据源。
    @Configuration
    @EnableJpaRepositories(basePackages = "com.example.repository.db1",
            entityManagerFactoryRef = "entityManagerFactory1",
            transactionManagerRef = "transactionManager1")
    public class EntityManagerFactory1 {
    
        @Autowired
        @Qualifier("dataSource1")
        private DataSource dataSource1;
    
        @Primary
        @Bean(name = "entityManagerFactory1")
        public LocalEntityManagerFactoryBean entityManagerFactory1(EntityManagerFactoryBuilder builder) {
            return builder
                    .dataSource(dataSource1)
                    .packages("com.example.entity.db1") //实体类所在包路径
                    .persistenceUnit("db1")
                    .build();
        }
    
        @Bean(name = "transactionManager1")
        public PlatformTransactionManager transactionManager1(EntityManagerFactoryBuilder builder) {
            return new JpaTransactionManager(entityManagerFactory1(builder).getObject());
        }
    }
    
    @Configuration
    @EnableJpaRepositories(basePackages = "com.example.repository.db2",
            entityManagerFactoryRef = "entityManagerFactory2",
            transactionManagerRef = "transactionManager2")
    public class EntityManagerFactory2 {
    
        @Autowired
        @Qualifier("dataSource2")
        private DataSource dataSource2;
    
        @Bean(name = "entityManagerFactory2")
        public LocalEntityManagerFactoryBean entityManagerFactory2(EntityManagerFactoryBuilder builder) {
            return builder
                    .dataSource(dataSource2)
                    .packages("com.example.entity.db2") //实体类所在包路径
                    .persistenceUnit("db2")
                    .build();
        }
    
        @Bean(name = "transactionManager2")
        public PlatformTransactionManager transactionManager2(EntityManagerFactoryBuilder builder) {
            return new JpaTransactionManager(entityManagerFactory2(builder).getObject());
        }
    }
    

    至此,两个数据源的配置和使用就完成了。通过以上的方法,我们可以在Spring中建立两个数据源,并实现对每个数据源的CRUD操作。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Spring中建立两个数据源可以通过以下步骤完成:

    1. 引入相关依赖
      pom.xml文件中引入Spring JDBC和数据库驱动的依赖,例如MySQL、HikariCP等。

    2. 配置第一个数据源
      application.properties(或者application.yml)文件中配置第一个数据源的相关属性,包括数据库驱动类、数据库URL、用户名和密码等。例如:

    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/db1
    spring.datasource.username=root
    spring.datasource.password=123456
    
    1. 配置第二个数据源
      类似地,在application.properties(或者application.yml)文件中配置第二个数据源的相关属性,例如:
    spring.datasource2.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource2.url=jdbc:mysql://localhost:3306/db2
    spring.datasource2.username=root
    spring.datasource2.password=123456
    
    1. 创建第一个数据源的配置类
      创建一个配置类来配置第一个数据源的DataSource实例。可以使用@Configuration注解标记该类,并使用@Bean注解配置数据源。例如:
    @Configuration
    public class DataSource1Config {
    
        @Autowired
        private Environment env;
    
        @Bean
        public DataSource dataSource1() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
            dataSource.setUrl(env.getProperty("spring.datasource.url"));
            dataSource.setUsername(env.getProperty("spring.datasource.username"));
            dataSource.setPassword(env.getProperty("spring.datasource.password"));
            return dataSource;
        }
    }
    
    1. 创建第二个数据源的配置类
      类似地,创建一个配置类来配置第二个数据源的DataSource实例。例如:
    @Configuration
    public class DataSource2Config {
    
        @Autowired
        private Environment env;
    
        @Bean
        public DataSource dataSource2() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(env.getProperty("spring.datasource2.driver-class-name"));
            dataSource.setUrl(env.getProperty("spring.datasource2.url"));
            dataSource.setUsername(env.getProperty("spring.datasource2.username"));
            dataSource.setPassword(env.getProperty("spring.datasource2.password"));
            return dataSource;
        }
    }
    
    1. 使用数据源
      在需要使用数据源的地方,通过@Qualifier注解指定具体使用哪个数据源。例如,可以在Repository层的接口上使用@Qualifier注解指定具体使用哪个数据源。例如:
    @Repository
    @Qualifier("dataSource1")
    public interface UserRepository1 extends JpaRepository<User, Long> {
    
        // ...
    }
    

    同样的,也可以在另一个接口中使用@Qualifier注解指定另一个数据源:

    @Repository
    @Qualifier("dataSource2")
    public interface UserRepository2 extends JpaRepository<User, Long> {
    
        // ...
    }
    

    通过以上步骤,就可以在Spring中建立两个数据源,并在不同的地方使用不同的数据源。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    在Spring框架中,建立两个数据源可以通过以下步骤完成:

    1. 配置数据源连接信息:
      在Spring的配置文件(例如application.properties或application.yml)中,配置两个数据库连接信息。例如,可以为每个数据源定义以下属性:

      数据源1:

      spring.datasource.db1.url=jdbc:mysql://localhost:3306/db1
      spring.datasource.db1.username=db1user
      spring.datasource.db1.password=db1password
      spring.datasource.db1.driverClassName=com.mysql.jdbc.Driver
      

      数据源2:

      spring.datasource.db2.url=jdbc:mysql://localhost:3306/db2
      spring.datasource.db2.username=db2user
      spring.datasource.db2.password=db2password
      spring.datasource.db2.driverClassName=com.mysql.jdbc.Driver
      

      这里的url、username、password和driverClassName需要根据具体的数据库连接信息进行修改。

    2. 创建数据源配置类:
      在Spring的配置类中,创建两个数据源配置类,分别为每个数据源定义对应的DataSource、JdbcTemplate和事务管理器。例如,可以创建如下两个配置类:

      数据源1配置类:

      @Configuration
      @EnableTransactionManagement
      public class DB1Config {
      
          @Bean(name = "db1DataSource")
          @Primary
          @ConfigurationProperties(prefix = "spring.datasource.db1")
          public DataSource db1DataSource() {
              return DataSourceBuilder.create().build();
          }
      
          @Bean(name = "db1JdbcTemplate")
          public JdbcTemplate db1JdbcTemplate(
                  @Qualifier("db1DataSource") DataSource db1DataSource) {
              return new JdbcTemplate(db1DataSource);
          }
      
          @Bean(name = "db1TransactionManager")
          public PlatformTransactionManager db1TransactionManager(
                  @Qualifier("db1DataSource") DataSource db1DataSource) {
              return new DataSourceTransactionManager(db1DataSource);
          }
      }
      

      数据源2配置类:

      @Configuration
      @EnableTransactionManagement
      public class DB2Config {
      
          @Bean(name = "db2DataSource")
          @ConfigurationProperties(prefix = "spring.datasource.db2")
          public DataSource db2DataSource() {
              return DataSourceBuilder.create().build();
          }
      
          @Bean(name = "db2JdbcTemplate")
          public JdbcTemplate db2JdbcTemplate(
                  @Qualifier("db2DataSource") DataSource db2DataSource) {
              return new JdbcTemplate(db2DataSource);
          }
      
          @Bean(name = "db2TransactionManager")
          public PlatformTransactionManager db2TransactionManager(
                  @Qualifier("db2DataSource") DataSource db2DataSource) {
              return new DataSourceTransactionManager(db2DataSource);
          }
      }
      

      这里使用了Spring的注解@Configuration、@Bean、@EnableTransactionManagement等来定义数据源和事务管理器。

    3. 使用数据源:
      现在可以在需要使用数据源的地方注入对应的JdbcTemplate或事务管理器,然后使用它们来执行数据库操作。例如,可以在服务类中注入JdbcTemplate,并通过它执行SQL语句:

      @Service
      public class MyService {
      
          @Autowired
          @Qualifier("db1JdbcTemplate")
          private JdbcTemplate db1JdbcTemplate;
      
          @Autowired
          @Qualifier("db2JdbcTemplate")
          private JdbcTemplate db2JdbcTemplate;
      
          public void doSomething() {
              // 使用db1JdbcTemplate执行数据库操作
              db1JdbcTemplate.update("INSERT INTO table1 (column1) VALUES (?)", "value1");
      
              // 使用db2JdbcTemplate执行数据库操作
              db2JdbcTemplate.update("INSERT INTO table2 (column1) VALUES (?)", "value2");
          }
      }
      

      这样,就可以分别使用两个数据源进行数据库操作了。

    以上是在Spring中建立两个数据源的基本步骤。根据具体需求,还可以进行进一步的定制,例如配置多个数据源,使用不同的事务管理器等。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部