在 Spring Boot 控制器中使用 Stream 返回类型导致“java.sql.SQLException: Closed Resultset: next”

问题描述 投票:0回答:2

当将结果从 JpaRepository 流式传输到 Rest API 时,出现异常“java.sql.SQLException: Closed Resultset: next”

我正在使用 Spring boot、Spring Data JPA 和 Oracle Database/JDBC

资料库

@Repository
public interface EntityRepository extends JpaRepository<Entity, Long> {

  @Transactional(readOnly = true)
  public Stream<Entity> findAllByFilter(String filter);
}

服务

@Service
public class EntityService {
  @Autowired private EntityRepository repository;

  @Transactional(readOnly = true)
  public Stream<Entity> getEntityByFilter(String filter) {
    return repository.findAllByFilter(filter);
  }
}

控制器

@RestController
@RequestMapping("/entities")
public class EntityController {

  @Autowired private EntityService service;

  @GetMapping(value = "/filter/{filter}")
  @Transactional(readOnly = true)
  public Stream<Entity> getEntitiesByFilter(@PathVariable("filter") String filter) {
    return service.getEntityByFilter(filter);
  }
}

在控制器中使用流有效,但通过 HTTP 原因返回它

Caused by: java.sql.SQLException: Closed Resultset: next at oracle.jdbc.driver.InsensitiveScrollableResultSet.ensureOpen(InsensitiveScrollableResultSet.java:201) ~[ojdbc11-21.3.0.0.jar:21.3.0.0.0] 在 oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:496) ~[ojdbc11-21.3.0.0.jar:21.3.0.0.0] 在 com.zaxxer.hikari.pool.HikariProxyResultSet.next(HikariProxyResultSet.java) ~[HikariCP-4.0.3.jar:?] 在 org.hibernate.internal.ScrollableResultsImpl.next(ScrollableResultsImpl.java:101) ~[hibernate-core-5.6.5.Final.jar:5.6.5.Final] 在 org.hibernate.query.internal.ScrollableResultsIterator.hasNext(ScrollableResultsIterator.java:33) ~[hibernate-core-5.6.5.Final.jar:5.6.5.Final] 在 java.util.Iterator.forEachRemaining(Iterator.java:132) ~[?:?]

spring-boot spring-data-jpa streaming ojdbc oracle19c
2个回答
0
投票

我通过使用 Query 类的 getResultStream 并使用 Predicates(而不是 JpaRepository)应用我的过滤器解决了我的问题,HTTP 客户端的 Stream 运行良好


0
投票

事务方法不应该在同一个服务类中。

Spring @Transaction 方法在同一个类中调用,不起作用?

© www.soinside.com 2019 - 2024. All rights reserved.