jpa 当服务层包含对外部资源的调用时,在哪里放置@ translation注解?

pexxcrt2  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(74)

下面是服务层中有一个方法调用了另一个第三方服务,同时它使用JPA存储库进行查询,并导致org.springframework.dao. DataBase ResourceFailureException的情况:

Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
    at ....

字符串
你认为我该如何处理这个而不是在第三方调用部分上使用断路器?无论什么原因,该方法可能需要一些时间来执行,但我不想保持与数据库连接。有什么方法可以处理这个吗?

ego6inou

ego6inou1#

如果在执行REST调用时保持DB连接打开,这将是最简单的。如果它是一个简单的SELECT,那么它不会消耗太多资源:

@Transactional
public void m1() {
    SomeClass o = repository.findSomething(...);
    externalService.call(o);
}

字符串
但如果你不想保持连接打开(这是更好的),那么简单地重新设计它如下:

public void m1() {
    SomeClass o = otherService.transactionalMethod();
    externalService.call(o);
}


因此,您的m1()方法不再是@Transactional,而TX现在在第一行开始和结束。或者,您可以进行编程式的TX管理,而不必将TX相关逻辑移动到单独的服务中。
附言:虽然这不是一个好的做法,但你也可以将Repository方法标记为@Transactional-这样你就不必将TX调用委托给另一个服务。例如Spring Data就是这样做的。根据对代码质量的期望,这可能是可以接受的。

相关问题