spring引导和hibernate多次调用同一方法

3qpi33ja  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(342)

我有一个奇怪的行为与 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的连接,因为有太多的连接。
为什么会这样?

mctunoxg

mctunoxg1#

这通常发生在将类注解为 @Service 并且具有应该在带有注解的dao类中的函数 @Repository .
流程应该是:controller->service->repository。
不要直接从服务类访问数据库,而是引入一个用@repository注解的dao,这应该可以解决问题。

添加注解 @RepositoryApiServiceImpl . 然而,这不是一个好的做法。

3duebb1j

3duebb1j2#

我解决了这个问题。
在我的例子中,问题是sql server。。我只是增加了查询的内存,然后它就可以完美地工作了。我还使用了@sam建议的存储库。

相关问题