Préparées avec le Regroupement de Connexion
J'ai une question concernant l'utilisation générale de l'Instruction Préparée avec le regroupement de connexion.
Préparées sont généralement attachés à une seule connexion.Dans notre application, un PreparedStatement est créé au début et exécuté à un moment plus tard.
Si, au moment de l'exécution d'une instruction préparée connexion associée à l'instruction préparée est occupé à exécuter d'autres états que la façon dont cette déclaration requise sera exécuté.Cette déclaration va attendre pour la connexion d'obtenir gratuitement ou cette déclaration, la préférence sera donnée à l'exécution?
Mise à jour
J'ai testé en suivant SLEEP() de la fonction avec la base de données Apache derby qui appelle java fonction de sommeil dans la classe TimeHandlingTest.
CRÉER la FONCTION SLEEP() RETOURNE ENTIER LANGAGE JAVA PARAMÈTRE de STYLE JAVA PAS de SQL EXTERNE NOM " com.derby.test.TimeHandlingTest.le sommeil";
Et a fait deux déclarations préparées à partir d'une seule connexion et appelé Sleep() de la fonction d'une instruction préparée et simple sql select avec les autres.Simple sql select a fallu presque en même temps(10s) pour qui, la première déclaration était en train de dormir.Cela signifie qu'un objet de connexion ne peut pas être utilisé pour l'exécution en plus d'une déclaration préparée à l'heure.S'il vous plaît corrigez-moi si je me trompe.
Notre Application est une simple application java qui n'est pas en cours d'exécution sur le serveur d'applications.Nous sommes les connexions à partir du gestionnaire de pilote.
OriginalL'auteur Amit Verma | 2011-05-23
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas retourner la
Connection
à la piscine si vous prévoyez sur l'utilisation de laPreparedStatement
.En d'autres termes: vous ne pouvez utiliser qu'un
PreparedStatement
construit à partir d'unConnection
que vous avez actuellement.Ce n'est pas une solution, c'est une exigence! Si vous ne suivez pas cela, alors vous allez avoir des difficultés plus tôt ou plus tard.
OriginalL'auteur Joachim Sauer
La valeur de PreparedStatement réside dans la capacité de la base de données elle-même pour créer un plan d'exécution de l'instruction qui peuvent être réutilisés pour l'ajout de paramètres arbitraires et est donc
de nature générique (bien sûr, cela nécessite que vous utilisez les paramètres de votre statetment, par exemple
En revanche, si vous utilisez la concaténation de chaîne pour coller les valeurs de paramètres dans le code SQL de la base de données ne serait pas en mesure de construire un générique du plan d'exécution. Ainsi, il ne ferait aucune différence si vous utilisez un PreparedStatement ou de la Déclaration, par exemple
ne serait pas en mesure d'utiliser l'avantage de PreparedStatements.
Votre question implique que vous souhaitez réutiliser l'objet PreparedStatement, ce qui n'est pas nécessaire. Bien sûr, si vous pouvez utiliser un objet PreparedStatement pour mettre à jour plusieurs valeurs, etc. c'est une utilisation plus efficace des ressources. Néanmoins, la durée de vie (ou au moins la durée de vie utile) de la PreparedStatement est liée à la Connexion, donc si vous appelez conn.close() la PreparedStatement est rendu inutile. Néanmoins, la plupart de bons pilotes dans la mise en commun de la situation de réutiliser le même PreparedStatement objets.
En bref, ne pas mettre en cache les PreparedStatement indépendant de la connexion.
OriginalL'auteur Chris
En supposant que c'est une application multi-thread,
Connection
objets sont généralement associées à un seul thread à tout instant du temps.Connection
les objets acquis par un fil ne sont pas retournés à la piscine jusqu'à ce qu'ils sont fermés. Cela s'applique à la fois à la logique de connexion wrapper (qui est généralement renvoyée par une source de données géré par un serveur d'application) à la demande, ainsi que de la connexion physique. Aussi, les connexions physiques peuvent être partagés entre plusieurs connexions logiques tant qu'ils font partie de la même transaction.Cela signifie que si une connexion logique poignée est renvoyé à votre application, il n'est pas nécessaire que la physique sous-jacente, la connexion est la même et est soutenue (sauf s'il fait partie de la même opération). Si votre application est prévue pour gérer les utilisateurs simultanés sans aucun tracas, un
Connection
objet est créé dans chaque thread du démarrage d'une transaction, et que cet objet ne serait pas soutenue, dans les threads. Sous le capot, les différentes connexions physiques dans la piscine serait d'exécuter les requêtes SQL associée avec les requêtes préparées, à travers de multiples threads, encore une fois sans aucune prétention.OriginalL'auteur Vineet Reynolds
Cela sonne comme une manière inhabituelle pour l'utilisation de votre pool de connexion. Même si les connexions sont dans une piscine, ils ne doivent être utilisé que par un seul thread à la fois. J'ai tendance à créer de l'instruction préparée et très proche du point de création. Aussi, certains pilotes JDBC maintenant la Déclaration de support de mise en cache qui réduit les frais généraux de l'utiliser de cette façon.
OriginalL'auteur DaveH
Un moyen de contourner cela est de maintenir un cache, où les connexions sont mappés à des déclarations préparées à l'avance. Lorsque vous obtenez une connexion à partir de la piscine vérifier si elle est associée à la déclaration préparée à exécuter. Si non, passer à l'instruction préparée pour le pilote JDBC de sorte qu'il est compilé. Puis la carte pour la connexion. L'inconvénient de cette approche est que plus d'une connexion peut obtenir des copies de la même déclaration préparée. Mais il semble que c'est ce que certains serveurs J2EE faire.
OriginalL'auteur Vijay Mathew