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
Ich denke mein Hauptproblem ist Tomcat oder Hibernate, die meine autowired Sitzung nicht richtig schließen, aber ich werde das überprüfen. – zFr3eak