开发者

Cleaning up after calls to SMO Server and Database

How do you make SMO release it's connections?

I have this code:

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);
        }
    }

    pub开发者_如何学Clic static Database GetSmoDatabase(Server server)
    {
        var db = server.Databases[ConfigurationManager.AppSettings["Database"]];
        db.AutoClose = true;
        return db;
    }
}

Called like this from an ASP.Net MVC app run in IIS...:

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

For every call I make to this index method a connection is spun up - and is not released again.

So after 20 calls to the page, I have 20 of the connections awaiting command. This eventually ends up with an exception, when I cannot make new connections, because the connection pool is full.

Cleaning up after calls to SMO Server and Database

What do I need to avoid this happening? I cannot seem to find a method on the SMO Server object like Dispose, close or similar.


The MSDN article Disconnecting from an Instance of SQL Server might offer some help. It states that:

When the Connect method is called, the connection is not automatically released. The Disconnect method must be called explicitly to release the connection to the connection pool. Also, you can request a non-pooled connection. You do this by setting the NonPooledConnection property of the ConnectionContext property that references the ServerConnection object


After reading everything i managed to properly disconnect by setting

server.ConnectionContext.NonPooledConnection = true;

and then after i get my database i can call

server.ConnectionContext.Disconnect();
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜