我们的项目中有Spring-boot/Hibernate/PostgreSQL应用程序,并使用Hikari作为连接池.我们继续遇到以下问题:几个小时后,活动连接数量增长到极限,我们得到这样的错误(完整堆栈跟踪在问题的最后):
Caused by: java.sql.SQLTransientConnectionException: HikariPool-0 - Connection is not available, request timed out after 30000ms.
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:213) ~[HikariCP-2.4.1.jar:na]
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:163) ~[HikariCP-2.4.1.jar:na]
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:85) ~[HikariCP-2.4.1.jar:na]
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:139) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:380) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
... 126 common frames omitted
Run Code Online (Sandbox Code Playgroud)
这是版本信息:
Spring-boot version: 1.2.3.RELEASE
HikariCP version: 2.4.1
Hibernate version: 4.3.6.Final
Postgresql jdbc: 9.3-1102-jdbc41
Server version: Apache Tomcat/8.0.23
JVM Version: 1.8.0_45-b14
Run Code Online (Sandbox Code Playgroud)
JPA/Hibernate配置:
jpa:
database-platform: org.hibernate.dialect.PostgreSQL82Dialect
database: POSTGRESQL
openInView: false
show_sql: false
generate-ddl: false
hibernate:
ddl-auto: none
naming-strategy: org.hibernate.cfg.EJB3NamingStrategy
properties:
hibernate.cache.use_second_level_cache: true
hibernate.cache.use_query_cache: false …Run Code Online (Sandbox Code Playgroud) 我正在构建一个使用Spring Data和Hibernate的简单Tomcat webapp.有一个终点可以完成很多工作,因此我想将工作卸载到后台线程,以便在完成工作时Web请求不会挂起10分钟以上.所以我在一个组件扫描包中写了一个新服务:
@Service
public class BackgroundJobService {
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
public void startJob(Runnable runnable) {
threadPoolTaskExecutor.execute(runnable);
}
}
Run Code Online (Sandbox Code Playgroud)
然后ThreadPoolTaskExecutor在Spring中配置:
<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="25" />
</bean>
Run Code Online (Sandbox Code Playgroud)
这一切都很有效.但问题来自Hibernate.在我的runnable中,查询只有一半工作.我可以:
MyObject myObject = myObjectRepository.findOne()
myObject.setSomething("something");
myObjectRepository.save(myObject);
Run Code Online (Sandbox Code Playgroud)
但是如果我有延迟加载的字段,它会失败:
MyObject myObject = myObjectRepository.findOne()
List<Lazy> lazies = myObject.getLazies();
for(Lazy lazy : lazies) { // Exception
...
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.stackoverflow.MyObject.lazies, could not initialize proxy - …Run Code Online (Sandbox Code Playgroud)