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
绝对是JdbcTemplate
。 JPA
不容易允许动态表。
我需要事务管理在获取、插入或删除失败的情况下回滚
如果你需要事务,你还需要定义两个独立的事务管理器:
@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 Java 端口 8080 上的 Tomcat 失败
Spring boot在添加mongo-java-driver maven依赖时尝试连接mongo