代码之家  ›  专栏  ›  技术社区  ›  Kjensen

调用SMO服务器和数据库后清理

  •  4
  • Kjensen  · 技术社区  · 15 年前

    如何让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.NetMVC应用程序在IIS中运行…:

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

    对于我对这个索引方法所做的每一次调用,都会启动一个连接,并且不会再次释放。

    所以在对页面进行了20次调用之后,我有20个连接在等待命令。这最终导致了一个异常,当我无法建立新连接时,因为连接池已满。

    sp_who

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

    2 回复  |  直到 15 年前
        1
  •  7
  •   Garett    15 年前

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

    Connect 方法,则 连接不是自动的 Disconnect 方法必须 被显式调用以释放 连接到连接池。 此外,您还可以请求非池 NonPooledConnection 财产 ConnectionContext 财产 引用 ServerConnection 对象

        2
  •  2
  •   SubqueryCrunch    6 年前

    看完所有东西后,我通过设置

    server.ConnectionContext.NonPooledConnection = true;
    

    server.ConnectionContext.Disconnect();
    
    推荐文章