如何使用JDBC将大型(或至少非常重要的)BLOB放入Oracle?

Phi*_*hil 5 oracle blob jdbc insert

我工作的一个应用程序做一些批量处理,并希望将输入和输出数据存储在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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Vin*_*rat 3

我认为您无法通过 JDBC 一步更新或插入 BLOB/CLOB(对于数据 > 4k)。从Oracle 的这个示例来看,您似乎需要:

  1. 使用 SQL 函数插入空 LOBempty_clob()
  2. 选择更新您插入的 LOB
  3. 在 java 中获取 LOB然后使用(因为已弃用)ResultSet.getBlob()获取输出流 blob.setBinaryStreamoracle.sql.BLOB.getBinaryOutputStream()
  4. 写入此输出流
  5. 完成后关闭输出流

您可以在 Pl/SQL 中执行类似的操作(SELECT FOR UPDATE LOB,然后写入它)。