当前位置: 首页 > 知识库问答 >
问题:

Spring boot-多数据库访问(MYSQL)

逑和蔼
2023-03-14

到现在为止,我已经在解决我的问题很长时间了,我找不到合适的解决方案。

我需要顺序访问不同的数据库。我试图更改到数据库的链接,正如你在下面的代码中看到的那样。

public static void changeDB(String dbname) throws IOException{

    File f = new File("application.properties");
    if (f.exists()) {
        f.delete(); 
    }
    f.createNewFile();
    System.out.println("gelöscht");


    FileWriter fw = new FileWriter("application.properties");
    BufferedWriter bw = new BufferedWriter(fw);

    String dbchanger = "spring.datasource.url = jdbc:mysql://localhost:3306/kamis" + dbname;

    bw.write("server.port = 8000");
    bw.write("\n");
    bw.write(dbchanger);
    bw.write("\n");
    bw.write("spring.datasource.username=root");
    bw.write("\n");
    bw.write("spring.datasource.password=");
    bw.write("\n");
    bw.write("spring.datasource.driver-class-name = com.mysql.jdbc.Driver");
    bw.write("\n");
    bw.write("spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect");
    bw.write("\n");
    bw.write("spring.jpa.hibernate.ddl-auto=update");
    bw.write("\n");
    bw.write("spring.devtools.livereload.enabled=true");

    bw.close();
    System.out.println("neu erstellt");

}

到目前为止,这在某种程度上是可行的。问题是应用程序需要重新加载才能从我的应用程序中读取更改。属性来连接到另一个数据库,这对我来说并不是一个真正的解决方案,因为应用程序会重新启动。它还必须是动态可变的,因为我正在处理30多个数据库。

也许你们可以帮我找出如何重新加载它,或者给我一个更合适的解决方案来解决我的问题。

提前谢谢。凯

共有3个答案

卫寒
2023-03-14

似乎您可以实现多租户方法,几个月前我在一篇博文中谈到的主题:使用Spring Boot、JPA、Hibernate和Postgres的多租户应用程序

为多租户支持配置持久层的步骤包括:

  • Hibernate、JPA和数据源属性。类似于:

应用yml公司

...
multitenancy:
  dvdrental:
    dataSources:
      -
        tenantId: TENANT_01
        url: jdbc:postgresql://172.16.69.133:5432/db_dvdrental
        username: user_dvdrental
        password: changeit
        driverClassName: org.postgresql.Driver
      -
        tenantId: TENANT_02
        url: jdbc:postgresql://172.16.69.133:5532/db_dvdrental
        username: user_dvdrental
        password: changeit
        driverClassName: org.postgresql.Driver
...

我使用了一个属性文件来存储租户数据,但可以将租户信息存储在一种主数据库中。

MultiTenantJpaConfiguration.java

 ...
 @Configuration
 @EnableConfigurationProperties({ MultiTenantDvdRentalProperties.class, JpaProperties.class })
 @ImportResource(locations = { "classpath:applicationContent.xml" })
 @EnableTransactionManagement
 public class MultiTenantJpaConfiguration {

   @Autowired
   private JpaProperties jpaProperties;

   @Autowired
   private MultiTenantDvdRentalProperties multiTenantDvdRentalProperties;
 ...
 }

MultiTenantDvdRentalProperties.java

...
@Configuration
@ConfigurationProperties(prefix = "multitenancy.dvdrental")
public class MultiTenantDvdRentalProperties {

  private List<DataSourceProperties> dataSourcesProps;
  // Getters and Setters

  public static class DataSourceProperties extends org.springframework.boot.autoconfigure.jdbc.DataSourceProperties {

    private String tenantId;
    // Getters and Setters
  }
}
  • 数据源bean

MultiTenantJpaConfiguration.java

 ...
 public class MultiTenantJpaConfiguration {
 ...
   @Bean(name = "dataSourcesDvdRental" )
   public Map<String, DataSource> dataSourcesDvdRental() {
       ...
   }
 ...
 }
  • 实体管理器工厂bean

MultiTenantJpaConfiguration.java

 ...
 public class MultiTenantJpaConfiguration {
 ...
   @Bean
   public MultiTenantConnectionProvider multiTenantConnectionProvider() {
       ...
   }

   @Bean
   public CurrentTenantIdentifierResolver currentTenantIdentifierResolver() {
       ...
   }

   @Bean
   public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(MultiTenantConnectionProvider multiTenantConnectionProvider,
     CurrentTenantIdentifierResolver currentTenantIdentifierResolver) {
       ...  
   }
 ...
 }
  • 事务管理器bean

MultiTenantJpaConfiguration.java

 ...
 public class MultiTenantJpaConfiguration {
 ...
   @Bean
   public EntityManagerFactory entityManagerFactory(LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {
       ...
   }

   @Bean
   public PlatformTransactionManager txManager(EntityManagerFactory entityManagerFactory) {
       ...
   }
 ...
 }
  • Spring数据JPA和事务支持配置

应用Content.xml

...
<jpa:repositories base-package="com.asimio.dvdrental.dao" transaction-manager-ref="txManager" />
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" />
...

阿克托多。Java语言

public interface ActorDao extends JpaRepository<Actor, Integer> {
}

根据您的需要,可以这样做:

...
@Autowired
private ActorDao actorDao;
...

DvdRentalTenantContext.setTenantId("TENANT_01");
this.actorDao.findOne(...);
...

// Or
DvdRentalTenantContext.setTenantId("TENANT_02");
this.actorDao.save(...);
...

设置tenantId可以在将要执行JPA操作等的servlet过滤器/Spring MVC拦截器/线程中完成。

同样,可以在以下位置找到详细说明和源代码:使用Spring Boot、JPA、Hibernate和Postgres的多租户应用程序

强硕
2023-03-14

您可以在Spring配置中定义多个DataSource对象并使用所需的对象。

将两个数据源标记为@Bean。还需要定义两个EntityManager(每个基于自己的数据源)。

阅读示例了解更多信息

更新:对于这种情况,我将实现代理数据源以保持逻辑。其思想是实现数据源接口,该接口在内部可以有数据源的映射。(关键是JDBC URL用户名)

最初地图是空的。在第一次调用时,我们检查地图中是否有提供用户的实例。如果没有,我们会动态创建一个新的DataSource实例并放置在地图中。所有ProxyDataSource方法只是获取(或创建)委托用户特定的DataSource实例并调用用户实例的相同方法。

您声明@Bean DataSource whcih返回代理数据源wch,它在内部处理逻辑。

龙志勇
2023-03-14

您可以使用我所做的以下配置在Spring启动中使用多个数据库。pplication.properties:-

server.port=6060
spring.ds_post.url =jdbc:postgresql://localhost:5432/kode12
spring.ds_post.username =postgres
spring.ds_post.password =root
spring.ds_post.driverClassName=org.postgresql.Driver
spring.ds_mysql.url = jdbc:mysql://localhost:3306/kode12
spring.ds_mysql.username = root
spring.ds_mysql.password = root
spring.ds_mysql.driverClassName=com.mysql.jdbc.Driver

多路B配置。Java语言

@Configuration
public class MultipleDBConfig {
    @Bean(name = "mysqlDb")
    @ConfigurationProperties(prefix = "spring.ds_mysql")
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "mysqlJdbcTemplate")
    public JdbcTemplate jdbcTemplate(@Qualifier("mysqlDb") DataSource dsMySQL) {
        return new JdbcTemplate(dsMySQL);
    }

    @Bean(name = "postgresDb")
    @ConfigurationProperties(prefix = "spring.ds_post")
    public DataSource postgresDataSource() {
        return  DataSourceBuilder.create().build();
    }

    @Bean(name = "postgresJdbcTemplate")
    public JdbcTemplate postgresJdbcTemplate(@Qualifier("postgresDb") 
                                              DataSource dsPostgres) {
        return new JdbcTemplate(dsPostgres);
    }
}

这是带注释的配置类,包含用于加载PostgreSQL和MySQL配置的函数和注释。它还负责为每个模板创建一个JDBCTemplate实例。

 类似资料:
  • ActiveX Data Objects (ADO) 是一项容易使用并且可扩展的将数据库访问添加到 Web 页的技术。可以使用 ADO 去编写紧凑简明的脚本以便连接到 Open Database Connectivity (ODBC) 兼容的数据库和 OLE DB 兼容的数据源。如果您是一个对数据库连接有一定了解的脚本编写人员,那么您将发现 ADO 命令语句并不复杂而且容易掌握。同样地,如果您是一

  • 对许多Web应用程序而言,数据库都是其核心所在。数据库几乎可以用来存储你想查询和修改的任何信息,比如用户信息、产品目录或者新闻列表等。 Go没有内置的驱动支持任何的数据库,但是Go定义了database/sql接口,用户可以基于驱动接口开发相应数据库的驱动,5.1小节里面介绍Go设计的一些驱动,介绍Go是如何设计数据库驱动接口的。5.2至5.4小节介绍目前使用的比较多的一些关系型数据驱动以及如何使

  • 程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上,无论是保存到本地磁盘,还是通过网络保存到服务器上,最终都会将数据写入磁盘文件。 而如何定义数据的存储格式就是一个大问题。如果我们自己来定义存储格式,比如保存一个班级所有学生的成绩单: 名字 成绩 Michael 99 Bob 85 Bart 59 Lisa 87 你可以用一个文本文件保存,一行保存一个学生,用,隔开

  • 程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上,无论是保存到本地磁盘,还是通过网络保存到服务器上,最终都会将数据写入磁盘文件。 而如何定义数据的存储格式就是一个大问题。如果我们自己来定义存储格式,比如保存一个班级所有学生的成绩单: 名字 成绩 Michael 99 Bob 85 Bart 59 Lisa 87 你可以用一个文本文件保存,一行保存一个学生,用,隔开

  • 我目前有一个类似以下的数据库结构。如果无法在Firebase实时数据库安全规则中循环,我如何基于用户对多个组的访问来保护数据?要遵循的例子... 数据库结构: 我如何在上指定安全规则,以基于中指定的任何组与当前用户的

  • 主要内容:创建动作:,创建页面:,创建视图:,配置文件:本章将教如何使用Struts 2的简单的步骤来访问数据库。 Struts是一个MVC框架,而不是一个数据库框架,但它提供了极好的支持JPA/ Hibernate集成。我们将看看在的Hibernate集成在后面的章节,但在这一章中,我们将使用纯JDBC来访问数据库。 在这一章中的第一个步骤是设置我们的数据库。我作为我的数据库在这个例子中使用MySQL。在机器上安装MySQL,我创建了一个新的数据库称