Quand doit-on utiliser un PreparedStatement au lieu d'une Déclaration?
Je connais les avantages de l'utilisation de PreparedStatement
, qui sont
- requête est réécrit et compilées par le serveur de base de données
- protection contre les injections SQL
Mais je veux savoir quand on l'utilise à la place de Statement
?
- double possible de PreparedStatements et de la performance
Vous devez vous connecter pour publier un commentaire.
Si vous n'utilisez pas préparé
déclaration, le serveur de bases de données
d'avoir à analyser, et de calculer un
plan d'exécution de l'instruction
chaque fois que vous l'exécutez. Si vous trouvez
que vous allez exécuter la même déclaration
à plusieurs reprises (avec différents
les paramètres) puis sa peine préparation
l'instruction en une seule fois et à réutiliser cet
déclaration préparée. Si vous êtes
l'interrogation de la base de données ad hoc puis
il y a probablement peu d'avantages à
c'.
C'est un avantage, vous avez presque
toujours envie d'où une bonne raison de
utiliser un
PreparedStatement
à chaque fois.Sa conséquence d'avoir à
paramétrer la requête, mais il ne
faire courir beaucoup plus sûr. L'
seul le temps je pense que ce
ne serait pas utile, c'est si vous avez été
permettant adhoc requêtes de base de données; Vous
pourrait tout simplement utiliser l'Instruction
objet si vous avez été le prototype d'
application et plus rapide pour vous,
ou si la requête ne contient pas de
les paramètres.
Demander à Tom de avis:
Il s'agit en particulier de parler d'Oracle, mais le même principe s'applique à toute base de données qui met en cache les plans d'exécution.
De la base de données des applications de l'échelle et de prévenir les attaques par injection SQL en même temps? Quel est l'inconvénient?
Je serait à son tour cette tour: dans un distribué publiquement application, vous devez généralement toujours utiliser les requêtes préparées à moins d'avoir une très bonne raison de ne pas, et vous devez toujours fournir des paramètres "correctement" à la déclaration préparée, et non pas par épissage dans la chaîne de requête.
Pourquoi? Eh bien, simplement parce que les raisons que vous avez donné (ou au moins, la seconde)...
PreparedStatements doivent être utilisés avec beaucoup de prudence dans les clauses where.
Supposons qu'un tableau est défini comme:
(par exemple, "o: object-ID (clé étrangère), k: attribut-clé, v: attribut-valeur").
En outre, il est une (non-unique) de l'index sur le v.
Supposons que cette table contient 200 millions de lignes insérées comme:
("Ainsi, chaque objet o a les attributs k1=v1 et k2=o")
vous ne devez pas créer des requêtes comme:
("trouver des objets qui ont deux attributs")
Mon expérience avec ORACLE et MSSQL est, que ces requêtes pourraient avoir besoin de nombre de minutes pour revenir. Cela est vrai même si aucune ligne correspond à la clause where. Cela dépend de la manière dont le SQL-Serveur décide de recherche tx.v ou ty.v première.
On devrait mettre les valeurs pour les colonnes k et v directement dans l'instruction. Je pense que c'est parce que le SQL-Serveurs prennent les valeurs en compte lors du calcul de l'exécution du plan.
Une requête ressembler à ceci revient toujours après millisecondes:
("SQL-Serveur cherchera toujours les premiers pour v='1234' et puis pour v='v1' ")
Ce qui concerne
Wolfgang
Vous pouvez toujours utiliser PreparedStatement au lieu de Tresorerie( select, insert , update, delete ). De meilleures performances et protégé contre les injections SQL.
Mais, ne pas l'utiliser avec une dynamique de la demande comme une demande avec
WHERE variable IN [ hundreds possibilities ]
:C'est contre-productif, vous avez perdu de la performance et de la mémoire parce que vous le cache à chaque fois une nouvelle demande, et PreparedStatement ne sont pas seulement pour l'injection SQL, c'est à propos de la performance. Dans ce cas, la requête ne sera pas plus lent.
De votre piscine, la limite est de PreparedStatment ( -1 par défaut, mais vous devez les limiter ), et vous arriverez à cette limite ! et si vous n'avez pas de limite ou de très grande limite, vous avez un risque de fuite de mémoire, et dans les cas extrêmes, des erreurs de dépassement de mémoire. Donc, si c'est pour votre petit projet personnel utilisé par 3 utilisateurs, ce n'est pas dramatique, mais vous ne voulez pas que si vous êtes dans une grande entreprise et que vous êtes à l'application est utilisée par des milliers de personnes et des millions demande de.
Un peu de lecture.
IBM : Périodique OutOfMemory des erreurs avec la déclaration de mise en cache
Déclaration: à Chaque fois que la requête sql est en cours d'exécution,cette instruction sql est envoyé au SGBD où il est compilé. Ainsi, il augmente la charge du serveur et diminue les performances.
PreparedStatement: Contrairement à la Déclaration de PreparedStatement est donnée une requête sql en tant que paramètre lorsqu'il est créé.
Cette instruction sql est envoyé à la Base de données où il est compilé.
Ainsi,dans preparedStatement compilé n'arrive qu'une fois, mais dans l'état compilé qui se passe chaque fois Énoncé est appelé.
En plus de prévenir l'injection SQL, mise en forme de la portabilité (que vous ne pouvez pas obtenir à partir de
Statement
), la performance est la raison évidente. Cependant,PreparedStatement
ne vient pas sans peine. Par exemple, il est généralement plus lente queStatement
s'exécute qu'une seule fois, comme il y a des frais généraux. L'idée générale est doncPreparedStatement
doit être utilisée lorsque vous exécutez la même requête à plusieurs reprises. Cependant, combien de surcharge est très serveur de base de données spécifique à l'implémentation, donc exactement quand choisirPreparedStatement
surStatement
, de facteur de performance, faut vraiment être basé sur votre expérience/des expériences spécifiques, à un serveur de base de données.