Progress-servis55.ru

Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java clob sql

Чтение и запись LOB объектов

Вопросам использования больших объектов LOB (Large Object Bynary) зачастую приходится уделять пристальное внимание. Связано это с хранением различных файлов в таблицах базы данных (БД). Сразу же возникает вопрос, зачем хранить в БД файл, если потом придется извлекать его назад опять же в виде в файла? Ведь можно создать отдельное файловое хранилище. Ответ также оказывается простым и тривиальным — для файлового хранилища требуется дополнительно решать вопросы репликации и синхронизации, предоставление прав доступа и создание backup’a. Таким образом, если нельзя обойтись без LOB-объектов, то остается выбрать их тип — бинарный (BLOB Binary Large Object ) или символьный, называемый в БД различных провайдеров по-разному (CLOB, TEXT).

ПРИМЕЧАНИЕ : при работе с символьными данными необходимо учитывать кодировку. Это вопрос будет учтен при записи текстового файла в таблицы БД и выгрузки из БД.

Описание примера

В статье рассматривается пример записи и чтения нескольких типов файлов в поля BLOB и CLOB (TEXT). В качестве серверов БД были использованы Oracle 10g Enterprise Edition, Oracle 10g Express Edition и MySQL 5.1.

Пример представляет собой проект Eclipse, реализующий все принципы ООП (объектно-ориентированное программирование) — наследование, инкапсуляция и полиморфизм. Структура проекта представлена на следующем скриншоте.

В директории «lib» размещаются библиотеки JDBC для подключения к серверам БД. При подключении к серверу 10g Enterprise Edition использовалась библиотека ojdbc7.jar. В случае использования сервера 10g Express Edition были использованы библиотеки ojdbc14_g.jar, ojdbc14.jar. Для подключения в IDE Eclipse библиотеки к проекту необходимо ее выделить и в контекстном меню выбрать «Build Path/Add to Build Path». Чтобы отключить использование библиотеки в проекте используйте вкладку «Java Build Path» в окне свойств проекта.

Пример включает следующие программные модули :

DAOBase.javaбазовый модуль создания подключения к серверу БД и работы с полями BLOB и CLOB (TEXT);
MainTest.javaглавный модуль тестирования методов чтения и записи LOB;
MySQLDAO.javaмодуль создания подключения к серверу MySQL, наследует DAOBase.java;
OracleDAO.javaмодуль создания подключения к серверу Oracle, наследует DAOBase.java;
Файлы для тестированияaircraft.jpg, отчет.xlsx, текст.txt

Приложение в двух разнотипных БД создает таблицы с полями BLOB и CLOB (TEXT), в которые сначала файлы записываются, потом выполняется их чтение. Представленные процедуры записи и чтения больших объектов Вы можете использовать в своих приложениях практически без доработок.

Создание подключений Connection к различным серверам БД описано здесь и в данной статье не рассматривает (код представлен). Пример можно скачать здесь.

Описание базового модуля, DAOBase.java

Базовый модуль включает следующие основные методы :

МетодНазначениеПримечание
public void createConnection()Создание Connection, подключение к БДПереопределяется для каждого провайдера БД
public Connection getConnection()Получение Connection
public void closeConnection()Закрытие Connection
public boolean execSQL (sql)Выполнение SQL-запроса
public boolean writeBlob(table, field, pk, id, fpath)Запись файла в поле BLOB таблицы
public long readBlobToFile(table, field, pk, id, fpath)Извлечение объекта BLOB в файл
public boolean writeClob(table, field, id, fpath)Запись файла в поле CLOB таблицы
public long readClobToFile(table, field, id, path)Извлечение объекта CLOB в файл
public String readClobData(table, field, id)Чтение объекта CLOB
Читать еще:  Как восстановить виндовс 8 до первоначального состояния

Параметры процедур записи и чтения больших объектов LOB включают наименование таблиц table, наименование LOB-полей field, наименование поля первичного ключа pk, идентификатор записи id и путь к файлу fpath. При необходимости Вы можете доработать данные процедуры и включить в качестве параметра наименование схемы Schema(Oracle) или базы данных Database (MySQL). Не исключено, что и первичный ключ может содержать несколько полей.

ПРИМЕЧАНИЕ :
1. Следует обратить внимание, что методы работы с полями BLOB и CLOB не переопределяются согласно представленной выше таблице. Но это касается баз данных Oracle и MySQL, используемые в примере. Т.е. можно сказать, что методы JDBC «справляются» с полями LOB данных провайдеров. К тому же в MySQL используется тип TEXT, а в Oracle CLOB.
2. Можно использовать различные методы записи в поля LOB содержимое файлов, что будет продемонстрировано на примере MySQL.

Ниже представлен листинг DAOBase.java, где методы работы с полями BLOB и CLOB не включают код. Это сделано преднамеренно для наглядного представления общей структуры модуля DAOBase.java. В противном случае листинг сильно увеличится и «за деревьями нельзя будет увидеть лес». Код методов работы с полями LOB описан далее.

Листинг DAOBase.java

Процедуры создания createTable (sql) и удаления dropTable(sql) таблицы БД не включены в общий список методов DAOBase.java, поскольку в примере выполняют вспомогательную функцию и используется для «подыгрыша». Как правило, структура БД меняется редко и нет необходимости включать в приложение процедуры, которые не используются.

Листинг методов чтения и записи данных в поле BLOB

Две вспомогательные функции readBlobField и writeFromBlob2Stream имеют модификаторы private и используются основным методом readBlobToFile при выгрузке файла из БД.

Для записи файла в поле BLOB используется метод setBinaryStream, получающий в качестве параметра поток FileInputStream. При выгрузке файла из БД в методе readBlobToFile сначала читается объект BLOB (readBlobField), после этого он записывается в выходной поток OutputStream в методе writeFromBlob2Stream, где используется метод чтения в бинарный поток getBinaryStream() объекта BLOB.

Листинг процедур чтения и записи данных в поле CLOB

Две вспомогательные функции readClobField и readFromClob2Stream имеют модификаторы private и используются основными методами readClobToFile, readClobData при выгрузке файла из БД.

Чтобы учесть кодировку символов при записи текстового файла в БД используется InputStreamReader и BufferedReader. Для записи файла в поле CLOB/TEXT используется метод setCharacterStream объекта CLOB, которому передается BufferedReader. При выгрузке файла из БД в методе readClobToFile сначала читается объект CLOB (readClobField ), после этого он записывается в выходной поток BufferedWriter в методе readFromClob2Stream, где используется метод чтения в символьный поток getCharacterStream() объекта CLOB.

Листинг OracleDAO.java

Листинг модуля OracleDAO.java включает переопределенные метод createConnection() и метод создания процедур БД createTable. Структуры таблиц, описанные в константах TABLE_blobs и TABLE_files в виде SQL-скриптов, включают только поля идентификаторов id и поля data соответствующих типов LOB. По умолчанию поля дата имеют значения NULL, поскольку используются в методах при обновлении.

Читать еще:  Как восстановить sql базу из резервной копии

При создании объекта в конструкторе сразу же создается подключение к серверу БД. В качестве свойства объекту подключения передается кодировка устанавливаемого соединения «utf8».

Листинг MySQLDAO.java

Листинг модуля MySQLDAO.java включает переопределенные метод createConnection(), метод создания процедур БД createTable и метод writeClob, который демонстрирует другой подход записи символьного файла в поле TEXT. В данном методе файловый поток FileInputStream сразу же перенаправляется в поток setAsciiStream. Но чтобы не исказить символы использовалась соответствующая кодировка в таблице БД и подключении к серверу. Родительский метод writeClob класса DAOBase.java также сработал без нареканий. Таким образом, в Вашем распоряжении 2 подхода записи текстового файла в БД MySQL.

Структуры таблиц, описанные в константах TABLE_blobs и TABLE_files в виде SQL-скриптов, включают только поля идентификаторов id и поля data соответствующих типов LOB. Для таблицы «files» установлена кодировка «UTF8». По умолчанию поля дата имеют значения NULL, т.к. используются в методах при обновлении.

При создании объекта в конструкторе сразу же создается подключение к серверу БД, которому в качестве свойства передается кодировка устанавливаемого соединения «utf8».

Тестирование примера

Главный модуль приложения MainTest.java выполняет тестирование методов записи файлов в БД и выгрузки в файл. Основной метод тестирования testDAO в качестве параметра принимает базовый класс (полиморфизм). В методе testDAO сначала проверяется установка подключения к серверу БД. Если подключение установлено, то создаются таблицы, в которые записываются и извлекаются файлы.

Результаты тестирования

Приложение выводит сообщения и результатах тестирования методов записи и чтения LOB-объектов в консоль.

Скачать пример

Исходный код рассмотренного примера записи и чтения больших объектов LOB с использованием JDBC можно скачать здесь (7.27 Мб).

При тестировании примера необходимо определить параметры подключения к Вашему серверу БД — схема (база данных), логин и пароль.

Java Code Examples for java.sql.Clob

The following code examples are extracted from open source projects. You can click to vote up the examples that are useful to you.

From project bonecp , under directory /bonecp/src/main/java/com/jolbox/bonecp/ .

From project core_5 , under directory /exo.core.component.database/src/main/java/org/exoplatform/services/database/ .

From project BeeQueue , under directory /src/org/beequeue/util/ .

From project fastjson , under directory /src/main/java/com/alibaba/fastjson/serializer/ .

From project Newsreader , under directory /bundles/org.eclipse.ecf.protocol.nntp.store.derby/src/org/eclipse/ecf/protocol/nntp/store/derby/internal/ .

From project ontology-broker , under directory /src/org/sc/probro/data/ .

From project scooter , under directory /source/src/com/scooterframework/orm/sqldataexpress/vendor/ .

From project Solbase-Solr , under directory /contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/ .

From project sqoop , under directory /src/java/org/apache/sqoop/lib/ .

From project uniquery , under directory /src/org/uniquery/gui/query/ .

From project RoyalCommands , under directory /src/org/royaldev/royalcommands/opencsv/ .

From project safe , under directory /Safe/src/org/openintents/safe/ .

From project Weave , under directory /JTDS_SqlServerDriver/src/main/net/sourceforge/jtds/jdbc/ .

From project activejdbc , under directory /activejdbc/src/main/java/org/javalite/activejdbc/ .

From project Amoeba-for-Aladdin , under directory /src/java/com/meidusa/amoeba/jdbc/ .

From project convertcsv , under directory /ConvertCSV/src/org/openintents/convertcsv/opencsv/ .

From project hs4j , under directory /src/main/java/com/google/code/hs4j/impl/ .

From project iciql , under directory /src/com/iciql/ .

From project querydsl , under directory /querydsl-sql-codegen/src/test/java/com/mysema/query/sql/support/ .

Читать еще:  Windows server 2020 r2 архивация и восстановление

Наиболее эффективное решение для чтения CLOB в строку и String в CLOB в Java?

У меня есть большой CLOB (более 32kB), который я хочу прочитать в строку, используя StringBuilder. Как сделать это наиболее эффективным способом? Я не могу использовать конструктор «int length» для StringBuilder, так как длина моего CLOB больше, чем «int», и требует «длинного» значения.

Я не так удобен с классами ввода-вывода Java и хотел бы получить некоторые рекомендации.

редактироватьЯ пробовал с этим кодом clobToString ():

11 ответов

Я не могу использовать конструктор «int length» для StringBuilder Так как длина моего CLOB больше, чем int и long значение.

если длина CLOB больше, чем вписывается в int, данные CLOB также не будут вписываться в строку. Вам придется использовать потоковый подход для работы с этим количеством XML-данных.

если фактическая длина CLOB меньше, чем Integer.MAX_VALUE , просто силу long to int положить (int) перед он.

Ok я предположу общее использование, сначала вам нужно скачать Апач Коммонс, там вы найдете служебный класс с именем IOUtils, который имеет метод с именем copy ();

теперь решение: получите входной поток вашего объекта CLOB с помощью getAsciiStream() и передайте его методу copy ().

мой ответ — это просто аромат того же самого. Но я протестировал его с сериализацией содержимого на молнии, и это сработало. Поэтому я могу доверять этому решению, в отличие от первого (который использует readLine), потому что он будет игнорировать разрывы строк и повреждать вход.

что случилось с:

например, Oracle oracle.sql.CLOB сделать getSubString() внутренних char[] , которая определена в oracle.jdbc.driver.T4CConnection и просто System.arraycopy() и далее оберните в String . Вы никогда не получите более быстрое чтение тогда System.arraycopy() .

обновление сделать водитель ojdbc6.Джар, и декомпилировать CLOB реализация и изучение того, какой случай будет быстрее на основе внутренних знаний.

Если вы действительно должны использовать только стандартные библиотеки,то вам просто нужно немного расширить решение Omar. (IOUtils Apache-это в основном просто набор удобных методов, которые экономят на большом количестве кодирования)

вы уже можете получить входной поток через clobObject.getAsciiStream()

вам просто нужно «вручную перенести» символы в StringWriter:

имейте в виду, что

  1. если ваш clob содержит больше символов, чем подойдет, это не сработает.
  2. оберните InputStreamReader и StringWriter с BufferedReader и BufferedWriter соответственно для повышения производительности.

Если используется Mule, ниже приведены шаги.

выполните следующие действия.

Включить потоковую передачу в соединителе, т. е. progressiveStreaming=2

Typecast DB2 вернул CLOB на java.язык SQL.Clob (IBM поддерживает этот тип cast)

преобразуйте это в символьный поток (поток ASCII иногда может не поддерживать некоторые специальные символы). Таким образом, вы можете использовать getCharacterStream()

это вернет объект» reader», который можно преобразовать в » String» использование common-io (IOUtils).

короче говоря, используйте groovy component и добавьте ниже код.

Примечание: здесь я предполагаю » полезную нагрузку.field1 » удерживает данные clob.

Ссылка на основную публикацию
Adblock
detector