2010-08-25 40 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