Что лучший способ состоит в том, чтобы связать файл с частью данных?

JVM обычно оптимизирует ваш код перед его выполнением. В вашем случае while(!stop){} оптимизируется до while(true){}. Это происходит потому, что у вас нет явного доступа к статической переменной через синхронизированную функцию, и JVM предполагает, что переменная не будет изменяться небезопасным способом.

Чтобы избежать оптимизации, поместите что-нибудь в цикл while. Вы можете сделать что-то вроде:

while(!stop) {
    try{
        Thread.sleep(1); // You could also call any other function here.
    }
    catch(Exception e) { }
}

В этом случае JVM не будет пытаться оптимизировать, и ваш код будет выполняться так, как ожидается.

РЕДАКТИРОВАТЬ: Хотя это работает в настоящее время, но на основе комментариев, я согласен, что это может измениться в будущих версиях (или в других параллельных реализациях JDK / JVM). Объявление переменной как volatile - лучший способ избежать этой оптимизации.

7
задан Aaron Daniels 5 March 2009 в 21:45
поделиться

8 ответов

Я думаю, что Вы точно получили два самых популярных подхода к решению этой проблемы. Существуют за и против каждому:

Храните файлы в DB

Большинство rbms имеет поддержку хранения блобов (или данные двоичного файла, .doc, .xls, и т.д.) в дб. Таким образом, Вы не привносите нечто новое здесь.

Профессионалы

  • Упрощает Резервное копирование данных: Вы копируете дб, у Вас есть все файлы.
  • Связь между метаданными (другие столбцы О файлах) и самим файлом серьезна и встроена в дб; таким образом, это - один магазин остановки для получения данных о файлах.

Недостатки

  • Резервные копии могут быстро превратиться в ОГРОМНЫЙ кошмар, поскольку Вы храните все это двоичные данные с Вашей базой данных. Вы могли облегчить некоторые головные боли путем хранения файлов в отдельном DB.
  • Без DB или интерфейса к DB, нет никакого простого способа добраться до содержания файла, чтобы изменить или обновить его.
  • В целом, тяжелее, чтобы кодировать и скоординировать загрузку и устройство хранения данных данных к DB по сравнению с файловой системой.

Храните файлы на FileSystem

Этот подход довольно прост, Вы храните сами файлы в файловой системе. Ваша база данных хранит ссылку на местоположение файла (а также все метаданные о файле). Одна полезная подсказка здесь должна стандартизировать Вашу схему именования для файлов на диске (не используйте файл, который пользователь дает Вам, создайте тот самостоятельно и сохраните их в дб).

Профессионалы

  • Сохраняет Ваши данные файла чисто разделенными от базы данных.
  • Легкий поддержать сами файлы (если необходимо изменить файл или обновить его), Вы делаете так в самой файловой системе. Можно столь же легко сделать это из приложения также через новую закачку.

Недостатки

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

В конце дня мы приняли решение пойти путем файловой системы. Было легче реализовать быстро, легкий на резервном копировании, довольно безопасном, после того как мы заблокировали вниз любые дыры и передали файл потоком (вместо того, чтобы просто служить непосредственно от файловой системы). Его операционное в в значительной степени том же формате в течение приблизительно 6 лет в двух различных правительственных приложениях.

J

10
ответ дан 6 December 2019 в 07:52
поделиться

Как хорошо можно сохранить двоичные файлы, или БЛОБЫ, в базе данных будут высоко иждивенцем на DBMS, который Вы используете.

При хранении двоичных файлов в файловой системе необходимо рассмотреть то, что происходит в случае конфликта имени файла, где Вы пытаетесь хранить два различных файла с тем же именем - и если это - допустимая операция или нет. Так, наряду со ссылкой туда, где файл живет на файловой системе, Вы, возможно, также должны сохранить исходное имя файла.

Кроме того, если Вы храните большую сумму файлов, знать о возможных хитах производительности того, чтобы хранить все Ваши файлы в одной папке. (Вы не указывали свою операционную систему, но Вы могли бы хотеть посмотреть на этот вопрос для NTFS или эту ссылку для ext3.)

У нас была система, которая должна была хранить несколько тысяч файлов в файловой системе в файловой системе, где мы были обеспокоены количеством файлов в любой папке (это, возможно, был FAT32, я думаю).

Наша система взяла бы новый файл, который будет добавлен и генерировала бы контрольную сумму MD5 для него (в шестнадцатеричном числе). Это взяло бы первые два символа и сделало бы это первой папкой, следующими двумя символами и сделало бы это второй папкой как подпапка первой папки и затем следующие два как третья папка как подпапка второй папки.

Тем путем мы закончили с трехуровневым набором папок, и файлы были обоснованно хорошо рассеяны так, никакая папка не заполнилась слишком много.

Если бы у нас все еще был конфликт имени файла после этого, то мы просто добавили бы "_n" к имени файла (перед расширением), где n был просто числом постепенного увеличения, пока мы не получили имя, которое не существовало (и даже затем, я думаю, что мы сделали атомарное создание файла, только чтобы быть уверенными).

Конечно, затем Вам нужны инструменты, чтобы сделать случайное сравнение записей базы данных на файловую систему, отмечая любые недостающие файлы и очищая любые осиротевшие, где запись базы данных больше не существует.

4
ответ дан 6 December 2019 в 07:52
поделиться

Необходимо только хранить файлы в базе данных, если Вы довольно уверены, что знаете, что размеры тех файлов не собираются выходить из-под контроля.

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

Если существует слишком много неизвестных, хотя, с помощью файловой системы более безопасный маршрут.

2
ответ дан 6 December 2019 в 07:52
поделиться

Лучшее решение состояло бы в том, чтобы поместить документы в базу данных. Это упрощает все соединение и backingup и восстановление проблем - Но это не могло бы решить основное, 'мы просто хотим указать на документы о нашем файловом сервере' на мышление, которое могут иметь пользователи.

Все это зависит (в конце) на фактических требованиях пользователя.

НО моя рекомендация состояла бы в том, чтобы соединить все это в базе данных, таким образом, Вы сохраняете контроль над ними. Отъезд их в файловой системе оставляет их открытыми для того, чтобы быть удаленным, перемещенными, ACL'd или любое из сотен других изменений, которые могли представить Ваше соединение с ними бессмысленный или даже разрушительный.

Чрезмерное увеличение размера базы данных является только проблемой, если Вы не измерили для него. Сделайте некоторые тесты и посмотрите, какие эффекты это имеет. 100 ГБ файлов на диске являются, вероятно, столь же большими как те же файлы в базе данных.

2
ответ дан 6 December 2019 в 07:52
поделиться

Используйте базу данных для данных и файловую систему для файлов. Просто сохраните путь к файлу в базе данных.

Кроме того, Ваш веб-сервер может, вероятно, служить файлам более эффективно, чем Вы, код приложения сделает (для потоковой передачи файла от DB назад клиенту).

2
ответ дан 6 December 2019 в 07:52
поделиться

И теперь для полностью от стенного предложения - Вы могли рассмотреть хранение двоичных файлов как вложения в документной базе данных CouchDB. Это избежало бы проблем конфликта имени файла, поскольку Вы будете использовать сгенерированный UID в качестве каждого идентификатора документа (которым Вы, что Вы сохранили бы в своем RDBMS), и имя файла фактического вложения сохранено с документом.

При создании веб-системы то то, что CouchDB использует REST по HTTP, могло также быть усилено. И, существуют также средства репликации, которые могли доказать использования.

Конечно, CouchDB находится все еще в инкубации, хотя существуют некоторые, кто уже использует его 'в дикой природе'.

0
ответ дан 6 December 2019 в 07:52
поделиться

Сохраните пути в базе данных. Это мешает Вашей базе данных чрезмерно увеличиваться в размерах и также позволяет Вам отдельно создавать резервную копию внешних файлов. Можно также переместить их более легко; просто переместите их в новое местоположение и затем ОБНОВИТЕ базу данных.

Одна дополнительная вещь иметь в виду: для использования большинства типов файлов, которые Вы упомянули, Вы закончите тем, что имели необходимость к:

  • Запросите базу данных для получения содержания файла в блобе
  • Запишите данные блоба в дисковый файл
  • Запустите приложение к open/edit/whatever файл, который Вы просто создали
  • Читайте файл въезжают задним ходом от диска до блоба
  • Обновите базу данных с новым содержанием

Все, что в противоположность:

  • Считайте путь к файлу из DB
  • Запустите приложение к open/edit/whatever файл

Я предпочитаю второй набор шагов, сам.

2
ответ дан 6 December 2019 в 07:52
поделиться

Я попытался бы сохранить все это в базе данных. Не сделали этого. Но если нет. Существует маленький риск, что имена файлов выходят из синхронизации с файлами на диске. Затем у Вас есть большая проблема.

1
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: