在Spring Boot 2中定义和使用两个数据源

时间:2019-03-04 10:35:43

标签: java spring spring-boot spring-data-jpa spring-data

我知道,在理论上,这里几乎回答了相同的问题:Spring Boot Configure and Use Two DataSources 不过,我认为这并不全面。无论如何,我仍然不明白,Spring Boot 2的最少代码量和最优雅的解决方案是什么(我正在使用Spring Boot 2.1.2)。

这是我的两个数据源配置类:

package pl.viola.OrderChecker.Configuration;

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 MultipleDataSourceConfiguration {

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.second-datasource")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}

...这是我的application.configuration文件内容:

# Postgres data source 1
spring.datasource.jdbc-url=jdbc:postgresql://******.**:****/*****
spring.datasource.username= ***
spring.datasource.password=***
#spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQL9Dialect
spring.jpa.generate.ddl = none
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
hibernate.hbm2ddl.auto = none



# Mysql data source 1

ssh.tunnel.url=******************
ssh.tunnel.username=*****
ssh.tunnel.password=***

spring.second-datasource.jdbc-url=jdbc:mysql://127.0.0.1:****/****.**
spring.second-datasource.username=***
spring.second-datasource.password=***

...这是我的存储库之一(用于Mysql)

package pl.viola.OrderChecker.DAO.ViolaPlRepositories;

import org.springframework.data.repository.CrudRepository;
import pl.viola.OrderChecker.model.ViolaPl.Orders;

public interface OrdersRepository
     extends CrudRepository<Orders, Integer> {}

...和我的实体(对于Mysql)

package pl.viola.OrderChecker.model.ViolaPl;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.sql.Timestamp;

@Entity
@Getter
@Setter
@Table(name = "ps_orders")


public class Orders {

    @Id
    private int id_order;
    private String reference;
    private int id_shop_group;
    private int id_shop;
    private int id_carrier;
        private int id_lang;
(...)
    }

...和我的项目树:

enter image description here

这是我尝试在控制器中使用第二个(Mysql)数据源的方式:

public @ResponseBody Iterable<Orders> getAllOrders() {

        try {
            sshTunnelStarter.init();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return ordersRepository.findAll();
    }

现在,使用第一个数据源(Postgres)当然不会有任何问题,因为它被标记为主要数据,并且无论我执行的是什么数据源操作,它都是主要的数据源。 另外,我读了https://www.baeldung.com/spring-data-jpa-multiple-databases 教程以及从我发现的内容中,我仍然不清楚我所缺少的内容。我的意思是,如果您没有使用Spring Boot 2,那么肯定没有两个配置类来定义实体的以下接口:DataSource,EntityManagerFactory,TransactionManager。我的问题是,其中的样板代码在哪里(根据作者的说法,Spring Boot并不需要)。

因此再次指出:在我的情况下,定义和使用两个数据源所需的最少代码量是多少? 谢谢你。

0 个答案:

没有答案