![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
sergush |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 31.12.2005 Репутация: нет Всего: нет |
В базе данных требуется хранить граф. файлы. Какой тип данных выбрать? image? Как сохранить файл в базе данных? получить файл из базы данных? отобразить его на jsp-страничке? За любую помощь заранее спасибо.
p.s. Что лучше: хранить картинки в базе данных или просто в виде файлов на диске (а в базе данных хранить ссылки)? |
|||
|
||||
FatherFrost |
|
|||
![]() Почетный Мороз ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 27.4.2005 Где: Крайний север Репутация: 5 Всего: 6 |
Лучше хранить в БД... Мы работали с MySQL и хранили картинки, если не ошибаюсь, в поле типа BLOB... В MS SQL лучше наверно хранить или в binary или в image.... А выводить сервлетом с указанием соответствующего mime-типа для ответа....
-------------------- Задаю много глупых вопросов.... |
|||
|
||||
tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Не стал бы утверждать так категорично, у каждого метода есть свои плюсы и минусы. Хранение двоичных объектов в файловой системе лучше с точки зрения производительности, причем скорее всего независимо от того какая СУБД используется - навскидку у СУБД больше накладных расходов при сохранении записи в таблицу чем у файловой системы при сохранении файла - надо обновить индексы и т.п. Правда похоже, что это единственный плюс. Плюсы хранения двоичных объектов в БД:
В общем резюме может быть таким - если критична скорость доступа к объектам (предположим очень часто выдаются по запросу двоичные объекты, карты, например), то лучше использовать файловую систему, если же нет, то БД. По поводу отображения на JSP-странице было здесь - http://forum.vingrad.ru/index.php?showtopic=54327&hl=. |
|||
|
||||
Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 66 Всего: 144 |
В целом согласен с tux'ом, но от себя хотел бы упомянуть еще один довод в пользу файлового хранения. Дело в том, что при хранении графики в базе возникает одна трудность чисто практического свойства: с БЛОБами в общем случае очень неудобно работать: загружать, просматривать, обновлять и т. д. И это такой недостаток, который запросто может перевесить все преимущества от хранения в базе. В общем, если это статические картинки, а не такие, которые генерятся или вводятся через веб-интерфейс (как, например, аватары на форуме или фотографии на фотосайте), то я бы выбрал файловое хранение.
|
|||
|
||||
batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 16 Всего: 151 |
Вроде же с ними можно работать, как с обычными стримами. Есть какие-то подводные камни? -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 66 Всего: 144 |
||||
|
||||
sergush |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 31.12.2005 Репутация: нет Всего: нет |
tux и Stampede большое спасибо за подробное объяснение.
Но все же может у кого есть код на java сохранения файла в базу данных (таблица с полем, например, BLOB). И, затем, чтения этого поля из базы. Большой интерес представляют запросы. Файлы в базу надо записывать в виде "стримов"? Как будет выглядеть запрос? Просто я новичек в работе с j2ee и базами данных вообще ... Про отображение вроде бы понял принцип, что-то очень-очен похожее видел при использовании CGI. |
|||
|
||||
tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Файлы в базу можно записывать не только "стримом", но и просто из массива байтов. Разница в том, что если ты загрузишь файл в массив байтов, то он целиком будет храниться в памяти. Это, во-первых, неэффективно, во-вторых, сама физическая возможность работы с файлом будет зависеть от его размера. Механизм потоков (stream, знаешь наверное про интерфейсы InputStream и OutputStream и множество классов, эти интерфейсы реализующих) позволяет переносить данные из blob-полей в таблицах БД в файл и в обратном направлении транзитом через буфер в памяти относительно небольшого размера. В результате затраты памяти слабо зависят от размера файла и независимо от размера файла можно сохранять его в БД и выгружать оттуда. Правда у меня есть сомнения насчет целесообразности хранения очень больших файлов в БД, но это уже другой вопрос. Что касается примеров... В собственном коде искать долго, да и код будет мало похож на учебный, поэтому дам ссылку на примеры - http://www.java2s.com/Code/Java/Database-S...y-Data-JDBC.htm. Если будут вопросы, you are welcome. ![]() Это сообщение отредактировал(а) tux - 26.1.2006, 03:27 |
|||
|
||||
LSD |
|
|||
![]() 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. |
|||
|
||||
sergush |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 31.12.2005 Репутация: нет Всего: нет |
Попробовал. Ниже основные строки (весь код приаттачен):
Файл в базу вроде бы записывается (правильно или нет не знаю). Вроде бы что-то и читается (даже размеры файлов получаются одинаковые), но явно не то, что записывалось. Может подскажете в чем может быть дело? Я использую стандартный драйвер от сан для подключения к источнику данных одбц. Я правильно понимаю первую строку? В примере указан другой 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? Для начала хватит ![]() p.s. Жоржж, поставьте за меня по плюсику tux, stampede и LSD плиз. Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() |
|||
|
||||
tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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, должна быть и в архиве вместе с примерами, но не уверен. |
|||
|
||||
LSD |
|
|||
![]() 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. |
|||
|
||||
batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 16 Всего: 151 |
Не вопрос. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
sergush |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 мост"? Буду рад получить ответы на вопросы. ![]() |
|||
|
||||
sergush |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 31.12.2005 Репутация: нет Всего: нет |
Кстати вариант с setBinaryStream()/getBinaryStream() без изменений заработал и с MSSQL (после созданий источника данных ODBC для MSSQL).
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |