Quelle des Artikels: Datenbankforum Autor: jackma
Die Java Database Connectivity (JDBC) API ist eine Reihe von Schnittstellen, die Java-Programmierern den Zugriff auf Datenbanken ermöglichen. Die Schnittstellen verschiedener Entwickler sind nicht genau gleich. Nachdem ich JDBC von Oracle viele Jahre lang verwendet habe, habe ich viele Fähigkeiten gesammelt, die es uns ermöglichen können, die Leistung des Systems besser zu nutzen und mehr Funktionen zu erreichen.
1. Verwenden Sie den Thin-Treiber bei der Entwicklung von Client-Software
Im Hinblick auf die Entwicklung von Java-Software bietet die Datenbank von Oracle vier Arten von Treibern, zwei für Client-Software wie Anwendungssoftware, Applets und Servlets und die anderen beiden für serverseitige Software wie gespeicherte Java-Prozeduren in der Datenbank. Bei der Entwicklung clientseitiger Software können wir zwischen OCI-Treiber und Thin-Treiber wählen. Der OCI-Treiber nutzt das Java Localization Interface (JNI), um über die Oracle-Client-Software mit der Datenbank zu kommunizieren. Der Thin-Treiber ist ein reiner Java-Treiber, der direkt mit der Datenbank kommuniziert. Für maximale Leistung empfiehlt Oracle die Verwendung von OCI-Treibern bei der Entwicklung von Client-Software, und das scheint auch richtig zu sein. Ich empfehle jedoch die Verwendung des Thin-Treibers, da durch viele Tests festgestellt wurde, dass die Leistung des Thin-Treibers unter normalen Umständen die des OCI-Treibers übertrifft.
2. Deaktivieren Sie die automatische Übermittlungsfunktion, um die Systemleistung zu verbessern
Wenn Sie zum ersten Mal eine Verbindung zur Datenbank herstellen, befindet sich die Verbindung standardmäßig im Autocommit-Modus. Für eine bessere Leistung können Sie die Autocommit-Funktion deaktivieren, indem Sie die setAutoCommit()-Methode der Connection-Klasse mit einem booleschen False-Parameter aufrufen, wie unten gezeigt:
conn.setAutoCommit(false);
Es ist erwähnenswert, dass wir die Transaktion manuell verwalten müssen, sobald die Auto-Commit-Funktion deaktiviert ist, indem wir die Methoden commit() und rollback() der Connection-Klasse aufrufen.
3. Verwenden Sie Statement-Objekte in dynamischem SQL oder zeitlich begrenzten Befehlen
Bei der Ausführung von SQL-Befehlen haben wir zwei Möglichkeiten: Sie können PreparedStatement-Objekte oder Statement-Objekte verwenden. Unabhängig davon, wie oft Sie denselben SQL-Befehl verwenden, analysiert und kompiliert PreparedStatement ihn nur einmal. Bei Verwendung des Statement-Objekts wird jedes Mal, wenn ein SQL-Befehl ausgeführt wird, dieser analysiert und kompiliert. Das könnte Sie denken lassen, dass die Verwendung von PreparedStatement-Objekten schneller ist als die Verwendung von Statement-Objekten. Die von mir durchgeführten Tests haben jedoch gezeigt, dass dies bei Client-Software nicht der Fall ist. Daher sollten wir bei zeitlich begrenzten SQL-Operationen die Verwendung von Statement-Objekten in Betracht ziehen, es sei denn, SQL-Befehle werden in Stapeln verarbeitet.
Darüber hinaus erleichtert die Verwendung von Statement-Objekten auch das Schreiben dynamischer SQL-Befehle, da wir Zeichenfolgen verketten können, um einen gültigen SQL-Befehl zu erstellen. Daher glaube ich, dass das Statement-Objekt die Erstellung und Ausführung dynamischer SQL-Befehle erleichtern kann.
4. Verwenden Sie Hilfsfunktionen, um dynamische SQL-Befehle zu formatieren
Beim Erstellen dynamischer SQL-Befehle, die mithilfe von Statement-Objekten ausgeführt werden, müssen wir uns mit einigen Formatierungsproblemen befassen. Wenn wir beispielsweise einen SQL-Befehl erstellen möchten, der den Namen O'Reilly in eine Tabelle einfügt, müssen wir das Zeichen „'“ in O'Reilly durch zwei aufeinanderfolgende Zeichen „''“ ersetzen. Dies erreichen Sie am besten, indem Sie eine Hilfsmethode erstellen, die den Ersetzungsvorgang ausführt, und dann die erstellte Hilfsmethode verwenden, wenn die Verbindungszeichenfolge mithilfe einer Formel als SQL-Befehl ausgedrückt wird. Ebenso können wir die Hilfsmethode veranlassen, einen Datumswert zu akzeptieren und sie dann einen Zeichenfolgenausdruck basierend auf der to_date()-Funktion von Oracle ausgeben zu lassen.
5. Verwenden Sie PreparedStatement-Objekte, um die Gesamteffizienz der Datenbank zu verbessern
Wenn Sie ein PreparedStatement-Objekt zum Ausführen eines SQL-Befehls verwenden, wird der Befehl von der Datenbank analysiert und kompiliert und dann im Befehlspuffer abgelegt. Wenn dann dasselbe PreparedStatement-Objekt ausgeführt wird, wird es erneut analysiert, aber nicht erneut kompiliert. Vorkompilierte Befehle befinden sich im Puffer und können wiederverwendet werden. In Unternehmensanwendungen mit einer großen Anzahl von Benutzern werden häufig dieselben SQL-Befehle wiederholt ausgeführt. Die Reduzierung der Anzahl der Kompilierungen durch die Verwendung von PreparedStatement-Objekten kann die Gesamtleistung der Datenbank verbessern. Sofern das Erstellen, Vorbereiten und Ausführen von PreparedStatement-Aufgaben auf der Clientseite nicht länger dauert als Statement-Aufgaben, würde ich in allen Fällen die Verwendung von PreparedStatement-Objekten empfehlen, mit Ausnahme dynamischer SQL-Befehle.
6. Verwenden Sie PreparedStatement-Objekte bei der Stapelverarbeitung wiederholter Einfüge- oder Aktualisierungsvorgänge. <br /> <br /> Wenn Einfüge- und Aktualisierungsvorgänge stapelweise verarbeitet werden, kann die dafür erforderliche Zeit erheblich reduziert werden. Das von Oracle bereitgestellte Statement und CallableStatement unterstützen die Stapelverarbeitung nicht wirklich. Nur das PreparedStatement-Objekt unterstützt wirklich die Stapelverarbeitung. Wir können die Standard-JDBC-Stapelverarbeitung mit den Methoden addBatch() undexecuteBatch() wählen oder die schnellere proprietäre Oracle-Methode wählen, indem wir die setExecuteBatch()-Methode des PreparedStatement-Objekts und die StandardmethodeexecuteUpdate() verwenden. Um den proprietären Batch-Mechanismus von Oracle zu verwenden, können Sie setExecuteBatch() wie unten gezeigt aufrufen:
PreparedStatement pstmt3D null;
versuchen {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}