2 votes

Spring Boot : Apache derby pool empty. Impossible de récupérer une connexion en 30 secondes

Après un certain temps de fonctionnement, j'obtiens cette erreur.
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed ; nested exception is org.springframework.orm.jpa.JpaSystemException : Unable to acquire JDBC Connection ; l'exception imbriquée est org.hibernate.exception.GenericJDBCException : Unable to acquire JDBC Connection] avec Cause première org.apache.tomcat.jdbc.pool.PoolExhaustedException : [http-nio-8081-exec-5] Timeout: Pool vide. Impossible d'aller chercher une connexion dans 30 secondes, aucune disponible [size:100 ; busy:100 ; idle:0 ; lastwait:30000].

Voici le fichier application.properties :

spring.datasource.url=jdbc:derby:/spring-boot/db;create=true
spring.datasource.username=admin
spring.datasource.password=1234
spring.datasource.driver=org.apache.derby.jdbc.EmbeddedDriver
hibernate.dialect = org.hibernate.dialect.DerbyDialect
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext

spring.datasource.max-active=100
spring.datasource.max-idle=8
spring.datasource.min-idle=8

3voto

Je ne peux pas reproduire l'erreur, mais laissez-moi corriger vos fichiers de propriétés, afin que Spring puisse effectivement lire vos propriétés, si vous utilisez SpringBoot 1.4 et supérieur .

Comme je l'ai trouvé dans post avec la même erreur afin de résoudre le problème que vous essayez d'améliorer. datasource.max-active et d'autres propriétés, n'est-ce pas ?

Donc si les propriétés ne sont pas dans les propriétés de cette application par défaut alors vous devez les écrire comme

    spring.jpa.properties.*= # Additional native properties to set on the JPA provider.

En conséquence, je vous conseille de changer application.properties à ce qui suit :

    spring.datasource.url = jdbc:derby:/spring-boot/db;create=true
    spring.datasource.username = admin
    spring.datasource.password = 1234

    # this one is incorrect
    # spring.datasource.driver = org.apache.derby.jdbc.EmbeddedDriver
    # replace with the one below, otherwise Spring will use his own
    # derby driver
    spring.datasource.driver-class-name = org.apache.derby.jdbc.EmbeddedDriver

    # this one is incorrect as well
    # hibernate.dialect = org.hibernate.dialect.DerbyDialect
    # use the following way
    spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.DerbyDialect

    spring.jpa.generate-ddl = true
    spring.jpa.hibernate.ddl-auto = update
    spring.jpa.properties.hibernate.current_session_context_class = org.springframework.orm.hibernate4.SpringSessionContext

    # and in order for these guys to work you have to know
    # spring.datasource.max-active=100
    # spring.datasource.max-idle=8
    # spring.datasource.min-idle=8
    # your dbcp and look for documentation
    # below is the example for Tomcat
    spring.datasource.tomcat.max-active=100
    spring.datasource.tomcat.max-idle=8
    spring.datasource.tomcat.min-idle=8

    # make sure you check out the logging
    # this is IMPORTANT to see that your 
    # properties were ACTUALLY picked up
    logging.level.org.springframework.web = DEBUG
    logging.level.org.hibernate = DEBUG

Les 3 propriétés avant-dernières qui peuvent vous aider à surmonter les difficultés sont les plus difficiles à résoudre. J'ai choisi une connaissance de ce message ici, dernière réponse . Il a également un lien vers Documentation de Spring Boot 1.4.1.RELEASE .

Enfin, vous devez vous assurer que votre max-idle propriétés ont en fait été récupérés par Spring . C'est pourquoi j'ai ajouté deux dernières propriétés de journalisation et de débogage.

Si vous regardez attentivement votre fichier journal, veuillez vérifier à quelles valeurs elles ont été définies. Voici à quoi ressemble cette ligne pour moi

    2016-11-17 11:40:27.875 DEBUG 32079 --- [           main] o.hibernate.internal.SessionFactoryImpl  : Instantiating session factory with properties: {java.vendor=Oracle Corporation, sun.java.launcher=SUN_STANDARD, catalina.base=/tmp/tomcat.736868414125414090.8080, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, catalina.useNaming=false, hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy, os.name=Linux, sun.boot.class.path=/usr/users/nikiforo/src/jdk1.8.0_73/jre/lib/resources.jar:/usr/users/nikiforo/src/jdk1.8.0_73/jre/lib/rt.jar:/usr/users/nikiforo/src/jdk1.8.0_73/jre/lib/sunrsasign.jar:/usr/users/nikiforo/src/jdk1.8.0_73/jre/lib/jsse.jar:/usr/users/nikiforo/src/jdk1.8.0_73/jre/lib/jce.jar:/usr/users/nikiforo/src/jdk1.8.0_73/jre/lib/charsets.jar:/usr/users/nikiforo/src/jdk1.8.0_73/jre/lib/jfr.jar:/usr/users/nikiforo/src/jdk1.8.0_73/jre/classes, hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext, java.vm.specification.vendor=Oracle Corporation, java.runtime.version=1.8.0_73-b02, user.name=nikiforo, javax.persistence.validation.mode=AUTO, user.language=en, sun.boot.library.path=/usr/users/nikiforo/src/jdk1.8.0_73/jre/lib/amd64, PID=32079, java.version=1.8.0_73, user.timezone=Europe/Berlin, sun.arch.data.model=64, java.endorsed.dirs=/usr/users/nikiforo/src/jdk1.8.0_73/jre/lib/endorsed, sun.cpu.isalist=, sun.jnu.encoding=UTF-8, file.encoding.pkg=sun.io, file.separator=/, java.specification.name=Java Platform API Specification, java.class.version=52.0, user.country=US, java.home=/usr/users/nikiforo/src/jdk1.8.0_73/jre, java.vm.info=mixed mode, os.version=4.1.20-11-default, hibernate.boot.CfgXmlAccessService.key=org.hibernate.boot.cfgxml.spi.LoadedConfig@6abb7b7d, hibernate.connection.datasource=org.apache.tomcat.jdbc.pool.DataSource@5c7dfc05{ConnectionPool[defaultAutoCommit=null; defaultReadOnly=null; defaultTransactionIsolation=-1; defaultCatalog=null; driverClassName=org.apache.derby.jdbc.EmbeddedDriver; maxActive=100

C'est une longue ligne, mais comme vous voyez pour moi max-active a été fixé.

Si vous voulez voir dans quelle application Spring-Data-REST simple j'ai essayé derby et les propriétés suivantes, vérifiez ce projet GitHub de la mine : branche derby-tomcat-database-error

Cela peut aider, peut-être pas, dites-moi si je me trompe, je supprimerai le message.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X