java 在数据库事务期间调用API难道不是一个好的实践吗?

waxmsbnn  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(181)

我正在写一个函数,需要调用一个外部API并将结果保存到postgres数据库中,我在考虑两种方法的优缺点:
1.启动事务,使用SELECT FOR UPDATE锁定行,进行API调用并保存结果,如果其中一个失败则回滚。
1.首先调用API,然后启动事务,使用SELECT FOR UPDATE锁定行,并仅在api调用成功并返回result时才写入结果。
我听说在数据库事务中使用外部API调用是非常危险的。但是我不确定除了事务可能需要更长时间的明显原因外,还有什么其他原因。根据我们用于api调用的HTTP方法,会有什么不同吗?(GET vs POST)
我正在学习第二种方法,如果我们只从API调用中获取信息并写入数据库,这样我们就不会占用事务太长时间,但另一方面,如果事务不阻止读操作,并且没有其他后续操作被该事务或被锁定的行所阻止,我看不出事务占用太长时间有什么问题。
在这里寻找一些意见。希望能有一些关于每种方法的例子,谢谢!

jdzmm42g

jdzmm42g1#

由于到DB的连接是有限的资源,通常连接由连接池子系统控制,例如光。
https://github.com/brettwooldridge/HikariCP
所以,我假设,你在你的应用程序中有一个连接池。每个事务,你会持有超过需要的时间,也会持有一个连接。一个池通常有限制的连接,这防止连接池耗尽。例如,如果你使用光,你会面临一些问题,在长期外部API调用的情况下,因为:
1.默认情况下,连接池允许您拥有10个到DB的连接,您拥有10个事务,因此也拥有10个连接,因此,您的读连接没有机会捕获连接(当然,它有,但事务开始争用连接)
1.如果您有很长的请求到外部API,池可以中断连接超时在某个时候,你的数据会丢失,尽管你有来自外部服务的响应,你不会保存它。
例如,您可以在这里检查光限制:https://github.com/brettwooldridge/HikariCP/blob/dev/src/main/java/com/zaxxer/hikari/HikariConfig.java
更感兴趣的是

private static final long CONNECTION_TIMEOUT = SECONDS.toMillis(30);
    ...
    private static final int DEFAULT_POOL_SIZE = 10;

相关问题