0
votes

Trop de connexions ouvertes lors de l'exécution d'une requête

J'ai mon application déployée sur Heroku où je peux voir des connexions ouvertes. Le problème est que lorsque j'exécute des requêtes (par exemple, une connexion simple) puis des numéros de connexions ouverts et je ne sais pas pourquoi. Actuellement, il y a 18 connexions mais cela ne devrait être que quelques-uns. C'est étrange parce que je les ferme toujours dans mon code. Par exemple, il saute de 1 à 17 connexions même lorsque j'essaie de vérifier si les données de connexion sont correctrices. Ici, il est:

My DataSource Bean: P>

    public String setPropValue(String prop, String value, Connection connection) throws SQLException {
    String result="ok";
    PreparedStatement preparedStatement = null;
    try {
        preparedStatement = connection.prepareStatement("UPDATE server_props SET value ='"+value+"' WHERE prop='"+prop+"'");
        preparedStatement.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
        result = e.getMessage();
    }
    connection.close();
    return result;
}


5 commentaires

Vous ne montrez pas comment votre DataSource est configurée. Peut-être que c'est une piscine et préfère rouvrir les connexions plutôt que de les réutiliser. De plus, toute exception non capturée entraînera une rupture d'une connexion, vous devriez faire votre fermeture dans une clause enfin (ou utiliser Essayer avec les ressources)


J'ai édité mon post


Cette source de données sera un pool de connexion, le type exact dépendra de ce que Spring trouve sur le chemin de la classe. C'est donc votre explication.


Alors, que puis-je changer pour le faire approprié?


Vous devez comprendre comment votre pool de connexion est configuré et définit le nombre maximal de connexions sur une figure que vous serez satisfaite. Comme nous ne savons pas quel pool de connexion que vous utilisez, nous ne pouvons pas vous dire exactement comment.


3 Réponses :


1
votes

Il est préférable de mettre la connexion.Close () dans votre relevé enfin xxx


1 commentaires

Cela ne répond pas à la question, suggère simplement une amélioration.



1
votes

Vous pourrez savoir si son propre code obtienne toutes ces connexions si vous réutilisez la même connexion d'un appel à datasource.geconnection () dans les ressources (comme elle est autoclotionable) et s'est débarrassé de tous les appels vers connexion.close (); : xxx


4 commentaires

Vous pouvez également vérifier si votre DataSource établit une taille de pool initiale qui pourrait également être une cause de ces connexions supplémentaires lorsque vous obtenez le premier


"De plus, vous voudrez peut-être vérifier si votre DataSource établit une taille de pool initiale qui pourrait également être une cause de ces connexions supplémentaires lorsque vous obtenez le premier" Comment faire cela? J'ai utilisé votre solution et maintenant cette méthode renvoie "pour la chaîne d'entrée: la connexion est fermée."


Avez-vous supprimé tous les appels vers Connection.close () dans chacune des méthodes, car ils fermeraient conn étant transmis sur l'appel suivant? Veuillez ajouter la trace de la pile si cela n'aide pas. De nombreuses implémentations de DataSource prennent en charge la taille initiale de la taille initiale = NN, mais vous devez rechercher la documentation du fournisseur DS pour vérifier le paramètre de propriété exact à ajouter (qui suppose qu'il est pris en charge), il peut être réglé sur 17/18 pour votre serveur d'application.


J'ai modifié un peu votre code. J'ai ajouté la connexion conn = datasource.geconnection () dans le constructeur et cela fonctionne presque comme je m'attends. C'est 8 connexions mais c'est toujours mieux que 18.



0
votes

Cette solution sera-t-elle bonne? XXX


0 commentaires