【问题标题】:Cleaning up after calls to SMO Server and Database调用 SMO 服务器和数据库后进行清理
【发布时间】:2010-08-25 14:02:27
【问题描述】:

如何让 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;
    }
}

从在 IIS 中运行的 ASP.Net MVC 应用程序中这样调用...:

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

对于我对该索引方法的每次调用,都会建立一个连接 - 并且不会再次释放。

因此,在对页面进行 20 次调用后,我有 20 个连接等待命令。当我无法建立新连接时,这最终会出现异常,因为连接池已满。

我需要怎样做才能避免这种情况发生?我似乎在 SMO 服务器对象上找不到像 Dispose、close 或类似的方法。

【问题讨论】:

    标签: asp.net sql-server-2008 smo


    【解决方案1】:

    MSDN 文章Disconnecting from an Instance of SQL Server 可能会提供一些帮助。它指出:

    Connect 方法被调用时, 连接不是自动的 释放。 Disconnect 方法必须 被显式调用以释放 连接到连接池。 此外,您可以请求非池 联系。您可以通过设置 NonPooledConnection 的属性 ConnectionContext 属性 引用ServerConnection 对象

    【讨论】:

    • 这行得通。我在完成服务器对象后才调用它:server.ConnectionContext.Disconnect();
    【解决方案2】:

    阅读完所有内容后,我设法通过设置正确断开连接

    server.ConnectionContext.NonPooledConnection = true;
    

    然后在我得到我的数据库后,我可以调用

    server.ConnectionContext.Disconnect();
    

    【讨论】:

    • 我已经拉头发好几个小时了。这救了我的命!
    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2017-07-16
    • 2012-11-16
    相关资源
    最近更新 更多