Как разместить большие (или, по крайней мере, нетривиальные) BLOB-объекты в Oracle с помощью JDBC? - PullRequest
5 голосов
/ 06 июля 2010

Я работаю над приложением для выполнения некоторой пакетной обработки и хочу сохранить входные и выходные данные в виде файлов в полях BLOB в базе данных Oracle. Версия Oracle - 10g r2.

Использование метода PreparedStatement.setBinaryStream (), как показано ниже, вставит небольшой текстовый файл в базу данных, но мне не повезло с большим файлом изображения.

Я что-то не так делаю? Можно ли это сделать с JDBC? Нужно ли беспокоить администратора? Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: проблема была решена. Я обновил этот код до рабочего образца:

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();
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 07 июля 2010

Я не думаю, что вы можете обновить или вставить в BLOB / CLOB с JDBC за один шаг (для данных> 4k). Из этого примера из Oracle кажется, что вам нужно:

  1. Вставка пустого большого объекта с функцией SQL empty_clob()
  2. Выберите для обновления вставленный вами большой объект
  3. получить LOB в Java с помощью ResultSet.getBlob(), а затем получить выходной поток с blob.setBinaryStream (поскольку oracle.sql.BLOB.getBinaryOutputStream() устарела)
  4. запись в этот поток вывода
  5. закрыть выходной поток, когда вы закончите

Вы бы сделали нечто подобное в Pl / SQL (ВЫБЕРИТЕ ДЛЯ ОБНОВЛЕНИЯ ЛОБ, затем напишите в него).

1 голос
/ 27 января 2012

Просто помните, getBinaryOutputStream устарела. Вы должны использовать setBinaryStream, если вместо этого используете oracle.sql.BLOB.

...