1. Vorteile der Vorkompilierung
Normalerweise hat jeder die PreparedStatement-Schnittstelle in JDBC verwendet, die über eine Vorkompilierungsfunktion verfügt. Was ist die Vorkompilierungsfunktion? Was sind seine Vorteile?
Wenn der Client eine SQL-Anweisung an den Server sendet, muss der Server immer überprüfen, ob das Syntaxformat der SQL-Anweisung korrekt ist, dann die SQL-Anweisung in eine ausführbare Funktion kompilieren und schließlich die SQL-Anweisung ausführen . Der Zeitaufwand für die Überprüfung und Kompilierung der Syntax kann höher sein als der Zeitaufwand für die Ausführung von SQL-Anweisungen.
Wenn wir mehrere Einfügeanweisungen ausführen müssen, aber nur die eingefügten Werte jedes Mal unterschiedlich sind, muss der MySQL-Server jedes Mal auch das Syntaxformat der SQL-Anweisung überprüfen und kompilieren, was ebenfalls Verschwendung ist viel Zeit. Wenn Sie die Vorkompilierungsfunktion verwenden, wird die SQL-Anweisung nur einmal syntaktisch überprüft und kompiliert, sodass die Effizienz hoch ist.
2. MySQL führt die Vorkompilierung durch
MySQL führt die Vorkompilierung in drei Schritten durch:
Führen Sie vorkompilierte Anweisungen aus, zum Beispiel: Prepare myfun from 'select * from t_book where bid=?'
Variablen festlegen, zum Beispiel: set @str='b1'
Anweisungen ausführen, zum Beispiel :execute myfun mit @str
Wenn Sie myfun erneut ausführen müssen, ist der erste Schritt nicht mehr erforderlich, d. h. es ist nicht erforderlich, die Anweisung zu kompilieren:
Variablen festlegen, zum Beispiel: set @str='b2'
Anweisungen ausführen, zum Beispiel: myfun mit @str ausführen
Pass Überprüfen Sie das MySQL-Protokoll, um den Ausführungsprozess zu sehen:
3. Verwenden Sie die Anweisung, um die Vorkompilierung durchzuführen
Anweisung zum Ausführen der Vorkompilierung verwenden, um die obige SQL-Anweisung einmal auszuführen.
Connection con = JdbcUtils.getConnection(); Statement stmt = con.createStatement(); stmt.executeUpdate("prepare myfun from 'select * from t_book where bid=?'"); stmt.executeUpdate("set @str='b1'"); ResultSet rs = stmt.executeQuery("execute myfun using @str");while(rs.next()) { System.out.print(rs.getString(1) + ", "); System.out.print(rs.getString(2) + ", "); System.out.print(rs.getString(3) + ", "); System.out.println(rs.getString(4)); } stmt.executeUpdate("set @str='b2'"); rs = stmt.executeQuery("execute myfun using @str");while(rs.next()) { System.out.print(rs.getString(1) + ", "); System.out.print(rs.getString(2) + ", "); System.out.print(rs.getString(3) + ", "); System.out.println(rs.getString(4)); } rs.close(); stmt.close(); con.close();
4. useServerPrepStmts-Parameter
Die Vorkompilierung kann standardmäßig nicht mit PreparedStatement durchgeführt werden. Dazu muss der Parameter useServerPrepStmts=true in der URL angegeben werden (Versionen vor MySQL Server 4.1 unterstützen keine Vorkompilierung und Versionen von Connector/J nach 5.0.5 aktivieren die Vorkompilierungsfunktion standardmäßig nicht).
Zum Beispiel: jdbc:mysql://localhost:3306/test?useServerPrepStmts=true
Dadurch kann sichergestellt werden, dass der MySQL-Treiber zuerst die SQL-Anweisung zur Vorkompilierung an den Server sendet und dann ausführenexecuteQuery() sendet nur die Parameter an den Server.
Connection con = JdbcUtils.getConnection(); String sql = "select * from t_book where bid=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, "b1"); ResultSet rs = pstmt.executeQuery();while(rs.next()) { System.out.print(rs.getString(1) + ", "); System.out.print(rs.getString(2) + ", "); System.out.print(rs.getString(3) + ", "); System.out.println(rs.getString(4)); } pstmt.setString(1, "b2"); rs = pstmt.executeQuery();while(rs.next()) { System.out.print(rs.getString(1) + ", "); System.out.print(rs.getString(2) + ", "); System.out.print(rs.getString(3) + ", "); System.out.println(rs.getString(4)); } rs.close(); pstmt.close(); con.close();
5. CachePrepStmts-Parameter
Wenn Sie verschiedene PreparedStatement-Objekte verwenden, um dieselbe SQL-Anweisung auszuführen, tritt immer noch das Phänomen auf, dass es zweimal kompiliert wird. Dies liegt daran, dass der Treiber die kompilierte Funktionstaste nicht zwischenspeichert, was zu einer sekundären Kompilierung führt. Wenn Sie den Schlüssel der kompilierten Funktion zwischenspeichern möchten, müssen Sie den Parameter „cachePrepStmts“ auf „true“ setzen. Zum Beispiel:
jdbc:mysql://localhost:3306/test?useServerPrepStmts=true&cachePrepStmts=true
Connection con = JdbcUtils.getConnection(); String sql = "select * from t_book where bid=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, "b1"); ResultSet rs = pstmt.executeQuery();while(rs.next()) { System.out.print(rs.getString(1) + ", "); System.out.print(rs.getString(2) + ", "); System.out.print(rs.getString(3) + ", "); System.out.println(rs.getString(4)); } pstmt = con.prepareStatement(sql); pstmt.setString(1, "b2"); rs = pstmt.executeQuery();while(rs.next()) { System.out.print(rs.getString(1) + ", "); System.out.print(rs.getString(2) + ", "); System.out.print(rs.getString(3) + ", "); System.out.println(rs.getString(4)); } rs.close(); pstmt.close(); con.close();
6 🎜 >
Die Stapelverarbeitung von MySQL muss auch über die Parameter aktiviert werden: rewriteBatchedStatements=trueDas obige ist der detaillierte Inhalt vonMySQL-Vorkompilierungsfunktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!