我正在开发一个应用程序来进行一些批处理,并希望将输入和输出数据作为文件存储在Oracle数据库的BLOB字段中。 Oracle版本是10g r2。
使用下面的PreparedStatement.setBinaryStream()方法会将一个小文本文件插入到数据库中,但是我对运行较大的图像文件没有任何好运。
我做错了吗?这可能与JDBC有关吗?我需要打扰DBA吗?谢谢你的帮助。
编辑:问题已经解决。我已将此代码更新为工作示例:import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class WriteBlobDriver {
public static void main(String[] args) {
Connection con = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(
"blahblah",
"blahblah",
"blahblah");
con.setAutoCommit(false);
Statement statement = con.createStatement();
//statement.executeUpdate("UPDATE BATCH_GC_JOBS SET INPUT_BATCH_FILE = EMPTY_BLOB() WHERE JOB_ID = 'a'");
//Get blob and associated output stream
ResultSet resultSet = statement.executeQuery("SELECT INPUT_BATCH_FILE FROM BATCH_GC_JOBS WHERE JOB_ID = 'a' FOR UPDATE");
resultSet.next();
Blob blob = resultSet.getBlob(1);
OutputStream outputStream = ((oracle.sql.BLOB)blob).getBinaryOutputStream();
// Buffer to hold chunks of data to being written to the Blob.
byte[] buffer = new byte[10* 1024];
int nread = 0;
//Write file to output stream
File file = new File("C:\\TEMP\\Javanese_cat.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
while ((nread = fileInputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, nread);
}
//Cleanup
fileInputStream.close();
outputStream.close();
statement.close();
con.commit();
con.close();
System.out.println("done!");
} catch (Exception e){
e.printStackTrace();
}
}
}
答案 0 :(得分:3)
我认为您不能在一个步骤中使用JDBC更新或插入BLOB / CLOB(对于数据> 4k)。从this example from Oracle开始,您似乎需要:
empty_clob()
ResultSet.getBlob()
获取java中的LOB,然后使用blob.setBinaryStream
获取输出流(因为oracle.sql.BLOB.getBinaryOutputStream()
已弃用)你会在Pl / SQL中做类似的事情(SELECT FOR UPDATE a LOB,然后写入它)。
答案 1 :(得分:1)
请记住,getBinaryOutputStream
已被弃用。如果您使用的是setBinaryStream
,则应该使用oracle.sql.BLOB
。