Comment puis-je atténuer Connexion fuite déclenchée pour la connexion com.mysql.jdbc.JDBC4Connection@11d08960,
J'ai un mqtt client se demande s'abonnant à partir de sujets,
et puis je lui donner pour threadpool de taille fixe 50.
Im en utilisant hikaricp 2.4.2 pour la DB de mise en commun de bases de données MySQL.
Je suis actuellement en utilisant 2.4.2 et c'est ma configuration
HikariConfig config = new HikariConfig();
config.setDataSourceClassName(CLASS_FOR_NAME);
config.setJdbcUrl(HOST);
config.setUsername(USER);
config.setPassword(PASS);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
config.setLeakDetectionThreshold(TimeUnit.SECONDS.toMillis(30));
config.setValidationTimeout(TimeUnit.MINUTES.toMillis(1));
config.setMaximumPoolSize(10);
config.setMinimumIdle(0);
config.setMaxLifetime(TimeUnit.MINUTES.toMillis(2)); //120 seconds
config.setIdleTimeout(TimeUnit.MINUTES.toMillis(1)); //minutes
config.setConnectionTimeout(TimeUnit.MINUTES.toMillis(5));
config.setConnectionTestQuery("/* ping */SELECT 1");
Heres le message de log complet :
WARNLOG:
811439 [Hikari femme de ménage (piscine HikariPool-0)] AVERTIR
com.zaxxer.hikari.piscine.ProxyLeakTask - Connexion de détection de fuite
déclenchée pour la connexion com.mysql.jdbc.JDBC4Connection@11d0896, pile
trace suit java.lang.Exception: lien Apparent fuite détectée
au com.hcpdatabase.Source de données.getConnection(source de données.java:69)
au com.la base de données.AccessDatabase.create_alert(AccessDatabase.java:3849)
au com.praticable.StartTaskRunnable2.execute(StartTaskRunnable2.java:78)
Est-ce normal ? dois-je prendre ce?
DataSource
classe, vous savez celui où la fuite est détectée.Êtes-vous de fermer votre
Connections
?oui, parfois il y a un certain éclat de transactions de 30 de transactions en une seconde, je pense que c'est pourquoi il n'est pas thread-safe(je pense).
J'ai toujours utiliser try{}finally{// fermeture de la connexion ici} tout le temps.
Je n'ai jamais rien dit à propos de la sécurité des threads. Connexion fuites sont une chose très simple, vous découvrez une connexion, mais jamais le fermer (c'est à dire retourner à la piscine). Si vous utilisez try/finally (ou essayer avec des ressources), de manière cohérente partout, il devrait y avoir aucune fuite de connexions.
OriginalL'auteur david | 2015-11-24
Vous devez vous connecter pour publier un commentaire.
Que j'ai passé en revue mes codes, encore et encore. Je suis venu à réaliser que j'étais aboiements le mauvais arbre, Semble hikari est très fiable quand il s'agit de la connexion de fuite. Le problème, c'est quand amazon aws ec2 instance est en train de voler certains de mon cpu et est encore plus grand que ce que je pensais. Ainsi, après le cpu monte à 99%, de Connexion de fuite est détectée, même si mes codes clairement fermé dans le bloc finally. Donc, le problème réside avec la machine.
Je vous remercie pour tous ceux qui ont participé à la réponse.
OriginalL'auteur david
à pied à travers le code avec "trace de la pile" et cela vous ferait de l'onu-fermé raccordement ou la connexion qui prend plus de seuil.
config.setConnectionTestQuery("/* ping */ ");
à ceconfig.setConnectionTestQuery("/* ping */ SELECT 1");
et maintenant, je nai pas vu tout+ de 100 secondes de sommeil connexions.test de la requête qui prend+ de 100 secondes ! bizarre. votre question déjà a
config.setConnectionTestQuery("/* ping */ SELECT 1");
Cependant, la bonne chose est de savoir si la requête commence par/* ping */
(c'est le cas et sensibles à l'espace) permet Connector/J de pilote pour effectuer léger ping sur le serveur au lieu de l'instruction en cours d'exécution.pas ce que je veux dire, c'est que+ de 100 secondes en veille/sommeil connexions est en fait de la fuite de connexion parce que j'ai déjà mis ma connexion à mourir en moins de 90 secondes.
où avez-vous mis de 90 secondes? il est de 120 ! à partir de la question:
config.setMaxLifetime(TimeUnit.MINUTES.toMillis(2)); // 120 seconds
config.setIdleTimeout(TimeUnit.MINUTES.toMillis(1)); // minutes
qui est maxlife temps , si le repos de son seulement une minute. Je ne sais pas pourquoi > 80 et moins de 90 j'ai observé iciOriginalL'auteur Nitin