gpt4 book ai didi

java - Spring Boot 和 Hibernate 多次调用同一个方法

转载 作者:行者123 更新时间:2023-11-29 05:05:00 25 4
gpt4 key购买 nike

我对 Spring Boot 和 Hibernate 有一个奇怪的行为。我多次调用一个方法和 Spring。这是 Tomcat 上的日志示例:

2018-05-03 15:10:26.661 ERROR 4309 --- [nio-8009-exec-7] i.c.edile.service.api.ApiServiceImpl     : Api Service Get Fattura By Commessa: 248 
..............
2018-05-03 15:11:06.468 ERROR 4309 --- [io-8009-exec-10] i.c.edile.service.api.ApiServiceImpl : Api Service Get Fattura By Commessa: 248
..............
018-05-03 15:11:55.115 ERROR 4309 --- [nio-8009-exec-8] i.c.edile.service.api.ApiServiceImpl : Api Service Get Fattura By Commessa: 248
..............
2018-05-03 15:11:57.942 ERROR 4309 --- [io-8009-exec-11] i.c.edile.service.api.ApiServiceImpl : Api Service Get Fattura By Commessa: 248

我在 Controller 中使用以下方法拦截请求:

@GetMapping(value="/concludi")
public void concludi() {
apiService.concludiCommessa();
}

此方法调用服务:

@Service("apiService")
public class ApiServiceImpl implements ApiService{

@Override
public void concludiCommessa() {

try {
for(Commessa c : commessaRepository.findCommessaDaConcludere()) {
String ftt = keycloakRestTemplate.getForEntity(URL), String.class).getBody();
if(ftt == null) {
continue;
}
//........
} catch (RestClientException | IOException e) {
LOG.error("Api Service Get Fattura By Commessa: {}", e.getMessage());
}
}

}

基本上,对于存储库返回给服务的每个元素,我使用 KeycloackRestTemplate 调用另一个网络应用程序。

这是 Controller 内部使用 rest 模板拦截调用的方法:

@GetMapping(value="/concludiCommessa", params="num", produces="application/json")
public FatturaCommessaDto concludiCommessa(@RequestParam(value="num", required=true) final String numeroCommessa){
return fattureService.findByNumeroCommessa(numeroCommessa);
}

这是服务内部的方法:

@Service(value="fatturaService")
@Transactional
public class FatturaServiceImpl implements FatturaService {

@PersistenceContext(unitName="persistenceUnitI24")
private EntityManager emI24;

@Override
public FatturaCommessaDto findByNumeroCommessa(String numeroCommessa) {
Session session = emI24.unwrap(Session.class);
FatturaI24 fattureI24 = (FatturaI24) session.createQuery("select f from FatturaRighe r join r.idFatturaI24 f join r.nota n where n.nota like '%"+numeroCommessa+"%'")
.setCacheMode(CacheMode.IGNORE)
.uniqueResult();

//some code
}

问题 是 Spring 重复调用从 apiService 中提取的每个元素,所以过了一会儿 Tomcat 失去了与 DB 的连接,因为有太多的连接.

为什么会这样?

最佳答案

我解决了这个问题。

在我的例子中,问题出在 Sql Server 上。我只是增加了用于查询的内存,然后它就完美地工作了。我还按照@SAM 的建议使用了存储库。

关于java - Spring Boot 和 Hibernate 多次调用同一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50156243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com