J'ai une jolie petite application Web Spring Boot JPA. Il est déployé sur Amazon Beanstalk et utilise un Amazon RDS pour la persistance des données. Il n'est cependant pas utilisé si souvent et échoue donc après un certain temps avec ce type d'exception:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: le dernier paquet reçu avec succès du serveur remonte à 79 870 633 millisecondes.
Le dernier paquet envoyé avec succès au serveur remonte à 79 870 634 millisecondes. est plus longue que la valeur configurée par le serveur de «wait_timeout». Vous devez envisager d'expirer et / ou de tester la validité de la connexion avant de l'utiliser dans votre application, d'augmenter les valeurs configurées par le serveur pour les délais d'expiration du client ou d'utiliser la propriété de connexion Connector / J 'autoReconnect = true' pour éviter ce problème.
Je ne sais pas comment configurer ce paramètre et je ne peux pas trouver d'informations à ce sujet sur http://spring.io (un très bon site cependant). Quelles sont les idées ou les pointeurs vers des informations?
la source
DataSource
et vérifier ses propriétés. stackoverflow.com/a/36586630/148844 Spring Boot ne configurera pas automatiquement leDataSource
si vous en avez@Beans
qui définissent unDataSource
. docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/…Réponses:
Je suppose que le démarrage configure le
DataSource
pour vous. Dans ce cas, et puisque vous utilisez MySQL, vous pouvez ajouter ce qui suit à votreapplication.properties
jusqu'à 1.3Comme djxak noté dans le commentaire, 1.4+ définit les espaces de noms spécifiques pour les quatre connexions pools supports Spring Boot:
tomcat
,hikari
,dbcp
,dbcp2
(dbcp
est OBSOLETE 1,5). Vous devez vérifier le pool de connexions que vous utilisez et vérifier si cette fonctionnalité est prise en charge. L'exemple ci-dessus était pour tomcat, vous devrez donc l'écrire comme suit dans 1.4+:Notez que l'utilisation de
autoReconnect
n'est pas recommandée :la source
spring.datasource.testOnBorrow
etspring.datasource.test-on-borrow
fonctionnera très bien. Consultez la documentation pour plus de détails.SELECT 1
garantit que la connexion a été testée avant d'être transmise à l'application. En utilisanttestOnBorrow = true
, les objets seront validés avant d'être empruntés à la piscine. Si l'objet ne parvient pas à se valider, il sera supprimé du pool et tentera d'en emprunter un autre. REMARQUE - pour qu'une valeur vraie ait un effet, le paramètre validationQuery doit être défini sur une chaîne non nulle.tomcat
,hikari
,dbcp
,dbcp2
. Ainsi, par exemple, pourtomcat-jdbc
connection-pool, les propriétés doivent être:spring.datasource.tomcat.testOnBorrow=true
etspring.datasource.tomcat.validationQuery=SELECT 1
.If you define your own DataSource bean, auto-configuration will not occur.
J'ai suivi un guide pour OAuth2 et j'ai eu@Bean(name = "OAuth") public DataSource secondaryDataSource()...
et il n'a pas été auto-configuré ni utilisétestOnBorrow
.Les suggestions ci-dessus n'ont pas fonctionné pour moi. Ce qui a vraiment fonctionné, c'est l'inclusion des lignes suivantes dans l'application.
Vous pouvez trouver l'explication ici
la source
La configuration
spring.datasource.tomcat.testOnBorrow=true
dans application.properties ne fonctionnait pas.La configuration par programme comme ci-dessous a fonctionné sans aucun problème.
la source
Je viens de passer à Spring Boot 1.4 et j'ai trouvé que ces propriétés avaient été renommées:
la source
La réponse de whoami est la bonne. En utilisant les propriétés comme suggéré, je n'ai pas pu faire fonctionner cela (en utilisant Spring Boot 1.5.3.RELEASE)
J'ajoute ma réponse car c'est une classe de configuration complète, donc cela pourrait aider quelqu'un qui utilise Spring Boot:
la source
J'ai un problème similaire. Spring 4 et Tomcat 8. Je résous le problème avec la configuration Spring
J'ai testé. Ça marche bien! Ces deux lignes font tout pour se reconnecter à la base de données:
la source
Au cas où quelqu'un utiliserait DataSource personnalisé
Les propriétés doivent ressembler à ce qui suit. Notez les @ConfigurationProperties avec le préfixe. Le préfixe est tout avant le nom réel de la propriété
Une référence pour Spring Version 1.4.4.RELEASE
la source
Comme certains l'ont déjà souligné, spring-boot 1.4+, a des espaces de noms spécifiques pour les quatre pools de connexions. Par défaut, hikaricp est utilisé dans spring-boot 2+. Vous devrez donc spécifier ici le SQL. La valeur par défaut est
SELECT 1
. Voici ce dont vous auriez besoin pour DB2 par exemple:spring.datasource.hikari.connection-test-query=SELECT current date FROM sysibm.sysdummy1
Attention : si votre pilote prend en charge JDBC4, nous vous recommandons vivement de ne pas définir cette propriété. Ceci concerne les pilotes «hérités» qui ne prennent pas en charge l'API JDBC4 Connection.isValid (). Il s'agit de la requête qui sera exécutée juste avant qu'une connexion ne vous soit donnée depuis le pool pour valider que la connexion à la base de données est toujours active. Encore une fois, essayez d'exécuter le pool sans cette propriété, HikariCP enregistrera une erreur si votre pilote n'est pas compatible JDBC4 pour vous en informer. Par défaut: aucun
la source
Pour ceux qui veulent le faire à partir de YAML avec plusieurs sources de données, il existe un excellent article de blog à ce sujet: https://springframework.guru/how-to-configure-multiple-data-sources-in-a-spring-boot -application/
Cela dit essentiellement que vous devez tous deux configurer les propriétés de la source de données et la source de données comme ceci:
N'oubliez pas de supprimer
@Primary
des autres sources de données.la source