2011-07-21 6 views
0

Nous avons un pool de connexions à la base de données (java JDBC). Chaque fois que nous passons à la caisse, nous effectuons d'abord une annulation de connexion préemptive afin d'éviter les exceptions de connexion. S'il vous plaît ignorer l'analyse de rentabilisation. Du point de vue technique, est-ce que la connexion JDBC ralentit beaucoup les performances des applications (puisque notre application est une entreprise de seconde guerre mondiale)?Java, pool de connexions JDBC, restauration de la connexion JDBC

Répondre

2

Je ne comprends pas pourquoi les connexions provenant directement d'un pool de connexions doivent être annulées. Leur état doit être inactif sinon vous ne seriez pas en mesure de les obtenir de la piscine ?!

Les transactions ont une influence sur les performances. Donc, s'il y a des transactions qui peuvent être annulées, il peut y avoir une requête qui ne peut pas être exécutée parce que la transaction pendante les bloque. Par conséquent, si votre application est critique dans le temps, vous devriez investir du temps pour optimiser votre code. Utilisez uniquement les transactions où vous devez.

2

Il n'existe pas d'annulation de connexion. Peut-être que vous vouliez dire une annulation de transaction. Vous ne devez jamais revenir en arrière sauf si vous avez l'intention de perdre les modifications apportées à la base de données dans la transaction, et vous ne devez jamais valider à moins d'avoir l'intention de valider toutes les modifications apportées à la transaction. Cela dit, je ne comprends pas le terme «nous faisons d'abord une annulation de connexion préemptive pour éviter les exceptions de connexion» et pourquoi vous le feriez en premier lieu. En supposant que vous faites référence à l'invocation de la méthode Connection.rollback(), je considère que c'est une mauvaise pratique. Cela entraînerait une perte de performance, car il nécessite un appel réseau, et oblige la base de données à rejeter l'état de la transaction associée (ce qui n'a aucun sens dans ce scénario, car aucun travail n'a encore été fait). Si vous souhaitez éviter les exceptions impliquant une connexion morte extraite d'un pool de connexions, vous devez configurer le pool pour vérifier si la connexion n'est pas périmée (généralement en exécutant une instruction SQL de test) avant de renvoyer la connexion à l'application. Une fois que l'application a acquis la connexion, elle ne doit pas conserver la connexion après qu'elle n'en a plus besoin; l'application devrait idéalement retourner la connexion à la piscine. Si vous observez la présence de l'objet de connexion, la connexion physique sous-jacente n'est pas disponible pour d'autres demandes et peut en fait être fermée par un pare-feu configuré pour fermer les connexions actives au-delà d'une certaine durée.

1

Totalement d'accord avec le mana.

Vous "extrayez" une connexion d'une piscine, puis vous la manipulez puis vous la rendez à la piscine, une fois que vous avez terminé.

Jetez un coup d'œil à la logique de JBoss Connection Pooling, ou allez simplement avec un package de pool de connexions de production.

Il y a une discussion à Connection pooling options with JDBC: DBCP vs C3P0

1

La manière appropriée pour valider une connexion en provenance de la piscine est d'utiliser un validation query. Si la restauration est due au fait que quelqu'un a peur qu'une connexion "sale" puisse être renvoyée au pool, vous devez utiliser un real resource management framework.

Questions connexes