Comment utiliser MySQL déclaration préparée à l'avance la mise en cache?
Comment puis-je profiter de MySQL possibilité de mettre en cache les requêtes préparées?
L'une des raisons d'utiliser les requêtes préparées, est qu'il n'est pas nécessaire d'envoyer la déclaration préparée elle-même plusieurs fois si la même instruction préparée est d'être utilisé de nouveau.
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb" +
"?cachePrepStmts=true", "user", "pass");
for (int i = 0; i < 5; i++) {
PreparedStatement ps = conn.prepareStatement("select * from MYTABLE where id=?");
ps.setInt(1, 1);
ps.execute();
}
conn.close()
Lors de l'exécution de la au-dessus de Java exemple je vois 5 paires de Préparer et d'Exécuter des commandes dans le mysqld fichier journal. Le déplacement de la ps affectation à l'extérieur de la boucle résultats dans un seul Préparer et 5 pour Exécuter les commandes de la course. Le paramètre de connexion "cachePrepStmts=true" ne semble pas faire une différence ici.
Lors de l'exécution d'un programme similaire à l'aide de Spring et Hibernate le nombre de Préparer les commandes envoyées (1 ou 5), dépend de la cachePrepStmts paramètre de connexion est activée. Comment Hibernate exécuter les instructions préparées pour profiter de la cachePrepStmts? Est-il possible d'imiter ce à l'aide de JDBC pur?
J'ai été l'exécution de cette sur le Serveur MySQL 4.1.22 et mysql-connector-java-5.0.4.jar
OriginalL'auteur Chei | 2008-10-21
Vous devez vous connecter pour publier un commentaire.
Est-ce pas, en fait, ce que vous avez fait en déplaçant votre déclaration d'appel de la boucle?
J'ai peut-être l'incompréhension de la façon dont le cache de MySQL fonctionne, mais le fichier journal nécessairement de rapport le cache de son travail? Il se peut que Spring ou Hibernate a son propre cache intermédiaire qui vérifie les déclarations préparées à l'encontre de ceux qui sont envoyés plus tôt. Il se pourrait que vous voyez lorsque vous exécutez le programme avec le Printemps. Que signifie faire un peu de suivi avec votre système pour voir si le serveur mysqld journal est juste de déclaration les déclarations qu'il a été envoyé, indépendamment de la façon dont il traite avec eux.
OriginalL'auteur Keith Lawrence
Vous devez préparer votre relevé qu'une seule fois, en dehors de la boucle, puis lier les paramètres de la boucle. C'est pourquoi les instructions préparées ont lier des paramètres - de sorte que vous pouvez réutiliser l'instruction préparée.
Hibernate fait exactement cela, le traitement de tous les composants de SQL comme une instruction préparée en coulisses, cependant, vous pourrez évidemment de l'abus de cette si vous utilisez littérale plutôt que de lier des paramètres.
OriginalL'auteur PEELY
Vous devez également définir la déclaration de la taille de la mémoire cache sur le lien d'instance. Je suppose que la taille du cache par défaut est de 0. Ainsi, rien ne serait mis en cache.
OriginalL'auteur Sab
Tout d'abord, votre PreparedStatement est recréé dans la boucle, de sorte que le pilote JDBC est permis de jeter les données préparées. Si vous avez demandé le vilain comportement, et si vous l'avez.
Et puis, PreparedStatement dans MySQL sont un chapitre sur son propre. Réel pour la mise en cache, vous devez en faire la demande explicitement via une connexion de la propriété.
De sorte que vous avez à régler "cachePrepStmts" sur "true" pour obtenir la mise en cache des requêtes préparées. Par défaut, cette propriété est définie sur false.
@voir le manuel MySQL pour votre version de MySQL pour plus de détails
OriginalL'auteur
Vous devez préparer la déclaration de l'extérieur de la boucle.
Je ne sais pas à propos de mysql mise en cache des requêtes préparées, mais c'est la façon JDBC préparées sont censés être réutilisés.
OriginalL'auteur kosoant