Apicurio-studio: Exception fermée de la connexion à la base de données

Créé le 23 avr. 2019  ·  7Commentaires  ·  Source: Apicurio/apicurio-studio

Salut,
Pendant que nous essayons apicurio, nous avons de temps en temps une exception de fermeture de connexion à la base de données.
Nous avons essayé postgresql et mysql, les deux bases de données ont ce problème, la première version que nous avons installée est 0.2.25, nous avons mis à niveau vers 0.2.26, ce problème existe toujours.
Nous utilisons apicruio dans k8s en utilisant des images de dockerhub.

Des idées? Merci.


io.apicurio.hub.core.exceptions.ServerError: Unexpected server error
    at io.apicurio.hub.api.rest.impl.DesignsResource.listDesigns(DesignsResource.java:167)
    at io.apicurio.hub.api.rest.impl.DesignsResource$Proxy$_$$_WeldClientProxy.listDesigns(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:139)
    at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:509)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:399)
    at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$0(ResourceMethodInvoker.java:363)
    at org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:355)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:365)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:337)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:310)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:439)
    at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:229)
    at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:135)
    at org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:355)
    at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:138)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:215)
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:227)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:791)
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
    at io.apicurio.hub.api.security.KeycloakAuthenticationFilter.doFilter(KeycloakAuthenticationFilter.java:72)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at io.apicurio.hub.api.filters.DisableCachingFilter.doFilter(DisableCachingFilter.java:66)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at io.apicurio.hub.api.filters.CorsFilter.doFilter(CorsFilter.java:64)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at org.keycloak.adapters.undertow.UndertowAuthenticatedActionsHandler.handleRequest(UndertowAuthenticatedActionsHandler.java:66)
    at org.wildfly.swarm.keycloak.deployment.SecurityContextServletExtension.lambda$null$0(SecurityContextServletExtension.java:40)
    at org.wildfly.swarm.generated.FaviconErrorHandler.handleRequest(FaviconErrorHandler.java:61)
    at io.undertow.server.handlers.PathHandler.handleRequest(PathHandler.java:94)
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
    at io.undertow.server.handlers.DisableCacheHandler.handleRequest(DisableCacheHandler.java:33)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53)
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
    at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:59)
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
    at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
    at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
    at org.keycloak.adapters.undertow.ServletPreAuthActionsHandler.handleRequest(ServletPreAuthActionsHandler.java:69)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
    at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
    at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
    at org.wildfly.swarm.keycloak.deployment.KeycloakThreadSetupHandler.lambda$create$0(KeycloakThreadSetupHandler.java:35)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:360)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
    at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
    at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
    at java.lang.Thread.run(Thread.java:748)
Caused by: io.apicurio.hub.core.storage.StorageException: Error listing API designs.
    at io.apicurio.hub.core.storage.jdbc.JdbcStorage.listApiDesigns(JdbcStorage.java:885)
    at io.apicurio.hub.core.storage.jdbc.JdbcStorage$Proxy$_$$_WeldClientProxy.listApiDesigns(Unknown Source)
    at io.apicurio.hub.api.rest.impl.DesignsResource.listDesigns(DesignsResource.java:164)
    ... 84 more
Caused by: org.jdbi.v3.core.statement.UnableToCreateStatementException: org.postgresql.util.PSQLException: This connection has been closed. [statement:"SELECT d.* FROM api_designs d JOIN acl a ON a.design_id = d.id WHERE a.user_id = ?", rewritten:"SELECT d.* FROM api_designs d JOIN acl a ON a.design_id = d.id WHERE a.user_id = ?", parsed:"ParsedSql{sql='SELECT d.* FROM api_designs d JOIN acl a ON a.design_id = d.id WHERE a.user_id = ?', parameters=ParsedParameters{positional=true, parameterNames=[?]}}", arguments:{positional:{0:tianjie}, named:{}, finder:[]}]
    at org.jdbi.v3.core.statement.SqlStatement.internalExecute(SqlStatement.java:1548)
    at org.jdbi.v3.core.result.ResultProducers.lambda$getResultSet$2(ResultProducers.java:67)
    at org.jdbi.v3.core.result.ResultIterable.lambda$of$0(ResultIterable.java:53)
    at org.jdbi.v3.core.result.ResultIterable.stream(ResultIterable.java:141)
    at org.jdbi.v3.core.result.ResultIterable.collect(ResultIterable.java:197)
    at org.jdbi.v3.core.result.ResultIterable.list(ResultIterable.java:186)
    at io.apicurio.hub.core.storage.jdbc.JdbcStorage.lambda$listApiDesigns$30(JdbcStorage.java:882)
    at org.jdbi.v3.core.Jdbi.withHandle(Jdbi.java:339)
    at io.apicurio.hub.core.storage.jdbc.JdbcStorage.listApiDesigns(JdbcStorage.java:876)
    ... 86 more
Caused by: org.postgresql.util.PSQLException: This connection has been closed.
    at org.postgresql.jdbc.PgConnection.checkClosed(PgConnection.java:803)
    at org.postgresql.jdbc.PgConnection.prepareStatement(PgConnection.java:1621)
    at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.doPrepareStatement(BaseWrapperManagedConnection.java:758)
    at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.prepareStatement(BaseWrapperManagedConnection.java:744)
    at org.jboss.jca.adapters.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:493)
    at org.jdbi.v3.core.statement.DefaultStatementBuilder.create(DefaultStatementBuilder.java:57)
    at org.jdbi.v3.core.statement.SqlStatement.internalExecute(SqlStatement.java:1540)
    ... 94 more
question

Tous les 7 commentaires

Malheureusement, je n'ai pas vu ce problème auparavant. Sur la base d'un peu de recherche sur Google, ma meilleure hypothèse est qu'une autre erreur de base de données se produit (par exemple, un problème de connexion transitoire entre l'application et la base de données) et n'est pas correctement signalée dans le journal (mais est peut-être signalée à l'interface utilisateur ? ). Si cela se produit, la connexion peut être fermée mais également renvoyée au pool de connexions, ce qui entraînera ultérieurement l'erreur « la connexion a été fermée ».

Avez-vous vu d'autres erreurs, peut-être dans l'interface utilisateur uniquement ?

Est-ce reproductible ? Pouvez-vous y arriver avec quelques étapes répétables, ou cela semble-t-il aléatoire ?

Non, je n'ai pas remarqué d'autres erreurs avant cette exception.
J'ai lu un article quelque part, il dit que mysql a un wait_timeout par défaut, et il fermera les connexions inactives après cela, donc la validation en arrière-plan doit être définie. Je n'ai pas trouvé le fichier docker pour apicurio api, je ne sais pas si cela était déjà défini dans l'image docker. Et je ne savais pas s'il existait un paramètre similaire pour postgresql, car cela se produit également lorsque nous utilisons pg.
Peut-être que définir la validation en arrière-plan serait mieux?

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_wait_timeout
https://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/beta500/html/ch13s13.html

Intéressant. Le moment de l'erreur fonctionne-t-il pour cette théorie ? Combien de temps Apicurio s'exécute-t-il avant que ce problème n'apparaisse ?

Voici l'image du docker pour apicurio-api : https://github.com/Apicurio/apicurio-studio/tree/master/platforms/thorntail/api

Le temps ne correspondait pas, il est d'environ 30 minutes dans le cas récent.
J'essaie maintenant d'ajouter ces paramètres de validation à la ligne de commande de démarrage comme documenté ici.
https://github.com/thorntail/thorntail/tree/master/fractions/javaee/datasources#mysql
Je posterai le résultat du test ici.

D'accord très apprécié. Si ces paramètres résolvent le problème, je vais évidemment m'assurer que nous les ajoutons par défaut.

Après quelques jours de test, cela semble fonctionner.
Donc, ajoutez ces paramètres suivants à dockerfile serait utile.

    -Dthorntail.datasources.data-sources.ApicurioDS.valid-connection-checker-class-name={APICURIO_DB_VALID_CONNECTION_CHECKER_CLASS_NAME}\
    -Dthorntail.datasources.data-sources.ApicurioDS.validate-on-match={APICURIO_DB_VALID_ON_MATCH}\
    -Dthorntail.datasources.data-sources.ApicurioDS.background-validation={APICURIO_DB_BACKGROUND_VALIDATION}\
    -Dthorntail.datasources.data-sources.ApicurioDS.exception-sorter-class-name={APICURIO_DB_EXCEPTION_SORTER_CLASS_NAME}\    

Merci d'avoir compris cela, @askfor - j'apprécie beaucoup le suivi. Je vais mettre à jour les images docker, puis documenter ces paramètres dans la documentation apicurio.

Cette page vous a été utile?
0 / 5 - 0 notes