Consignation des états préparés dans Java
Une chose qui a toujours été une douleur pour se connecter à SQL (JDBC) des erreurs lorsque vous avez un PreparedStatement au lieu de la requête elle-même.
Vous vous retrouvez toujours avec des messages comme:
2008-10-20 09:19:48,114 ERROR LoggingQueueConsumer-52 [Logger.error:168] Error
executing SQL: [INSERT INTO private_rooms_bans (room_id, name, user_id, msisdn,
nickname) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE room_id = ?, name = ?,
user_id = ?, msisdn = ?, nickname = ?]
Bien sûr, je pourrais écrire une méthode d'assistance pour la récupération des valeurs et de l'analyse/remplacer les points d'interrogation avec des valeurs réelles (et ce sera probablement aller dans cette voie si je ne suis pas d'obtenir un résultat de cette question), mais je voulais juste savoir si ce problème a été résolu avant par quelqu'un d'autre et/ou si est-il un générique journalisation helper qui permettrait de le faire automatiquement pour moi.
Édité après quelques réponses:
Les bibliothèques fournies jusqu'à présent semble être adapté à l'enregistrement des déclarations à des fins de débogage, ce qui sans aucun doute est utile. Cependant, je suis à la recherche d'un moyen de prendre un PreparedStatement lui-même (pas une sous-classe) et la journalisation de son instruction SQL à chaque fois qu'une erreur se produit. Je ne voudrais pas déployer une production app avec une autre implémentation de PreparedStatement.
Je crois que je suis à la recherche d'un utilitaire de la classe, pas un PreparedStatement de spécialisation.
Merci!
source d'informationauteur kolrie
Vous devez vous connecter pour publier un commentaire.
J'ai essayé log4jdbc et il a fait le travail pour moi.
De SÉCURITÉ REMARQUE: à compter d'aujourd'hui d'août 2011, la consignés les résultats d'une log4jdbc déclaration préparée à l'avance ne sont PAS SÛRS à exécuter. Ils peuvent être utilisés pour l'analyse, mais ne doivent JAMAIS être nourris à l'arrière dans un SGBD.
Exemple de fichier journal généré par logjdbc:
La bibliothèque est très facile à installer:
Ma configuration avec HSQLDB :
Avec Oracle :
logback.xml :
Trop mauvais, il n'était pas sur un repository maven, mais toujours utile.
De ce que j'ai essayé, si vous définissez
Vous obtenez seulement les déclarations dans l'erreur, cependant, je ne sais pas si cette bibliothèque a un impact sur les performances.
C'est très de base de données-dépendante. Par exemple, je comprends que certains pilotes JDBC (par exemple, sybase, peut-être ms-sql) gérer les requêtes préparées par créer une procédure stockée temporaire sur le serveur, puis en l'invoquant cette procédure avec les arguments fournis. De sorte que le SQL complète n'est jamais vraiment passé du client.
Comme un résultat, l'API JDBC ne pas exposer les informations que vous recherchez. Vous pouvez être en mesure de lancer votre déclaration des objets internes pilote de mise en œuvre, mais probablement pas - appserver peut bien envelopper les déclarations dans sa propre mise en œuvre.
Je pense que vous pouvez juste avoir à mordre la balle et écrivez votre propre classe qui interpole les arguments dans l'espace réservé SQL. Ce sera maladroit, parce que vous ne pouvez pas demander à PreparedStatement pour les paramètres qui ont été définis, de sorte que vous aurez à les rappeler dans un objet d'assistance, avant de les transmettre à la déclaration.
Il me semble que l'un de l'utilité des bibliothèques de l'enveloppe de votre pilote la mise en œuvre des objets est le moyen le plus pratique de faire ce que vous essayez d'atteindre, mais ça va être désagréable.
Utilisation P6Spy: Oracle, Mysql, JNDI, JMX, Printemps et Maven sympathique. Hautement configurable.
Simple et à faible niveau d'intégration
Pouvez imprimer la stacktrace.
Pouvez uniquement imprimer lourd appels temps threashold base.
Si vous utilisez MySQL, MySQL Connector PreparedStatement.toString() inclut les paramètres liés. Si tiers des pools de connexion peut briser ce.
Sous-classe PreparedStatement pour construire la chaîne de requête que les paramètres sont ajoutés. Il n'y a pas moyen d'extraire le SQL à partir d'un PreparedStatement, comme il utilise le binaire compilé forme.
LoggedPreparedStatement semble prometteur, même si je n'ai pas essayé.
Un avantage de ces plus un proxy pilote qui enregistre toutes les requêtes, c'est que vous pouvez modifier la chaîne de requête avant de vous connecter. Par exemple, dans une carte PCI de l'environnement, vous pourriez souhaitez masquer les numéros de carte.