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
- лучший способ избежать этой оптимизации.
Я думаю, что Вы точно получили два самых популярных подхода к решению этой проблемы. Существуют за и против каждому:
Большинство rbms имеет поддержку хранения блобов (или данные двоичного файла, .doc, .xls, и т.д.) в дб. Таким образом, Вы не привносите нечто новое здесь.
Этот подход довольно прост, Вы храните сами файлы в файловой системе. Ваша база данных хранит ссылку на местоположение файла (а также все метаданные о файле). Одна полезная подсказка здесь должна стандартизировать Вашу схему именования для файлов на диске (не используйте файл, который пользователь дает Вам, создайте тот самостоятельно и сохраните их в дб).
В конце дня мы приняли решение пойти путем файловой системы. Было легче реализовать быстро, легкий на резервном копировании, довольно безопасном, после того как мы заблокировали вниз любые дыры и передали файл потоком (вместо того, чтобы просто служить непосредственно от файловой системы). Его операционное в в значительной степени том же формате в течение приблизительно 6 лет в двух различных правительственных приложениях.
J
Как хорошо можно сохранить двоичные файлы, или БЛОБЫ, в базе данных будут высоко иждивенцем на DBMS, который Вы используете.
При хранении двоичных файлов в файловой системе необходимо рассмотреть то, что происходит в случае конфликта имени файла, где Вы пытаетесь хранить два различных файла с тем же именем - и если это - допустимая операция или нет. Так, наряду со ссылкой туда, где файл живет на файловой системе, Вы, возможно, также должны сохранить исходное имя файла.
Кроме того, если Вы храните большую сумму файлов, знать о возможных хитах производительности того, чтобы хранить все Ваши файлы в одной папке. (Вы не указывали свою операционную систему, но Вы могли бы хотеть посмотреть на этот вопрос для NTFS или эту ссылку для ext3.)
У нас была система, которая должна была хранить несколько тысяч файлов в файловой системе в файловой системе, где мы были обеспокоены количеством файлов в любой папке (это, возможно, был FAT32, я думаю).
Наша система взяла бы новый файл, который будет добавлен и генерировала бы контрольную сумму MD5 для него (в шестнадцатеричном числе). Это взяло бы первые два символа и сделало бы это первой папкой, следующими двумя символами и сделало бы это второй папкой как подпапка первой папки и затем следующие два как третья папка как подпапка второй папки.
Тем путем мы закончили с трехуровневым набором папок, и файлы были обоснованно хорошо рассеяны так, никакая папка не заполнилась слишком много.
Если бы у нас все еще был конфликт имени файла после этого, то мы просто добавили бы "_n" к имени файла (перед расширением), где n был просто числом постепенного увеличения, пока мы не получили имя, которое не существовало (и даже затем, я думаю, что мы сделали атомарное создание файла, только чтобы быть уверенными).
Конечно, затем Вам нужны инструменты, чтобы сделать случайное сравнение записей базы данных на файловую систему, отмечая любые недостающие файлы и очищая любые осиротевшие, где запись базы данных больше не существует.
Необходимо только хранить файлы в базе данных, если Вы довольно уверены, что знаете, что размеры тех файлов не собираются выходить из-под контроля.
Я использую нашу базу данных для хранения маленьких изображений баннера, которые я всегда знаю, каким размером они собираются быть. Ваша база данных будет хранить указатель на данные в строке и затем ронять сами данные где-то в другом месте, таким образом, это не обязательно повлияет на скорость.
Если существует слишком много неизвестных, хотя, с помощью файловой системы более безопасный маршрут.
Лучшее решение состояло бы в том, чтобы поместить документы в базу данных. Это упрощает все соединение и backingup и восстановление проблем - Но это не могло бы решить основное, 'мы просто хотим указать на документы о нашем файловом сервере' на мышление, которое могут иметь пользователи.
Все это зависит (в конце) на фактических требованиях пользователя.
НО моя рекомендация состояла бы в том, чтобы соединить все это в базе данных, таким образом, Вы сохраняете контроль над ними. Отъезд их в файловой системе оставляет их открытыми для того, чтобы быть удаленным, перемещенными, ACL'd или любое из сотен других изменений, которые могли представить Ваше соединение с ними бессмысленный или даже разрушительный.
Чрезмерное увеличение размера базы данных является только проблемой, если Вы не измерили для него. Сделайте некоторые тесты и посмотрите, какие эффекты это имеет. 100 ГБ файлов на диске являются, вероятно, столь же большими как те же файлы в базе данных.
Используйте базу данных для данных и файловую систему для файлов. Просто сохраните путь к файлу в базе данных.
Кроме того, Ваш веб-сервер может, вероятно, служить файлам более эффективно, чем Вы, код приложения сделает (для потоковой передачи файла от DB назад клиенту).
И теперь для полностью от стенного предложения - Вы могли рассмотреть хранение двоичных файлов как вложения в документной базе данных CouchDB. Это избежало бы проблем конфликта имени файла, поскольку Вы будете использовать сгенерированный UID в качестве каждого идентификатора документа (которым Вы, что Вы сохранили бы в своем RDBMS), и имя файла фактического вложения сохранено с документом.
При создании веб-системы то то, что CouchDB использует REST по HTTP, могло также быть усилено. И, существуют также средства репликации, которые могли доказать использования.
Конечно, CouchDB находится все еще в инкубации, хотя существуют некоторые, кто уже использует его 'в дикой природе'.
Сохраните пути в базе данных. Это мешает Вашей базе данных чрезмерно увеличиваться в размерах и также позволяет Вам отдельно создавать резервную копию внешних файлов. Можно также переместить их более легко; просто переместите их в новое местоположение и затем ОБНОВИТЕ базу данных.
Одна дополнительная вещь иметь в виду: для использования большинства типов файлов, которые Вы упомянули, Вы закончите тем, что имели необходимость к:
Все, что в противоположность:
Я предпочитаю второй набор шагов, сам.
Я попытался бы сохранить все это в базе данных. Не сделали этого. Но если нет. Существует маленький риск, что имена файлов выходят из синхронизации с файлами на диске. Затем у Вас есть большая проблема.