___ qstnhdr ___ Wie verwende ich MySQL Prepared Statement Caching?
___ qstntxt ___
Wie nutze ich die Fähigkeit von MySQL, vorbereitete Anweisungen zwischenzuspeichern?
Ein Grund für die Verwendung vorbereiteter Anweisungen besteht darin, dass die vorbereitete Anweisung selbst nicht mehrmals gesendet werden muss, wenn dieselbe vorbereitete Anweisung erneut verwendet werden soll.
%Vor%
Wenn ich das obige Java-Beispiel ausführe, sehe ich in der mysqld-Protokolldatei fünf Paare von Prepare- und Execute-Befehlen. Das Verschieben der ps-Zuweisung außerhalb der Schleife führt natürlich zu einem einzelnen Befehl Prepare und 5 Execute. Der Verbindungsparameter "cachePrepStmts = true" scheint hier keinen Unterschied zu machen.
Wenn Sie ein ähnliches Programm mit Spring und Hibernate ausführen, hängt die Anzahl der gesendeten Prepare-Befehle (1 oder 5) davon ab, ob der Verbindungsparameter cachePrepStmts aktiviert ist. Wie führt Hibernate vorbereitete Anweisungen aus, um die cachePrepStmts-Einstellung zu nutzen? Ist es möglich, dies mit reinem JDBC nachzuahmen?
Ich habe dies auf MySQL Server 4.1.22 und mysql-connector-java-5.0.4.jar
ausgeführt
___ answer222085 ___
Ist es möglich, dies nachzuahmen?
reine JDBC?
Ist das nicht genau das, was Sie getan haben, indem Sie Ihren vorbereiteten Anweisungsaufruf aus der Schleife verschoben haben?
Ich mag die Funktionsweise des MySQL-Caches falsch verstehen, aber meldet die Protokolldatei notwendigerweise die Arbeit des Caches? Es kann sein, dass Spring oder Hibernate einen eigenen Zwischenspeicher hat, der die vorbereiteten Anweisungen mit denen vergleicht, die zuvor gesendet wurden. Es kann sein, dass Sie sehen, wenn Sie das Programm mit Spring ausführen. Das würde bedeuten, ein wenig mit Ihrem System zu verfolgen, um zu sehen, ob das mysqld-Protokoll nur die Anweisungen meldet, die es gesendet hat, egal wie es mit ihnen umgeht.
___ answer2202786 ___
Sie müssen auch die Größe des Anweisungscache für die Verbindungsinstanz festlegen. Ich nehme an, dass die Standard-Cache-Größe 0 ist. Daher würde nichts zwischengespeichert werden.
___ answer222207 ___
Sie sollten Ihre Anweisung nur einmal außerhalb der Schleife vorbereiten und dann die Parameter in der Schleife binden. Aus diesem Grund haben vorbereitete Anweisungen Bindeparameter - so können Sie die vorbereitete Anweisung wiederverwenden.
Hibernate macht genau das, behandelt alle SQL als eine vorbereitete Aussage hinter den Kulissen, obwohl Sie dies offensichtlich missbrauchen können, wenn Sie literal statt bind Parameter verwenden.
___ tag123mysql ___ MySQL ist ein freies, relationales Datenbank-Managementsystem (RDBMS), das die strukturierte Abfragesprache (SQL) verwendet. Verwenden Sie dieses Tag NICHT für andere DBs wie SQL Server, SQLite usw. Dies sind verschiedene DBs, die alle SQL verwenden, um die Daten zu verwalten.
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen.
___ antwort224062 ___
Zuerst wird Ihr PreparedStatement in der Schleife neu erstellt, sodass der JDBC-Treiber die vorbereiteten Daten verwerfen kann. Also hast du nach dem hässlichen Verhalten gefragt, und du hast es verstanden.
Und dann ist PreparedStatement in MySQL ein eigenes Kapitel. Um echtes Caching zu haben, müssen Sie es explizit über eine Verbindungseigenschaft anfordern.
Sie müssen also die Eigenschaft "cachePrepStmts" auf "true" setzen, um Caching für vorbereitete Anweisungen zu erhalten. Standardmäßig ist diese Eigenschaft auf false festgelegt.
@Siehe das MySQL-Handbuch für deine MySQL-Version für Details
___ tag123hibernate ___ Hibernate ist eine ORM-Bibliothek (Object-Relational Mapping) für die Sprache Java, die es Entwicklern ermöglicht, POJO-artige Domänenmodelle in ihren Anwendungen zu verwenden, die weit über das Object / Relational Mapping hinausgehen.
___ answer374372 ___
Sie sollten die Anweisung außerhalb der Schleife vorbereiten.
%Vor%
Ich weiß nicht, dass mysql vorbereitete Anweisungen zwischenspeichert, aber so sollten JDBC vorbereitete Anweisungen wiederverwendet werden.
___ tag123jdbc ___ JDBC (Java DataBase Connectivity) ist die Basis-API, die die Interaktion mit SQL-Datenbankservern durch Ausführen von SQL-Anweisungen mit der Programmiersprache Java ermöglicht.
___ tag123preparedstatement ___ Eine vorbereitete Anweisung (oder eine parametrisierte Anweisung) ist eine vorkompilierte SQL-Anweisung, die dazu dient, die Leistung zu verbessern und SQL-Injection-Angriffe zu verringern. Vorbereitete Anweisungen werden in vielen gängigen relationalen Datenbankverwaltungssystemen verwendet.
___
Thomas Morgner
22.10.2008 00:30