Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с графическими файлами в MSSQL+J2EE 
:(
    Опции темы
sergush
Дата 25.1.2006, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 31.12.2005

Репутация: нет
Всего: нет



В базе данных требуется хранить граф. файлы. Какой тип данных выбрать? image? Как сохранить файл в базе данных? получить файл из базы данных? отобразить его на jsp-страничке? За любую помощь заранее спасибо.
p.s. Что лучше: хранить картинки в базе данных или просто в виде файлов на диске (а в базе данных хранить ссылки)?
PM MAIL   Вверх
FatherFrost
Дата 25.1.2006, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почетный Мороз
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 27.4.2005
Где: Крайний север

Репутация: 5
Всего: 6



Лучше хранить в БД... Мы работали с MySQL и хранили картинки, если не ошибаюсь, в поле типа BLOB... В MS SQL лучше наверно хранить или в binary или в image.... А выводить сервлетом с указанием соответствующего mime-типа для ответа....


--------------------
Задаю много глупых вопросов....
PM MAIL ICQ   Вверх
tux
Дата 25.1.2006, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(FatherFrost @ 25.1.2006, 13:43 Найти цитируемый пост)

Лучше хранить в БД...

Не стал бы утверждать так категорично, у каждого метода есть свои плюсы и минусы.

Хранение двоичных объектов в файловой системе лучше с точки зрения производительности, причем скорее всего независимо от того какая СУБД используется - навскидку у СУБД больше накладных расходов при сохранении записи в таблицу чем у файловой системы при сохранении файла - надо обновить индексы и т.п. Правда похоже, что это единственный плюс.

Плюсы хранения двоичных объектов в БД:
  • гораздо проще управлять объектами если БД распределенная или работает, например, на кластере - СУБД сама позаботится о репликации и в этом случае легко добится доступности всех объектов со всех узлов;
  • не возникнет проблем с транзакциями, в случае с файловой системой придется самостоятельно отслеживать был ли записан файл на диск и откатывать транзакцию если произошла ошибка;
  • нет необходимости заботится о разрешения файловой системы на файл.

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

По поводу отображения на JSP-странице было здесь - http://forum.vingrad.ru/index.php?showtopic=54327&hl=.
PM MAIL Skype GTalk Jabber YIM   Вверх
Stampede
Дата 25.1.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



В целом согласен с tux'ом, но от себя хотел бы упомянуть еще один довод в пользу файлового хранения. Дело в том, что при хранении графики в базе возникает одна трудность чисто практического свойства: с БЛОБами в общем случае очень неудобно работать: загружать, просматривать, обновлять и т. д. И это такой недостаток, который запросто может перевесить все преимущества от хранения в базе. В общем, если это статические картинки, а не такие, которые генерятся или вводятся через веб-интерфейс (как, например, аватары на форуме или фотографии на фотосайте), то я бы выбрал файловое хранение.

PM WWW   Вверх
batigoal
Дата 25.1.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Цитата(Stampede @ 25.1.2006, 21:53 Найти цитируемый пост)

с БЛОБами в общем случае очень неудобно работать: загружать, просматривать, обновлять и т. д.

Вроде же с ними можно работать, как с обычными стримами. Есть какие-то подводные камни?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Stampede
Дата 25.1.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Цитата(Lamer George @ 25.1.2006, 22:41 Найти цитируемый пост)

Вроде же с ними можно работать, как с обычными стримами. Есть какие-то подводные камни?


Я имел в виду не программный доступ, а обычные рутинные манипуляции с графикой: открыть, посмотреть, сохранить и пр.

PM WWW   Вверх
sergush
Дата 26.1.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 31.12.2005

Репутация: нет
Всего: нет



tux и Stampede большое спасибо за подробное объяснение.

Но все же может у кого есть код на java сохранения файла в базу данных (таблица с полем, например, BLOB). И, затем, чтения этого поля из базы. Большой интерес представляют запросы. Файлы в базу надо записывать в виде "стримов"? Как будет выглядеть запрос? Просто я новичек в работе с j2ee и базами данных вообще ...

Про отображение вроде бы понял принцип, что-то очень-очен похожее видел при использовании CGI.
PM MAIL   Вверх
tux
Дата 26.1.2006, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(sergush @ 26.1.2006, 06:34 Найти цитируемый пост)

Но все же может у кого есть код на java сохранения файла в базу данных (таблица с полем, например, BLOB). И, затем, чтения этого поля из базы. Большой интерес представляют запросы. Файлы в базу надо записывать в виде "стримов"? Как будет выглядеть запрос? Просто я новичек в работе с j2ee и базами данных вообще ...

Файлы в базу можно записывать не только "стримом", но и просто из массива байтов. Разница в том, что если ты загрузишь файл в массив байтов, то он целиком будет храниться в памяти. Это, во-первых, неэффективно, во-вторых, сама физическая возможность работы с файлом будет зависеть от его размера.

Механизм потоков (stream, знаешь наверное про интерфейсы InputStream и OutputStream и множество классов, эти интерфейсы реализующих) позволяет переносить данные из blob-полей в таблицах БД в файл и в обратном направлении транзитом через буфер в памяти относительно небольшого размера. В результате затраты памяти слабо зависят от размера файла и независимо от размера файла можно сохранять его в БД и выгружать оттуда. Правда у меня есть сомнения насчет целесообразности хранения очень больших файлов в БД, но это уже другой вопрос.

Что касается примеров... В собственном коде искать долго, да и код будет мало похож на учебный, поэтому дам ссылку на примеры - http://www.java2s.com/Code/Java/Database-S...y-Data-JDBC.htm.

Если будут вопросы, you are welcome. smile

Это сообщение отредактировал(а) tux - 26.1.2006, 03:27
PM MAIL Skype GTalk Jabber YIM   Вверх
LSD
Дата 26.1.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 5
Всего: 538



Пример работы с blob-ами глянь тут.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sergush
Дата 30.1.2006, 04:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 31.12.2005

Репутация: нет
Всего: нет



Попробовал. Ниже основные строки (весь код приаттачен):
Код

      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      Connection con = DriverManager.getConnection("jdbc:odbc:Blob");
...
        stmt = con.prepareStatement("SELECT blobData FROM BlobTest WHERE fileName = ?");
...чтение
        byte[] b = (byte[])rs.getObject(1);
        BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(f));
        os.write(b);
...запись
        byte[] data = null;
...
        stmt = con.prepareStatement("INSERT INTO BlobTest(fileName, blobData) VALUES(?, ?)");
        stmt.setString(1, args[0]);
        stmt.setObject(2, data);


Файл в базу вроде бы записывается (правильно или нет не знаю). Вроде бы что-то и читается (даже размеры файлов получаются одинаковые), но явно не то, что записывалось. Может подскажете в чем может быть дело?

Я использую стандартный драйвер от сан для подключения к источнику данных одбц. Я правильно понимаю первую строку?
В примере указан другой com.mysql.jdbc.Driver и по другому извлекаются данные Blob b = rs.getBlob(1). С sun.jdbc.odbc.JdbcOdbcDriver же на этой строке выбрасывается исключение java.lang.UnsupportedOperationException, т.е. getBlob() не поддерживается что ли?
Вопросы для тех, кто работает с mysql:
1.MySQL Connector/ODBC - это драйвер, чтобы создать источник данных odbc для mysql?!
2.Что такое MySQL Connector/J? В архиве нашел какой то jar.
3.Описание com.mysql.jdbc.Driver брать из jar из пункта 2?

Для начала хватит smile.

p.s. Жоржж, поставьте за меня по плюсику tux, stampede и LSD плиз.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Blobs.java 2,19 Kb
PM MAIL   Вверх
tux
Дата 30.1.2006, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Сразу скажу что с JDBC-ODBC никогда не работал, поэтому с чем-то могу ошибаться. java.lang.UnsupportedOperationException скорее всего действительно говорит о том, что BLOB не поддерживается. Что касается методов getObject()/setObject(). Теоретически они должны сохранить объект в какой-то стандартный тип SQL. Но поскольку BLOB не поддерживается, то видимо JDBC-ODBC пытается сохранить в какой-то другой тип, отсюда и результат.

По MySQL:
1. да, это он самый
2. это именно то, что нужно - JDBC-драйвер для MySQL
3. документация по Connector/J есть здесь - http://dev.mysql.com/doc/refman/5.0/en/java-connector.html, должна быть и в архиве вместе с примерами, но не уверен.
PM MAIL Skype GTalk Jabber YIM   Вверх
LSD
Дата 30.1.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 5
Всего: 538



Попробуй вместо getBlob() использовать getBinaryStream(). И почему ты используешь JDBC-ODBC мост, а не напрямую конектишься?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 30.1.2006, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Цитата(sergush @ 30.1.2006, 05:19 Найти цитируемый пост)

p.s. Жоржж, поставьте за меня по плюсику tux, stampede и LSD плиз.

Не вопрос.



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
sergush
Дата 31.1.2006, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 31.12.2005

Репутация: нет
Всего: нет



Всем спасибо за помощь.
имхо. Чем дальше тем интереснее.
LSD, до твоего поста я перепробовал и getBlob(), и getBinaryStream() и getObject(). Причем все в связке с setObject(). Кое-что даже работало, но неправильно. Потом решил попробовать getBinaryStream() c setBinaryStream(), и все заработало. И файл в базу сохраняется и правильно извлекается. Появилось достоинство: можно сразу стреам пихать в set-метод. Нужно только размер файла еще указать. Удобно по-моему.

И наконец по odbc-jdbc, где я совсем некомпетентен.
Объясните, пожалуйста, что имел ввиду LSD под "напрямую конектишься". До сегодняшнего дня я думал, что, чтобы работать с базой данных в Java нужно !!ОБЯЗАТЕЛЬНО!! создать источник данных ODBC. Всегда включал в код строку Class.forName("sun.odbc.jdbc.OdbcJdbcDriver"). Чем она отличается от Class.forName("com.mysql.jdbc.Driver")? До вчерашнего дня про Connector/J и не слышал. Что такое JDBC-драйвер? "JDBC-ODBC мост"?

Буду рад получить ответы на вопросы. smile
PM MAIL   Вверх
sergush
Дата 31.1.2006, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 31.12.2005

Репутация: нет
Всего: нет



Кстати вариант с setBinaryStream()/getBinaryStream() без изменений заработал и с MSSQL (после созданий источника данных ODBC для MSSQL).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1323 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.