我有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();
}
答案 0 :(得分:1)
我也遇到了同样的问题,很高兴找到这篇文章以作快速解答。如注释中所指出的,将Transactional注释添加到您的过程函数中,连接不会泄漏。
@Repository
public interface UserRepository extends CrudRepository<AuthUser, Integer> {
@Transactional
@Procedure(procedureName = User.ImportUserProcedure)
void ImportUserProcedure();
}