我有一个奇怪的行为与 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
我在控制器中使用以下方法拦截请求:
@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());
}
}
}
基本上,对于存储库返回到服务的每个元素,我使用keycloackrestemplate对另一个web应用程序进行调用。
这是控制器中使用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的连接,因为有太多的连接。
为什么会这样?
2条答案
按热度按时间mctunoxg1#
这通常发生在将类注解为
@Service
并且具有应该在带有注解的dao类中的函数@Repository
.流程应该是:controller->service->repository。
不要直接从服务类访问数据库,而是引入一个用@repository注解的dao,这应该可以解决问题。
或
添加注解
@Repository
至ApiServiceImpl
. 然而,这不是一个好的做法。3duebb1j2#
我解决了这个问题。
在我的例子中,问题是sql server。。我只是增加了查询的内存,然后它就可以完美地工作了。我还使用了@sam建议的存储库。