@Scheduled中的执行过程会保持打开连接

时间:2017-12-20 07:14:26

标签: spring-boot spring-data-jpa

我有web应用程序与调用存储过程一致地同步数据。我不会在交易中执行程序。

在每个过程之后,调用实体管理器没有关闭并在连接池中保持连接,直到池达到最大连接数和应用程序挂起。

SharedEntityManagerCreator创建EntityManager并且在导入方法调用后没有关闭它,因为存储库在查询时执行“execute”方法但SharedEntityManagerCreator仅指定

    queryTerminationMethods.add("getResultList");
    queryTerminationMethods.add("getSingleResult");
    queryTerminationMethods.add("executeUpdate");

这是一个错误还是我错了?

这是我的服务

@Service("importService")
@Slf4j
public class ImportService {

    @Autowired
    private UserRepository userRepository;

    public ImportService() {
    }

    @Scheduled(cron = "${import.cron.pattern}")
    public void importData() {
        userRepository.ImportUserProcedure();        
    }

}

和存储库调用存储过程

@Repository
public interface UserRepository extends CrudRepository<AuthUser, Integer> {

    @Procedure(procedureName = User.ImportUserProcedure)
    void ImportUserProcedure();
}

1 个答案:

答案 0 :(得分:1)

我也遇到了同样的问题,很高兴找到这篇文章以作快速解答。如注释中所指出的,将Transactional注释添加到您的过程函数中,连接不会泄漏。

@Repository
public interface UserRepository extends CrudRepository<AuthUser, Integer> {

    @Transactional
    @Procedure(procedureName = User.ImportUserProcedure)
    void ImportUserProcedure();
}