J'ai une question concernant l'utilisation générale de la déclaration préparée avec la mise en commun de la connexion. P>
Les déclarations préparées sont généralement liées à une connexion uniquement. Dans notre application, une statuture préparée est créée au démarrage et exécutées à un point ultérieur. P>
Si au moment de l'exécution d'une déclaration préparée spécifique, la connexion associée à l'instruction préparée est occupée à exécuter d'autres déclarations que la manière dont cette instruction requise obtiendra exécutée.Des cette instruction attendra la connexion pour que la connexion soit libre ou que cette déclaration soit donnée de préférence dans l'exécution? P>
J'ai testé cela en suivant la fonction Sleep () avec la base de données Apache Derby qui appelle Java Fonction Dormir en classe TimehandlingTest. P>
Créer une fonction Sleep () renvoie une langue entier Java Paramètre Style Java No SQL Nom externe 'com.derby.test.timehandlingtest.sleep'; P>
et a effectué deux instructions préparées d'une connexion et appelée fonction de sommeil () d'une instruction préparée et de simples SQL Select avec d'autres.Simple SQL Select a pris presque la même heure (10s) pour laquelle la première déclaration préparée était dormait. C'est ce que cela signifie que L'objet de connexion ne peut pas être utilisé pour une exécution par plus d'une déclaration préparée à la fois.Veuillez vous corriger si je me trompe. P>
5 Réponses :
Vous ne pouvez pas renvoyer la connexion code> à la piscine si vous envisagez d'utiliser le En d'autres termes: vous ne pouvez utiliser qu'un PaypareStatement code>. p>
PreachStatement code> construit à partir d'une connexion code> code> que vous avez actuellement. p>
Cela ne semble pas être une solution raisonnable que ma demande n'aurait besoin de connexions comme des déclarations préparées.
Ce n'est pas une solution, c'est une exigence! Si vous ne suivez pas cela, vous rencontrerez des problèmes plus tôt ou tard.
Cela ressemble à un moyen inhabituel d'utiliser votre pool de connexion. Même si les connexions sont dans une piscine, elles ne doivent être utilisées que par un fil à la fois. J'ai tendance à créer la déclaration préparée et à l'utiliser très près du point de création. En outre, certains pilotes JDBC soutiennent désormais la mise en cache de déclaration qui réduit les frais généraux de l'utiliser de cette manière. P>
La valeur de la constitution préparée réside dans la capacité de la base de données elle-même de créer un plan d'exécution pour la déclaration pouvant être réutilisée pour des paramètres arbitraires et donc est Générique de nature (bien sûr, exige que vous utilisiez des paramètres de votre statutment, par exemple
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = 1200 WHERE ID = 3");
Merci pour la réponse, mais ma question principale est que si la connexion associée à ma déclaration préparée est occupée à exécuter toute autre déclaration préparée indiquant que ma déclaration de préparation exécutera.Can nous exécutons plusieurs relevés préparés une seule connexion à un moment donné?
Un moyen de maintenir un cache où les connexions sont mappées sur des déclarations préparées. Lorsque vous recevez une connexion du chèque de billard si elle est mappée sur la déclaration préparée à exécuter. Sinon, passez la déclaration préparée au pilote JDBC afin qu'il soit compilé. Puis mappez-le à la connexion. L'inconvénient de cette approche est que plusieurs connexions pourraient obtenir des copies de la même déclaration préparée. Mais il semble que Voici ce que certains serveurs J2EE font . P>
En supposant que ceci est une application multi-threadée, les objets code> code> sont généralement associés à un seul fil à un instant de temps. Cela signifie que si une poignée de connexion logique est renvoyée à votre application, il n'est pas nécessaire que la connexion physique sous-jacente soit identique et qu'elle soit soutenue pour (à moins que cela ne fait partie de la même transaction). Si votre application devrait gérer des utilisateurs simultanés sans aucun tracas, une connexion code> code> serait créée dans chaque thread de démarrage d'une transaction, et cet objet ne serait pas affiné par des threads. Sous la cagoule, différentes connexions physiques dans la piscine exécuteraient les requêtes SQL associées aux instructions préparées, sur plusieurs threads, à nouveau sans aucune affranchissement. P> Connexion CODE> Les objets acquis par un fil ne sont pas retournés dans la piscine tant qu'ils ne sont pas fermés. Ceci s'applique à la fois à l'enveloppe de connexion logique (qui est typiquement renvoyé par une source de données gérée par un serveur d'applications) à l'application, ainsi qu'à la connexion physique. En outre, des connexions physiques peuvent être partagées sur plusieurs connexions logiques tant qu'ils font partie de la même transaction. P>
Merci pour la réponse.As par ma compréhension préparé des statistionnements sont mis en cache sur la base de la connexion physique non conforme à la connexion logique.Si que la connexion physique est déjà occupée dans la déclaration d'exécution, pouvons-nous exécuter une autre déclaration préparée sur la même connexion physique ou avons-nous besoin Pour recréer cette déclaration préparée avec une connexion gratuite disponible auprès de la piscine.
Votre code est-il exécuté dans un serveur d'applications? La réponse varie lorsque vous utilisez une source de données par opposition à un drivermanager pour obtenir la connexion.
@Vineet: Notre application est une application Java simple qui ne fonctionne pas sur Application Server.Nous obtenons des connexions à partir du gestionnaire de pilotes.