Нужна библиотека типа mini-Sharepoint
От: Blackmore  
Дата: 19.01.11 16:08
Оценка: :)
Там должно быть 2 функции — SaveDocument(Stream oDoc) и GetCoument(int nDocID). База — MSSQL. Есть где-набудь такая готовая либа или открытый код?
Re: Нужна библиотека типа mini-Sharepoint
От: adontz Грузия http://adontz.wordpress.com/
Дата: 19.01.11 16:28
Оценка:
Здравствуйте, Blackmore, Вы писали:

B>Там должно быть 2 функции — SaveDocument(Stream oDoc) и GetCoument(int nDocID). База — MSSQL. Есть где-набудь такая готовая либа или открытый код?


что мешает самому это написать?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Нужна библиотека типа mini-Sharepoint
От: Blackmore  
Дата: 19.01.11 19:10
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Blackmore, Вы писали:


B>>Там должно быть 2 функции — SaveDocument(Stream oDoc) и GetCoument(int nDocID). База — MSSQL. Есть где-набудь такая готовая либа или открытый код?


A>что мешает самому это написать?


Думал просто, что уже готовое есть — бери и юзай под .NET
Re[3]: Нужна библиотека типа mini-Sharepoint
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.01.11 21:37
Оценка:
Здравствуйте, Blackmore, Вы писали:

B>Здравствуйте, adontz, Вы писали:


A>>Здравствуйте, Blackmore, Вы писали:


B>>>Там должно быть 2 функции — SaveDocument(Stream oDoc) и GetCoument(int nDocID). База — MSSQL. Есть где-набудь такая готовая либа или открытый код?


A>>что мешает самому это написать?


B>Думал просто, что уже готовое есть — бери и юзай под .NET


Эх как ты разогнался.
Рядом со стримом тебе понадобится как минимум имя файла и content-type, а также last-modified и etag во многих сценариях. А потом внезапно окажется что хранить кучу блобов в MS SQL неэффективно и ты будешь спрашивать как их хранить вне MS SQL.
Re[4]: Нужна библиотека типа mini-Sharepoint
От: _d_m_  
Дата: 21.01.11 08:24
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>Рядом со стримом тебе понадобится как минимум имя файла и content-type, а также last-modified и etag во многих сценариях. А потом внезапно окажется что хранить кучу блобов в MS SQL неэффективно и ты будешь спрашивать как их хранить вне MS SQL.


А чего бы это вдруг неэффективно хранить блобы?
Re[5]: Нужна библиотека типа mini-Sharepoint
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.01.11 08:59
Оценка: +2
Здравствуйте, _d_m_, Вы писали:

___>Здравствуйте, gandjustas, Вы писали:


G>>Рядом со стримом тебе понадобится как минимум имя файла и content-type, а также last-modified и etag во многих сценариях. А потом внезапно окажется что хранить кучу блобов в MS SQL неэффективно и ты будешь спрашивать как их хранить вне MS SQL.


___>А чего бы это вдруг неэффективно хранить блобы?


1)Значительное увеличение размера базы, что сказывается на времени бекапа-рестора
2)Блоб из СУБД стримается в режиме forward-only считывания, для random read-write приходится извращаться.
3)Доставание блобов из таблиц создает дополнительную, но абсолютно ненужную нагрузку на SQL Server

Для блобов в 4k-64k на запись это малозаметный эффект дает. Для более крупных файлов уже начинается геморрой.
Re[6]: Нужна библиотека типа mini-Sharepoint
От: Sinix  
Дата: 21.01.11 10:01
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>1)Значительное увеличение размера базы, что сказывается на времени бекапа-рестора

partial backups. Полный бэкап придётся делать всё равно.

G>2)Блоб из СУБД стримается в режиме forward-only считывания, для random read-write приходится извращаться.

Если вы запихиваете в blob неатомарные данные — это самая меньшая из ваших проблем
Тем не менее — http://msdn.microsoft.com/en-us/library/bb399384.aspx

G>3)Доставание блобов из таблиц создает дополнительную, но абсолютно ненужную нагрузку на SQL Server

G>Для блобов в 4k-64k на запись это малозаметный эффект дает. Для более крупных файлов уже начинается геморрой.
Для более крупных есть FILESTREAM, Он умеет отдавать поток напрямую с ФС.
Re[7]: Нужна библиотека типа mini-Sharepoint
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.01.11 10:05
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, gandjustas, Вы писали:


G>>1)Значительное увеличение размера базы, что сказывается на времени бекапа-рестора

S>partial backups. Полный бэкап придётся делать всё равно.
Это не решение. В любом случае база будет пухнуть без толку.

G>>3)Доставание блобов из таблиц создает дополнительную, но абсолютно ненужную нагрузку на SQL Server

G>>Для блобов в 4k-64k на запись это малозаметный эффект дает. Для более крупных файлов уже начинается геморрой.
S>Для более крупных есть FILESTREAM, Он умеет отдавать поток напрямую с ФС.
А толку? все равно этот поток будет прокачиваться через SQL Server. Надо получать имя файла и открывать его для чтения напрямую. Тогда все будет ОК.


Еще раз: хранить большие блобы в базе — плохо. Их надо хранить вне и обращаться к ним вне базы. FileStream как раз для этого и был создан.
Re[8]: Нужна библиотека типа mini-Sharepoint
От: Sinix  
Дата: 21.01.11 11:14
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>1)Значительное увеличение размера базы, что сказывается на времени бекапа-рестора

S>>partial backups. Полный бэкап придётся делать всё равно.
G>Это не решение. В любом случае база будет пухнуть без толку.
Будет пухнуть не база, а папка в которой хранятся данные FILESTREAM.


S>>Для более крупных есть FILESTREAM, Он умеет отдавать поток напрямую с ФС.

G>А толку? все равно этот поток будет прокачиваться через SQL Server. Надо получать имя файла и открывать его для чтения напрямую. Тогда все будет ОК.
OpenSqlFilestream API именно это и делает.

А на практике достаточно даже dataReader.GetSqlBinary(), или такого кода:
    private static void WriteToStream(IDataReader reader, int binaryDataOrdinal, Stream stream, int bufferSize)
    {
      byte[] buffer = new byte[bufferSize];
      long position = 0;
      long bytesReaded;

      do
      {
        bytesReaded = reader.GetBytes(binaryDataOrdinal, position, buffer, 0, bufferSize);

        stream.Write(buffer, 0, (int)bytesReaded);

        position += bytesReaded;
      }
      while (bytesReaded == bufferSize);
    }


G>Еще раз: хранить большие блобы в базе — плохо. Их надо хранить вне и обращаться к ним вне базы. FILESTREAM как раз для этого и был создан. Сэкономив на копейках, придётся переизобретать транзакции, полнотекстовый поиск, бэкап, контроль доступа и репликацию. Оно вам надо?
Re[8]: Нужна библиотека типа mini-Sharepoint
От: Sinix  
Дата: 21.01.11 12:05
Оценка:
Здравствуйте, gandjustas, Вы писали:

Я не сразу заметил, что вы явно разделяете FILESTREAM и MS SQL, и файлстрим, по-вашему — это не способ хранить блобы в базе.

хранить кучу блобов в MS SQL неэффективно
...
Их надо хранить вне и обращаться к ним вне базы. FileStream как раз для этого и был создан.



От умеете же запутать самый простой вопрос
Re[9]: Нужна библиотека типа mini-Sharepoint
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.01.11 12:17
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, gandjustas, Вы писали:


S>Я не сразу заметил, что вы явно разделяете FILESTREAM и MS SQL, и файлстрим, по-вашему — это не способ хранить блобы в базе.

S>

S>хранить кучу блобов в MS SQL неэффективно
S>...
S>Их надо хранить вне и обращаться к ним вне базы. FileStream как раз для этого и был создан.

S>

S>От умеете же запутать самый простой вопрос


Ну начнем с того что топикстартер хотел готовую либу. Я начал объяснять что готовой либы с таким интерфейсом не будет, по вполне определенным причинам, в том числе связанным с неэффективность хранения блобов в БД.
Re[10]: Нужна библиотека типа mini-Sharepoint
От: Sinix  
Дата: 21.01.11 12:36
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>Ну начнем с того что топикстартер хотел готовую либу. Я начал объяснять что готовой либы с таким интерфейсом не будет, по вполне определенным причинам, в том числе связанным с неэффективность хранения блобов в БД.


Sharepoint же как-то справляется с "неэффективностью хранения", почему сторонняя библиотека не может использовать FILESTREAM?

Но готового ничего не будет — слишком много различных юз-кейзов, чтобы написать что-то универсальное.
Re[11]: Нужна библиотека типа mini-Sharepoint
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.01.11 12:42
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, gandjustas, Вы писали:


G>>Ну начнем с того что топикстартер хотел готовую либу. Я начал объяснять что готовой либы с таким интерфейсом не будет, по вполне определенным причинам, в том числе связанным с неэффективность хранения блобов в БД.


S>Sharepoint же как-то справляется с "неэффективностью хранения"

Никак он не справляется. Несколько тысяч файлов уже "много", сотня тысяч уже "слишком много".

S>почему сторонняя библиотека не может использовать FILESTREAM?

S>Но готового ничего не будет — слишком много различных юз-кейзов, чтобы написать что-то универсальное.
Во-во
Re[9]: Нужна библиотека типа mini-Sharepoint
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.01.11 12:53
Оценка:
Здравствуйте, Sinix, Вы писали:

S>>>Для более крупных есть FILESTREAM, Он умеет отдавать поток напрямую с ФС.

G>>А толку? все равно этот поток будет прокачиваться через SQL Server. Надо получать имя файла и открывать его для чтения напрямую. Тогда все будет ОК.
S>OpenSqlFilestream API именно это и делает.
Этот API по сравнению с обычным Transact-SQL не транзакционный, потому, к примеру, удалить или переименовать файл не получится. Автору темы как будто от библиотеки не нужен метод удаления файла, но чую, это он просто не подумал.
Re[10]: Нужна библиотека типа mini-Sharepoint
От: Sinix  
Дата: 21.01.11 13:11
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Sinix, Вы писали:


S>>>>Для более крупных есть FILESTREAM, Он умеет отдавать поток напрямую с ФС.

G>>>А толку? все равно этот поток будет прокачиваться через SQL Server. Надо получать имя файла и открывать его для чтения напрямую. Тогда все будет ОК.
S>>OpenSqlFilestream API именно это и делает.
R>Этот API по сравнению с обычным Transact-SQL не транзакционный, потому, к примеру, удалить или переименовать файл не получится.
Не совсем так: http://msdn.microsoft.com/en-us/library/bb933972.aspx

...
When the file is opened for write access, the transaction is owned by the FILESTREAM agent. Only Win32 file I/O is allowed until the transaction is released. To release the transaction, the write handle must be closed.

Syntax

HANDLE OpenSqlFilestream (
    LPCWSTR FilestreamPath,
    SQL_FILESTREAM_DESIRED_ACCESS DesiredAccess,
    ULONG OpenOptions,
    LPBYTE FilestreamTransactionContext,
    SIZE_T FilestreamTransactionContextLength,
    PLARGE_INTEGER AllocationSize);

Файлы FILESTREAM используют служебные имена, метаданные реальных файлов надо хранить самостоятельно, как привило — в той же таблице, что и сам blob.

R>Автору темы как будто от библиотеки не нужен метод удаления файла, но чую, это он просто не подумал.

Удаляется простым удалением записи из таблицы.
Re[11]: Нужна библиотека типа mini-Sharepoint
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.01.11 13:29
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>>>>>Для более крупных есть FILESTREAM, Он умеет отдавать поток напрямую с ФС.

G>>>>А толку? все равно этот поток будет прокачиваться через SQL Server. Надо получать имя файла и открывать его для чтения напрямую. Тогда все будет ОК.
S>>>OpenSqlFilestream API именно это и делает.
R>>Этот API по сравнению с обычным Transact-SQL не транзакционный, потому, к примеру, удалить или переименовать файл не получится.
S>Не совсем так: http://msdn.microsoft.com/en-us/library/bb933972.aspx
Ага, я к тому, что для всех сценариев CRUID все равно так или иначе придется задействовать Database Engine.

R>>Автору темы как будто от библиотеки не нужен метод удаления файла, но чую, это он просто не подумал.

S>Удаляется простым удалением записи из таблицы.
Я и говорил, что стандартным Transact-SQL можно, что через Win32 API нельзя.
Re[12]: Нужна библиотека типа mini-Sharepoint
От: Sinix  
Дата: 21.01.11 13:46
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Ага, я к тому, что для всех сценариев CRUID все равно так или иначе придется задействовать Database Engine.

Там по-любому напрямую не выйдет — потребуется PathName(), при обращении буде использоваться filter driver. А какая разница?

R>Я и говорил, что стандартным Transact-SQL можно, что через Win32 API нельзя.

А чем так принципиально наличие winapi?
Re[13]: Нужна библиотека типа mini-Sharepoint
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.01.11 15:03
Оценка:
Здравствуйте, Sinix, Вы писали:

R>>Я и говорил, что стандартным Transact-SQL можно, что через Win32 API нельзя.

S>А чем так принципиально наличие winapi?
Ну это как раз не ко мне вопрос. Выше вы с gandjustas дошли до того, как работать с файлами в SQL Server, не задействуя Database Engine. Я только встрял, что в таком варианте не все сценарии работы будут покрыты.
Re[14]: Нужна библиотека типа mini-Sharepoint
От: Sinix  
Дата: 21.01.11 15:49
Оценка: +1
Здравствуйте, rsn81, Вы писали:

R>Ну это как раз не ко мне вопрос. Выше вы с gandjustas дошли до того, как работать с файлами в SQL Server, не задействуя Database Engine. Я только встрял, что в таком варианте не все сценарии работы будут покрыты.


Я ещё раз повторю: на самом деле db engine всегда задействуется, только очень тонкой прослойкой. А все разборки от того, что gandjustas начал с

хранить кучу блобов в MS SQL неэффективно

а закончил

Их надо хранить вне и обращаться к ним вне базы. FileStream как раз для этого и был создан.


Для меня это оччень походит на высказывание "Работа с unmanaged в дотнете очень неэффективна ...(перерыв на пару постов с ответами про интероп)... надо использовать нативные библиотеки и интероп, он как раз для этого и был создан".

Диверсант, как есть диверсант
Re[15]: Нужна библиотека типа mini-Sharepoint
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.01.11 15:56
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Для меня это оччень походит на высказывание "Работа с unmanaged в дотнете очень неэффективна ...(перерыв на пару постов с ответами про интероп)... надо использовать нативные библиотеки и интероп, он как раз для этого и был создан".

S>Диверсант, как есть диверсант
Ага, учитывая, что сам .NET внутри себя интеропиться не стесняясь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.