2017-10-22 21 views
0

最近私はすべてのSpring 4プロジェクトを最新のSpring Boot Starter Frameworkで再構築しました。Spring Boot - PoolExhaustedException

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.5.7.RELEASE</version> 
</parent> 

私のすべての再構築プロジェクトでPoolExhaustedExceptionがランダムに発生していることを除いて、これまでのところすべて正常に動作しています。

正確な例外がある:

org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-nio-8080-exec-4] Timeout: Pool empty. Unable to fetch a connection in 20 seconds, none available[size:50; busy:50; idle:0; lastwait:20000]. 

私が受け取った最後の例外が私のデータベースから文書をダウンロードしているコントローラからだった:

@RequestMapping(value = "/getDocument/{value}/{text}", method = RequestMethod.GET) 
public void get(HttpServletResponse response, @PathVariable String value, @PathVariable String text){ 
     try { 
      Document ufile = documentService.getDocumentByID(Integer.parseInt(value)); 

      response.setContentType(ufile.getType()); 
      response.setContentLength(ufile.getContent().length); 
      FileCopyUtils.copy(ufile.getContent(), response.getOutputStream()); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
} 

サービス:

@Transactional 
public Document getDocumentByID(int id) { 
    Document r = this.documentDAO.getDocumentByID(id); 
    return r; 
} 

DAO:

@Transactional 
public Document getDocumentByID(int id) 
{ 
    Session session = this.sessionFactory.getCurrentSession();  
    Document p = (Document) session.load(Document.class, new Integer(id)); 
    return p; 
} 

@Transactionalで一時的に問題を解決したコントローラに注釈を付けようとしましたが、他のトランザクションエラーが発生して削除する必要がありました。

私はproject.propertiesも100を超えてプールを増やそうとしましたが、これは問題を遅らせるだけでしたが解決しませんでした。

project.properties

spring.datasource.tomcat.max-wait=20000 
spring.datasource.tomcat.max-active=50 
spring.datasource.tomcat.max-idle=20 
spring.datasource.tomcat.min-idle=15 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect 
spring.jpa.properties.hibernate.id.new_generator_mappings = false 
spring.jpa.properties.hibernate.format_sql = true 
spring.mvc.view.prefix: /WEB-INF/views/ 
spring.mvc.view.suffix: .jsp 
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext 
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

答えて

0

これらの名前を持つプロパティがどんな効果を持っているかどうかわかりません。

私はブレークポイントを設定してTomcat DataSourceを直接検査して、(テストで簡単にautowiredになる)確信する値を表示しようとします。 Spring BootTomcat Datasource Configuration Testsを見ると

私はすべてのspring.datasource.tomcat.が付いminEvictableIdleTimeMillistimeBetweenEvictionRunsMillisとMAXWAITのようないくつかの興味深いオプションを表示するので、それらを試してみます。

+0

私の主な問題は、tomcatまたは休止状態で、私のautowiredセッションを正しく閉じていないと思いますが、私はそれをチェックします。 – zFr3eak