spring boot java在运行时连接多个数据库并选择表

Posted

技术标签:

【中文标题】spring boot java在运行时连接多个数据库并选择表【英文标题】:Connecting to multiple database and selecting tables at runtime spring boot java 【发布时间】:2022-01-13 13:02:03 【问题描述】:

我有一个用例需要连接到两个不同的数据库(Postgres 和 Oracle)。 Postgres 已经配置了 jpa。我需要再添加一个数据库(Oracle)。在 oracle 数据库中,我需要在运行时选择表进行插入和删除(因为表不固定)。目前我将我的属性文件中的表格作为列表传递

oracle:
  deletion:
    table:
    - 
     tableName: user
     primaryKey: userId
     emailField: emailId
     deleteTableName: user_delete
    -
     tableName: customer
     primaryKey: customerId
     emailField: emailAddress
     deleteTableName: customer_delete

我创建了一个 bean,它读取所有这些属性并将它们放在一个列表中

@Bean("oracleTables")
@ConfigurationProperties("oracle.deletion.table")
List<Table> getAllTAbles()
 return new ArrayList<>();

我有一个电子邮件地址列表。对于这些表中的每一个,我需要从父表中获取基于 emailAddress 的主键(tableName 中的值)并将数据插入相应的 deleteTable(deleteTableName 中的值)。完成后,我需要根据电子邮件地址从实际表(表名中的值)中删除数据。

我打算遍历我的 bean 中的表列表并执行 fetch、insert 和 delete。

样本sn-p

@Autowired
@Qualifier("oracleTables")
List<Table> tables;

public boolean processDelete(List<String> emails)
 for(Table table:tables)
  //fetch all the primary keys for given emails from main table(value in tableName)
  //insert into corresponding delete table
  //delete from main table
 

但我的问题是,我应该使用 jdbcTemplate 还是 jpaRepository/hibernate。还有一些实施方面的帮助以及一个小示例/链接。

这个问题的原因是

1)我的表格不是固定的

2)我需要事务管理来回滚以防获取、插入或删除失败。

3)我需要配置两个数据库

【问题讨论】:

【参考方案1】:

我应该使用 jdbcTemplate 还是 jpaRepository/hibernate

绝对是JdbcTemplateJPA 不容易允许动态表。

我需要事务管理在获取、插入或删除失败的情况下回滚

如果你需要事务,你还需要定义两个独立的事务管理器:

@Bean
public TransactionManager oracleTransactionManager() 
    var result = new DataSourceTransactionManager();
    ...
    result.setDataSource(oracleDataSource());
    return result;


@Bean
public TransactionManager postgresTransactionManager() 
    ...

然后,如果您想要声明式事务,则需要指定运行给定方法的管理器:

@Transactional(transactionManager = "oracleTransactionManager")
public void doWorkInOracleDb() 
    ...

我需要配置两个数据库

只需配置两个单独的DataSource bean。当然,您实际上还需要两个单独的 JdbcTemplate bean。

【讨论】:

以上是关于spring boot java在运行时连接多个数据库并选择表的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot - 多环境配置

使用 Spring Boot Java 端口 8080 上的 Tomcat 失败

多线程 Spring-boot 控制器方法

Spring boot在添加mongo-java-driver maven依赖时尝试连接mongo

java.lang.RuntimeException:从本地使用 Spring Boot 容器 API 时连接被拒绝

Spring Boot 测试不适用于 Java 11