2016-12-22 45 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 
} 

從您的控制器調用此服務。