2010-08-25 56 views
4

你如何让SMO释放它的连接?打电话给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个连接等待命令。当我无法建立新连接时,这最终会导致异常,因为连接池已满。

sp_who

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

回答

6

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

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

+1

这个工作的 NonPooledConnection属性做到这一点。我在完成服务器对象后调用了这个方法:server.ConnectionContext.Disconnect(); – Kjensen 2010-09-05 11:21:43