我正在使用Spring Boot,并尝试在我的存储库中执行一个findAll查询,该查询应返回结果流:
根据文档,在使用JpaRepositories中的Streams时,您应该在使用后始终关闭它们。由于它们实现了AutoCloseable接口,因此可以使用try with resources块。 http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-streaming 一个Stream可能包装底层数据存储特定资源,因此必须在使用后关闭。您可以使用close()方法手动关闭Stream,也可以使用Java 7的try-with-resources块。
文档甚至有一个示例,完全与我所做的方式相同。因此,据我所知,我正在按照文档上的所有说明操作,但仍然在操作后30秒后出现异常。因此,连接未关闭并保持挂起状态。为什么会这样,我该如何克服呢?
我已尝试使用Postgres 9.5和MariaDB作为数据库。我正在使用最新可能的连接器/驱动程序和Tomcat连接池,该连接池通过spring boot的属性进行配置,如下:
public interface MyThingRepository extends JpaRepository<MyThing, String> {
Stream<MyThing> findAll();
}
public class MyScheduledJobRunner {
@Autowired
private MyThingRepository myThingRepository;
public void run() {
try (Stream<MyThing> myThingsStream : myThingRepository.findAll()) {
myThingsStream.forEach(myThing -> {
// do some stuff
});
// myThingsStream.close(); // <- at one point even tried that, though the stream is wrapped in an auto-closing block. anyway, it did not help
System.out.println("All my things processed.");
}
System.out.println("Exited the auto-closing block.");
}
}
我得到的输出是:
All my things processed.
Exited the auto-closing block.
o.a.tomcat.jdbc.pool.ConnectionPool : Connection has been abandoned PooledConnection[com.mysql.jdbc.JDBC4Connection@2865b7d5]:java.lang.Exception
| at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1061)
...
at MyScheduledJobRunner.run(MyScheduledJobRunner:52)
MyScheduledJobRunner:52是:
try (Stream<MyThing> myThingsStream : myThingRepository.findAll()) {
根据文档,在使用JpaRepositories中的Streams时,您应该在使用后始终关闭它们。由于它们实现了AutoCloseable接口,因此可以使用try with resources块。 http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-streaming 一个Stream可能包装底层数据存储特定资源,因此必须在使用后关闭。您可以使用close()方法手动关闭Stream,也可以使用Java 7的try-with-resources块。
文档甚至有一个示例,完全与我所做的方式相同。因此,据我所知,我正在按照文档上的所有说明操作,但仍然在操作后30秒后出现异常。因此,连接未关闭并保持挂起状态。为什么会这样,我该如何克服呢?
我已尝试使用Postgres 9.5和MariaDB作为数据库。我正在使用最新可能的连接器/驱动程序和Tomcat连接池,该连接池通过spring boot的属性进行配置,如下:
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost/mydb?useSSL=false
username: user
password: password
initial-size: 10
max-active: 100
max-idle: 50
min-idle: 10
max-wait: 15000
test-while-idle: true
test-on-borrow: true
validation-query: SELECT 1
validation-query-timeout: 5
validationInterval: 30000
time-between-eviction-runs-millis: 30000
min-evictable-idle-time-millis: 60000
removeAbandonedTimeout: 60
remove-abandoned: true
log-abandoned: true
Stream<MyThing> findAll()
是你实现的方法还是由Spring生成的? - user140547