簡體   English   中英

數據庫刪除后,Sql Server 2008關閉連接

[英]Sql Server 2008 Closing Connections after database dropped

在刪除並重新創建給定數據庫之后,我遇到SQL Server丟棄連接的問題,下次當我嘗試對同一個數據庫上的新連接執行命令時,我得到:

將請求發送到服務器時發生傳輸級錯誤。 (提供者:共享內存提供者,錯誤:0 - 管道的另一端沒有進程。)

這是TCP版本(如果我嘗試連接到另一台服務器)

將請求發送到服務器時發生傳輸級錯誤。 (提供程序:TCP提供程序,錯誤:0 - 遠程主機強制關閉現有連接。)

以下是重現問題的步驟:

  1. 打開與數據庫的連接並執行sql命令
  2. 刪除數據庫
  3. 重新創建數據庫
  4. 打開與同一數據庫的新連接,並嘗試對其運行命令

結果:我收到一個例外

這是代碼:

using (var conn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=DBNAME;Integrated Security=True"))
{
    conn.Open();
    var cmd = conn.CreateCommand();
    cmd.CommandText = "UPDATE ...";
    cmd.ExecuteNonQuery();
}

string sql = "Alter Database DBNAME set single_user with rollback immediate drop database DBNAME";
var server = new Microsoft.SqlServer.Management.Smo.Server(".");
server.ConnectionContext.ExecuteNonQuery(sql);
server.ConnectionContext.Disconnect();

sql = File.ReadAllText("PathToDotSqlFile..."));
server = new Microsoft.SqlServer.Management.Smo.Server(".");
server.ConnectionContext.ExecuteNonQuery(sql);
server.ConnectionContext.Disconnect();

using (var conn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=WER_CONFIG;Integrated Security=True"))
{
    conn.Open();
    var cmd = conn.CreateCommand();
    cmd.CommandText = "UPDATE ...";
    cmd.ExecuteNonQuery();
}

錯誤發生在最后的'cmd.ExecuteNonQuery()'行。 看來即使我每次連接時都在創建一個新的連接,sql server也會記錄下一次我要求連接的東西(或者可能是ADO.net代碼),它給了我一個已經使用的連接或已在服務器端關閉。 它沒有意識到它被服務器關閉(可能是因為數據庫被連接到被丟棄),直到你嘗試對它執行另一個命令。

請注意,如果我沒有執行初始查詢的第一步,我只是刪除數據庫,重新創建它,並執行命令,我不會收到此錯誤。 我認為在刪除數據庫之前建立初始連接是此錯誤的重要部分。

我也嘗試使用外部進程刪除並重新創建數據庫,如下所示:

ProcessStartInfo info = new ProcessStartInfo("sqlcmd.exe", " -e -E -S . -Q \"Alter Database DBNAME set single_user with rollback immediate drop database DBNAME\"");
var p = Process.Start(info);
p.WaitForExit();

info = new ProcessStartInfo("sqlcmd.exe", " -i " + PathToDotSqlFile);
p = Process.Start(info);
p.WaitForExit();

這沒有幫助。

有沒有辦法創建一個新的SqlConnection並確保它是干凈的而不是從池? 關於如何解決這個問題的任何其他建議?

更新:使用SqlConnection.ClearPool()確實解決了問題,但我選擇只使用pooling = false編輯我的連接字符串,這也是有效的。

ADO.NET自動管理連接池。 當您“關閉”應用程序中的連接時,如果您使用相同的連接字符串請求連接,它將返回到池並保持活動狀態。 這可能是您的“新”連接過時的原因。

您可以嘗試通過將pooling=false作為參數添加到連接字符串來關閉此行為。

不知道SQL2008,但這聽起來像應用程序端的連接池問題。 在過去,我們在連接字符串中添加了“OLEDB Services = -1”以關閉連接池。 現在可能有更優雅的方式來做到這一點。

編輯:ADO.Net 2.0似乎已向SQLConnection對象添加了ClearPool函數。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.clearpool(VS.80).aspx )我很想知道這是否有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM