Overcomplicated Oracle JDBC BLOB-Behandlung

Wenn ich das web für die Suche einfügen von BLOBs in Oracle-Datenbank mit dem jdbc-thin-Treiber, die meisten Webseiten empfehlen eine 3-Schritt-Ansatz:

  1. einfügen empty_blob() Wert.
  2. wählen Sie die Zeile mit for update.
  3. legen Sie den realen Wert.

Dies funktioniert gut für mich, hier ist ein Beispiel:

Connection oracleConnection = ...

byte[] testArray = ...

PreparedStatement ps = oracleConnection.prepareStatement(
    "insert into test (id, blobfield) values(?, empty_blob())");
ps.setInt(1, 100);
ps.executeUpdate();
ps.close();
ps = oracleConnection.prepareStatement(
    "select blobfield from test where id = ? for update");
ps.setInt(1, 100);
OracleResultSet rs = (OracleResultSet) ps.executeQuery();
if (rs.next()) {
    BLOB blob = (BLOB) rs.getBLOB(1);
    OutputStream outputStream = blob.setBinaryStream(0L);
    InputStream inputStream = new ByteArrayInputStream(testArray);
    byte[] buffer = new byte[blob.getBufferSize()];
    int byteread = 0;
    while ((byteread = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, byteread);
    }
    outputStream.close();
    inputStream.close();
}

Gibt es einige Webseiten, wo die Autoren empfehlen die Verwendung einer einfacheren 1-Schritt Lösung. Vorherigen Beispiel mit dieser Lösung:

Connection oracleConnection = ...

byte[] testArray = ...

PreparedStatement ps = oracleConnection.prepareStatement(
    "insert into test(id, blobfield) values(?, ?)");
BLOB blob = BLOB.createTemporary(oracleConnection, false, BLOB.DURATION_SESSION);
OutputStream outputStream = blob.setBinaryStream(0L);
InputStream inputStream = new ByteArrayInputStream(testArray);
byte[] buffer = new byte[blob.getBufferSize()];
int byteread = 0;
while ((byteread = inputStream.read(buffer)) != -1) {
    outputStream.write(buffer, 0, byteread);
}
outputStream.close();
inputStream.close();

ps.setInt(1, 100);
ps.setBlob(2, blob);
ps.executeUpdate();
ps.close();

Der zweite code ist viel einfacher, also meine Frage ist: Was ist der Punkt, der erste (populär -) Lösung? Ist es (war es) eine Art von Zwang für die zweite Lösung (Oracle-server-version und-Nummer, jdbc-Treiber, die version, die Größe des blob,...)? Ist die erste Lösung besser (Geschwindigkeit, Speicherverbrauch,...)? Die Gründe für die nicht mit der einfachen zweiten Ansatz?

Die exakt gleiche Frage gilt für die CLOB-Felder.

InformationsquelleAutor der Frage asalamon74 | 2009-05-14

Schreibe einen Kommentar