Очистка после звонков на SMO-сервер и базу данных - PullRequest
4 голосов
/ 25 августа 2010

Как вы заставляете SMO освобождать свои соединения?

У меня есть этот код:

public static class SqlServerConnectionFactory
{
    public static Server GetSmoServer()
    {
        using (var c = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString))
        {
            var s = new ServerConnection(c);
            c.Close();
            return new Server(s);
        }
    }

    public static Database GetSmoDatabase(Server server)
    {
        var db = server.Databases[ConfigurationManager.AppSettings["Database"]];
        db.AutoClose = true;
        return db;
    }
}

Вызывается так из приложения ASP.Net MVC, запущенного в IIS ...:

public ActionResult Index()
    {
        server = SqlServerConnectionFactory.GetSmoServer();
        database = SqlServerConnectionFactory.GetSmoDatabase(server);
        var vm = new SettingsIndexViewmodel(database);
        return View(vm);
    }

При каждом обращении к этому методу индекса я подключаюсь - и снова не освобождается.

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

sp_who

Что мне нужно, чтобы этого не случилось? Кажется, я не могу найти метод объекта SMO Server, такой как Dispose, close или аналогичный.

Ответы [ 2 ]

6 голосов
/ 31 августа 2010

Статья MSDN Disconnecting from an Instance of SQL Server может предложить некоторую помощь В нем говорится, что:

Когда вызывается метод Connect , соединение не автоматически вышел. Метод Disconnect должен быть вызванным явно, чтобы освободить подключение к пулу соединений. Также вы можете запросить не пул подключение. Вы делаете это, устанавливая NonPooledConnection свойство объекта ConnectionContext свойство, которое ссылается на ServerConnection объект

0 голосов
/ 02 января 2019

Прочитав все, что мне удалось правильно отключить, установив

server.ConnectionContext.NonPooledConnection = true;

и затем, после того, как я получу свою базу данных, я могу позвонить

server.ConnectionContext.Disconnect();
...