Cleaning up after calls to SMO Server and Database

ⅰ亾dé卋堺 提交于 2020-01-01 10:14:22

问题


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

    public 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.

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.


回答1:


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




回答2:


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


来源:https://stackoverflow.com/questions/3566632/cleaning-up-after-calls-to-smo-server-and-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!