Использование SMO для создания сценариев определений объектов из базы данных сервера SQL в .net в параллельном цикле - PullRequest
6 голосов
/ 07 марта 2012

Я использую SMO для создания сценариев своих объектов из базы данных сервера Sql с использованием кода .Net. Но на данный момент я иду через последовательный цикл.

foreach(var table in TableCollection)
{
 var stringCollection=table.Script();
}

Работает нормально. Но когда я конвертирую тот же цикл в Parallel.ForEach цикл, например:

Parallel.ForEach(TableCollection,table=>
{
 var stringCollection=table.Script();
});

Сценарий не выполняется. Есть ли кто-нибудь, кто использовал такой же подход или любой другой подход для параллельного создания сценариев объектов с сервера Sql?

ОБНОВЛЕНИЕ:

На данный момент мне не удалось обработать параллельный цикл, но я использовал приведенный ниже код:

 server.SetDefaultInitFields(true);                

Улучшает производительность до некоторой степени.

1 Ответ

4 голосов
/ 07 марта 2012

Кажется, SMO не был создан в поточно-ориентированном режиме.Когда вы вызываете Script() для Table, он использует некоторое общее состояние из Server, поэтому вы не можете выполнить его для двух таблиц из одного и того же Server.Но вы можете обойти это, создав новый объект Server для каждого Table:

private static TableCollection GetTables()
{
    Server server = new Server(…);
    Database database = server.Databases[…];
    var tables = database.Tables;
    return tables;
}

…

Parallel.For(0, GetTables().Count,
    i =>
    {
        var stringCollection = GetTables()[i].Script();
        …
    });

Это сделает ваши запросы параллельными, но я не знаю, сделает ли это их на самом деле быстрее.

РЕДАКТИРОВАТЬ: Если вы хотите создать один Server для каждого потока, вы можете использовать перегрузку Parallel.For(), которая позволяет локальной инициализации потока.Примерно так:

Parallel.For(0, GetTables().Count,
    () => GetTables(),
    (i, _, tables) =>
    {
        var stringCollection = tables[i].Script();
        …
        return tables;
    },
    tables => { });

Таким образом, каждый поток будет иметь свой собственный объект Server, но только один.

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