SQL LocalDB зависает после отсоединения mdf файла - PullRequest
0 голосов
/ 25 марта 2020

Я создал набор интеграционных тестов, которые используют SQL 2016 LocalDB. Каждый тест требует, чтобы база данных находилась в известном состоянии, поэтому мне нужно удалить все данные и заново заполнить перед выполнением каждого теста. Для повышения производительности этих тестов я написал некоторый код, который создает заполненную базу данных, отсоединяет базу данных, затем для каждого теста я копирую файл mdf и присоединяюсь к нему. Это действительно хорошо работает.

Однако после примерно 80 тестов тесты зависают. Если я убью sqlservr.exe, зависший тест останется зависшим.

Код для отключения базы данных:

public static void DetachDatabase(string dbName)
    {
        var commandText = @$"
                USE MASTER;
                ALTER DATABASE [{dbName}] SET OFFLINE WITH ROLLBACK IMMEDIATE;
                EXEC sp_detach_db '{dbName}', 'true';";

        using var cn =
            new SqlConnection(
                "Server=(localdb)\\mssqllocaldb;Database=master;Integrated Security=true;MultipleActiveResultSets=true");
        cn.Open();
        var cmd = cn.CreateCommand();
        cmd.CommandText = commandText;
        cmd.ExecuteNonQuery();
    }

Код для копирования файла mdf и возврата строки подключения:

public static string GetConnectionString(string dbName, bool useExistingMdfFile)
    {
        var connectionString = $"Server=(localdb)\\mssqllocaldb;Initial Catalog={dbName};Integrated Security=true";
        if (useExistingMdfFile)
        {
            // Make a copy of the source mdf file for use in a single test
            var directory = GetLocalDbDataFilePath();
            var source = Path.Combine(directory, $"{dbName}.mdf");
            var dest = Path.Combine(directory, $"{dbName}_ForTest.mdf");
            File.Copy(source, dest);

            connectionString += $"; AttachDBFilename = {Path.Combine(directory, dest)}";
        }

        return connectionString;
    }

Я понимаю, что SQL localDB, вероятно, не был разработан, чтобы работать таким образом, но есть ли у кого-нибудь идеи, почему он может зависать, или какие-либо альтернативные способы ускорения интеграционных тестов?

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