Um per Java auf Oracle-Datenbanken zuzugreifen, muss zunächst der
Datenbank-spezifische JDBC-Driver geladen sein.
Er heisst »oracle.jdbc.driver.OracleDriver« und wird aus einem Zip- Archiv in
»$ORACLE_HOME/jdbc/lib« geladen, das je nach eingesetzter Oracle-
beziehungsweise JVM-Version »classes111.zip« oder »classes12. zip« heisst.
Die entsprechende Datei sollte in »$CLASSPATH« enthalten sein.
Über diese Archive sind beide Typen der JDBC-Treiber erreichbar:
Thin-Driver und OCI-Driver. Erst der Connect-String legt fest, welcher der
beiden Verwendung findet: Den Thin-Driver erreicht man durch den Connect-String
»jdbc:oracle: thin:@Hostname:Port:SID«, während der
OCI-Teiber mit
»jdbc:oracle:oci8:@TNS-Alias«
angesprochen wird.
Was unterscheidet die beiden Treibertypen im
Fall von Oracle? Der Thin-Driver implementiert das SQL*Net-Protokoll von Oracle
komplett in Java auf Basis der Java-Sockets. Das ist portabel, kommt ohne
weitere Client-Installation aus und ist daher leichtgewichtig. Der OCI-Driver
bildet nur eine dünne Java-Schicht über der OCI-C-Library, die über JNI
angesprochen wird. Das setzt natürlich eine komplette Installation der
Oracle-Client-Software voraus, verbietet sich also insbesondere für Applets
oder Programme, die direkt aus einem JAR lauffähig sein sollen.
Der große Vorteil des OCI-Treibers besteht darin, dass er alle
Oracle-spezifischen Erweiterungen im Vergleich zum JDBC-Standard verfügbar
macht. Nur mit dem OCI-Treiber können die Clients Datenbankverbindungen nutzen,
die nicht über TCP eröffnet werden.
Oracle behauptet, dass mit der C-Library des OCI die Performance
gesteigert wird, was zunächst auch einleuchtet. Allerdings wissen
Arbeitskollegen des Autors von einer Applikation zu berichten, die über den
Thin-Driver merklich schneller lief. Mit Hilfe von »strace« und »tcpdump« war
herauszufinden, dass der OCI-Treiber etwa doppelt so viele Netzwerk-Roundtrips
zum Server durchführte als der Thin-Driver.
Beispiel eines Connection-Strings auf eine Oracle 8i Datenbank: jdbc:oracle:oci8:@(description=(address=(host=hmttc5)(protocol=tcp)