Хорошо, я какое-то время стучал головой об стену, вот так ...
Сейчас я пишу программу на Java (1.5), которая может загружать оченьбольшие (200 МБ +) текстовые файлы в столбец DB2 CLOB, но они сталкивались с несколькими проблемами.
В ходе моего исследования несколько примеров кода предложили использовать метод 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()
требует значения ДЛИНЫ, определяющего количество символов для записи в поле.Имея это в виду, это ограничивает количество символов, которые могут быть записаны в поле CLOB, до Integer.MAX_VALUE
.Приложив немного математики, это ограничит размер текстового файла, который я могу загрузить, до 524288 байт, или около половины мегабайта.Поскольку поле CLOB может хранить до 2 ГБ данных, я немного запутался.
Я вижу, что в Java 1.6 метод PreparedStatement setCharacterStream()
был изменен, чтобы не требовать длины, и будет читать доконец файла встречается.К сожалению, мне необходимо использовать Java 1.5, так что это недопустимый вариант.
В одном последнем исследовании я прочитал, что PreparedStatement в Java 1.5 обладает аналогичной функциональностью, в которой заявляет Javadoc:
"... может быть более практичным отправлять его через объект java.io.Reader. Данные будут считываться из потока по мере необходимости, пока не будет достигнут конец файла."
Если это существует, почему для метода setCharacterStream()
все еще требуется параметр длины?Что бы вы указали для параметра длины, чтобы использовать эту функцию?Есть ли лучший способ сделать это, что мне не хватает?
Есть мысли?