Загружать последовательно огромный файл в базу данных, используя указатель - PullRequest
0 голосов
/ 25 августа 2010

В моем приложении требуется, чтобы пользователи могли загружать файлы в базу данных. На этом этапе пользователь загружает файл, а веб-страница сохраняет его во временном каталоге, во-вторых, логика загружает файл в Byte [] и передает этот массив в качестве параметра в оператор SQL «insert».

Проблема с этим подходом заключается в том, что если пользователь попытается загрузить файл размером 1 ГБ, это приведет к тому, что серверу понадобится 1 ГБ памяти для сохранения этого файла в виде байта [], и эта память должна быть позднее GCollected. , Если несколько пользователей делают это одновременно, сервер может рухнуть.

Один из способов избежать этого - ограничить размер файла ... но клиент не хочет этого делать. Таким образом, наилучший подход заключается в последовательной загрузке файла в базу данных с использованием указателя. Я нашел пример этого для SQL Server, использующего специальную функцию с именем updatetext , но я хотел бы знать подход, действительный для всех видов баз данных, т.е. чтобы узнать, возможно ли и как загрузить файл в базу данных кусками.

Приветствие.

Ответы [ 2 ]

0 голосов
/ 25 августа 2010

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

Независимо от того, если вам необходимо записать большие двоичные данные в базу данных по частям, то способы будут разными в разных базах данных. И вам нужно проверить такую ​​поддержку в поставщике данных ADO.NET для этой базы данных. Вот статья , в которой объясняется, как читать и записывать большие данные в блоках для Sql Server и Oracle. Поскольку способ будет меняться в зависимости от базы данных или управляемого провайдера, вы должны абстрагировать свой API (как некоторый интерфейс) и код от интерфейса. Затем создайте конкретную реализацию базы данных и используйте фабрику или IOC и т. Д., Чтобы выбрать реализацию.

0 голосов
/ 25 августа 2010

Я не верю, что это возможно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...