Cuando busco la web para insertar BLOB en la base de datos de Oracle con el controlador fino JDBC, la mayoría de las páginas web sugieren un enfoque de 3 pasos:overcomplicated JDBC de Oracle BLOB
- inserción
empty_blob()
valor. - seleccione la fila con
for update
. - inserte el valor real.
Esto funciona muy bien para mí, aquí es un ejemplo:
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();
}
Hay algunas páginas web donde los autores sugieren el uso de una solución más simple de 1 paso. ejemplo anterior con esta solución:
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();
El segundo código es mucho más fácil, por lo que mi pregunta es: ¿Cuál es el punto de la primera solución (popular)? ¿Existe (hubo) algún tipo de restricción para la segunda solución (número de versión del servidor Oracle, versión del controlador jdbc, tamaño del blob, ...)? ¿Es la primera solución mejor (velocidad, consumo de memoria, ...)? ¿Alguna razón para no usar el segundo enfoque más simple?
La misma pregunta es válida para los campos CLOB.
¿La base de datos de la cláusula "FOR UPDATE" es independiente? No parece funcionar en SQL Server, por ejemplo. Pero, de todos modos, no es esencial para la técnica anterior ... –
La cláusula FOR UPDATE indica a la base de datos que bloquee las filas. Es importante en este caso porque el conjunto de resultados actualizará esas filas. Si está razonablemente seguro de que nadie más actualizará esas filas, es posible que no necesite el bloqueo. –
No está insertando un BLOB aquí, solo lo está actualizando. El OP fue específicamente sobre la inserción. –