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()
по-прежнему требует параметра длины? Что бы вы передали параметру длины для использования этой функции? Есть ли лучший способ сделать это, что мне не хватает?
Любые мысли?
Почему, на ваш взгляд, Integer.MAX_VALUE - 524288? Это 2GB-1 (2^32-1) –
Я думаю, что ваша математика немного выключена. Integer.MAX_VALUE = 2147483647 –
Я имел в виду 2^31-1 :-) –