程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Spring Boot JPA中的动态数据源大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_616_0@如何解决Spring Boot JPA中的动态数据源? 开发过程中遇到Spring Boot JPA中的动态数据源的问题如何解决?下面主要结合日常开发的经验,给出你关于Spring Boot JPA中的动态数据源的解决方法建议,希望对你解决Spring Boot JPA中的动态数据源有所启发或帮助;

这是我对Datasource的实现

public class DatasourceManager implements Datasource {

    private Map<String, Datasource> datasources = new HashMap<>();
    private Datasource datasource;

    public DatasourceManager() {
    }

    public DatasourceManager(Datasource datasourcE) {
        this.datasource = datasource;
    }

    public voID add(String name, Datasource datasourcE) {
        datasources.put(name, datasourcE);
    }

    public voID switchDatasource(String Name) {
        datasource = datasources.get(Name);
    }

    @OverrIDe
    public PrintWriter getLogWriter() throws sqlException {
        return datasource.getLogWriter();
    }

    @OverrIDe
    public voID setLogWriter(PrintWriter out) throws sqlException {
        datasource.setLogWriter(out);
    }

    @OverrIDe
    public voID setLoginTimeout(int seconds) throws sqlException {
        datasource.setLoginTimeout(seconds);
    }

    @OverrIDe
    public int getLoginTimeout() throws sqlException {
        return datasource.getLoginTimeout();
    }

    @OverrIDe
    public Logger getParentLogger() throws sqlFeatureNotSupportedException {
        return datasource.getParentLogger();
    }

    @OverrIDe
    public <T> T unwrap(Class<T> ifacE) throws sqlException {
        return datasource.unwrap(ifacE);
    }

    @OverrIDe
    public Boolean isWrapperFor(Class<?> ifacE) throws sqlException {
        return datasource.isWrapperFor(ifacE);
    }

    @OverrIDe
    public Connection getConnection() throws sqlException {
        return datasource.getConnection();
    }

    @OverrIDe
    public Connection getConnection(String username, String password) throws sqlException {
        return datasource.getConnection(username, password);
    }
}

这是我的配置

@Configuration
public class DatasourceConfig {

    @autowired
    private Environment env;

    public Datasource makeDatasource(String Name) {
        return DatasourceBuilder.create()
                .driverClassname(env.getProperty("spring.datasource." + name + ".driver-class-name"))
                .url(env.getProperty("spring.datasource." + name + ".url")).build();
    }

    @Bean
    public Datasource datasource() {
        DatasourceManager datasourceManager = new DatasourceManager();
        datasourceManager.add("test1", makeDatasource("test1"));
        datasourceManager.add("test2", makeDatasource("test2"));
        datasourceManager.switchDatasource("test1");
        return datasourceManager;
    }

}

这是application.yml

spring:
  jpa:
    hibernate:
      ddl-auto: create
    propertIEs:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect
  datasource:
    test1:
      name: test2
      url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=falSE
      driver-class-name: org.h2.Driver
      username: h2
      password: h2
    test2:
      name: test1
      url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=falSE
      driver-class-name: org.h2.Driver
      username: h2
      password: h2
@H_616_0@解决方法

我有一个应用程序,它需要连接到几个不同的架构,但都需要连接到同一类型(OracLE)。决定哪个模式来自UI。

如果用户选择了scheR_902_11845@a1,则实体应保留在scheR_902_11845@a1中;如果选择其他,则实体应位于所选的其他模式中。

我正在使用带有依赖项“ spring-boot-starter-data-jpa”的Spring Boot + Hibernate

我已经创建了如下所示的数据源类,以便可以在调用数据层之前每次更改数据源对象中的“ schemaname”。

@Component
public class scheR_902_11845@aDatasource extends AbstractDatasource {

    private String schemaname;

    @Autowired
    private Dsmanager dsm;

    public void setschemaname(String schemaname) {
        this.schemaname = schemaname;
    }

    @Override
    public Connection getConnection() throws SQLException {
        if (schemaname!= null)
            return dsm.getConnection(schemaname);
        else
            return null;
    }

    @Override
    public Connection getConnection(String username,String password) throws SQLException {
        if (schemaname!= null)
            return dsm.getConnection(schemaname);
        else
            return null;
    }

}

我的问题是在启动过程中,“
HibernateJpaAutoConfiguration”尝试创建sessionfactory。在创建过程中,它尝试检查与数据源的连接,但是由于schemaname在启动时为null,因此我的scheR_902_11845@aDatasource返回的null连接导致应用程序引导失败。

有没有办法解决这个问题。我期望与SessionFactory类似,在hibernate状态下没有选项。

同样在RoutIngDatasource的情况下,我必须设置defaultDatasource。

Spring boot version: 1.5.9.RELEASE

大佬总结

以上是大佬教程为你收集整理的Spring Boot JPA中的动态数据源全部内容,希望文章能够帮你解决Spring Boot JPA中的动态数据源所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。