2017-10-22 3 views
0

Ich habe vor kurzem alle meine Spring 4-Projekte mit dem neuesten Spring Boot Starter Framework neu erstellt.Spring Boot - PoolExhaustedException

Alles funktioniert soweit, außer dass ich PoolExhaustedException nach dem Zufallsprinzip über alle meine Neuerstellungen Projekte erlebt.

Die genaue Ausnahme ist:

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]. 

Die letzte Ausnahme erhielt ich von einem Controller war, die ein Dokument aus meiner Datenbank heruntergeladen:

@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(); 
     } 
} 

Service:

@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; 
} 

Ich habe bereits versucht, den Controller mit @Transactional zu kommentieren, der das Problem vorübergehend löste, aber zu anderen Transaktionsfehlern führte, also musste ich es entfernen.

Ich habe auch versucht, den Pool über project.properties zu 100 zu erhöhen, was das Problem nur verzögert, aber nicht gelöst hat.

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 

Antwort

0

nicht sicher, ob die Eigenschaften mit diesen Namen keine Auswirkungen haben.

Ich würde auch versuchen, einen Haltepunkt zu setzen und die Tomcat DataSource direkt zu überprüfen, um die Werte zu überzeugen (kann in einem Test leicht autowired werden).

Mit Blick auf die Spring BootTomcat Datasource Configuration Tests Ich sehe einige interessante Optionen wie minEvictableIdleTimeMillis, timeBetweenEvictionRunsMillis und maxWait alle mit spring.datasource.tomcat. Präfix, so sie auszuprobieren.

+0

Ich denke mein Hauptproblem ist Tomcat oder Hibernate, die meine autowired Sitzung nicht richtig schließen, aber ich werde das überprüfen. – zFr3eak