2010-11-16 3 views
1

Alrighty, я стучал головой о стену на этот на некоторое время, так что здесь идет ...Выгрузка Большой текстовый файл в CLOB DB2 Field

В настоящее время я пишу Java (1.5), которая может загружать очень большие текстовые файлы (200 Мбайт +) в столбец CLOB DB2, но у вас есть несколько проблем.

В ходе исследования, несколько примеров кода предположил, что я использую метод PreparedStatement setCharacterStream() для загрузки данных в CLOB поле, давая мне что-то вроде этого:

PreparedStatement preparedStatement = 
     connection.prepareStatement("INSERT INTO BOOKCOVERS VALUES(?,?)"); 
File imageFile = new File("c:\\redbookcover.jpg"); 
InputStream inputStream = new FileInputStream(imageFile); 
preparedStatement.setString(1," 0738425826"); 
preparedStatement.setBinaryStream(2,inputStream,(int)(imageFile.length())); 
preparedStatement.executeUpdate(); 

Это нормально, за исключением того, что кроме Для метода setCharacterStream() требуется значение LENGTH, указывающее количество символов для записи в поле. Имея это в виду, это ограничивает количество символов, которые могут быть записаны в поле CLOB на Integer.MAX_VALUE. Выполняя небольшую математику, это ограничит размер текстового файла, который я могу загрузить до 524288 байт, или около половины мегабайта. Поскольку поле CLOB может хранить до 2 ГБ данных, я немного смущен.

Я вижу, что в Java 1.6 метод PreparedStatement setCharacterStream() был изменен, чтобы не требовать длины, и будет считываться до тех пор, пока не будет обнаружен конец файла. К сожалению, я должен использовать Java 1.5, поэтому это неверный вариант.

В последний немного исследований, я прочитал, что Java 1.5 в PreparedStatement имеет схожую функциональность, где Javadoc утверждает:

»... это может быть более практичным, чтобы отправить его через java.io.Reader. Данные будут считаны из потока, так как необходимо до тех пор, пока не будет достигнут конец файла. "

Если это существует, почему метод setCharacterStream() по-прежнему требует параметра длины? Что бы вы передали параметру длины для использования этой функции? Есть ли лучший способ сделать это, что мне не хватает?

Любые мысли?

+0

Почему, на ваш взгляд, Integer.MAX_VALUE - 524288? Это 2GB-1 (2^32-1) –

+0

Я думаю, что ваша математика немного выключена. Integer.MAX_VALUE = 2147483647 –

+0

Я имел в виду 2^31-1 :-) –

ответ

0

Как вы отметили, спецификация 1.5 для setCharacterStream неоднозначна в отношении того, читается ли она до конца файла или до достижения длины.

Устанавливает назначенный параметр для данного чтения объекта, который является заданного числа символов. Когда очень большое значение UNICODE вводится в параметр LONGVARCHAR, это может быть более практично отправить его через объект java.io.Reader . Данные будут считываться из потока по мере необходимости до тех пор, пока не будет достигнут конец файла. Драйвер JDBC сделает все необходимые преобразования из UNICODE в формат базы данных .

Он может работать как вы хотите, если вы передадите Integer.MAX_VALUE в качестве параметра длины. Попробуйте и посмотрите, что произойдет.

+0

Я попробовал указать Integer.MAX_VALUE, но в итоге получил исключение IndexOutOfBoundsException. То же самое произошло, когда я использовал -1 и 0 ничего не писал. Это единственные значения, которые, как я полагаю, могут использоваться для подачи сигнала, чтобы читать буфер до тех пор, пока он не станет пустым ... – Ampp3

Смежные вопросы