2016-12-22 43 views
1

我有简单的控制器N + 1选择generete CommunicationsException

@GetMapping("users") 
List<User> getUsers() { 

内我有代码:在几分钟之后

for(int i = 0; i<1000;++i) 
    userRepository.getOne(i); 

有时我得到:

org.hibernate.exception.JDBCConnectionException: could not extract ResultSet 

但对于95 %调用它的作品。

,如果我减少迭代次数:

for(int i = 0; i<100;++i) 
     userRepository.getOne(i); 

它总是工作。

我的设置:

spring.datasource.url=jdbc:mysql://test.dailyrazor.com:3306/test?autoReconnect=true&failOverReadOnly=false&maxReconnects=10 
spring.datasource.username=test 
spring.datasource.password=test 

代码只是为了说明问题,一个真实的例子来自于N + 1个选择

如何防止org.hibernate.exception.JDBCConnectionException:无法提取结果集?

+0

你可以发布完整的stacktrace吗? – karelss

+0

这听起来像您的数据库在连接打开很长时间或者导致负载过重或执行许多语句时关闭连接。完整的堆栈跟踪可能会证明这一点。你可能想和你谈谈dba。 –

回答

-1

总是喜欢在服务内部实现你的逻辑。 并使用@Transactional服务维护整个n + 1迭代的事务。

@Service 
@Transactional 
public returnType serviceName(){ 
// write your logic here 
} 

从您的控制器调用此服务。