Quand je fais une recherche sur le web pour l'insertion d'objets Blob dans la base de données Oracle avec jdbc mince pilote, la plupart des pages web suggèrent un 3 étapes:
- insérez
empty_blob()
de la valeur. - sélectionnez la ligne avec
for update
. - insérer la valeur réelle.
Cela fonctionne très bien pour moi, voici un exemple:
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();
}
Il y a quelques pages où les auteurs suggèrent à l'aide d'un simple 1-l'étape de la solution. Exemple précédent avec cette solution:
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();
Le deuxième code est beaucoup plus facile, donc ma question est: qu'est-Ce que le premier point de (populaire) solution? Est-il (était-il) une sorte de contrainte pour la deuxième solution (serveur Oracle numéro de version du pilote jdbc version, la taille de la goutte,...)? La première solution mieux (vitesse, mémoire, consommation,...)? Toutes les raisons pour ne pas utiliser le plus simple seconde approche?
Exactement la même question s'applique pour CLOB champs.