時關閉連接/ datareader,我們發現連接池錯誤消息。因此,我一直在瀏覽代碼,並關閉SqlDataReader對象,無論它們是否處於未關閉狀態。我需要知道的是如何關閉在SqlDataSource或ObjectDataSource標記的SelectStatement屬性中指定的datareader(或者如果需要關閉的話)。如果沒有處理,會不會有連接泄漏?如何在Beta測試期間使用SqlDataSource或ObjectDataSource
在此先感謝!
時關閉連接/ datareader,我們發現連接池錯誤消息。因此,我一直在瀏覽代碼,並關閉SqlDataReader對象,無論它們是否處於未關閉狀態。我需要知道的是如何關閉在SqlDataSource或ObjectDataSource標記的SelectStatement屬性中指定的datareader(或者如果需要關閉的話)。如果沒有處理,會不會有連接泄漏?如何在Beta測試期間使用SqlDataSource或ObjectDataSource
在此先感謝!
調用.Dispose()應該處理清理並釋放所有持有的資源,但是.Close() method should be getting called as well when an object is done reading from the reader。
您不需要同時調用Dispose()和Close()。 Dispose()只需調用Close()。你可以檢查DbDataReader的源代碼來驗證這一點。 – Misha 2009-10-17 07:57:23
我的理解是,與SqlDataSource
,連接管理是爲你執行的,你沒有什麼可怕的。
ObjectDataSource
沒有直接與數據庫直接對話,所以它將是安全的 - 只要基礎對象正確地執行其連接和讀取器管理。
正如其他人所提到的,Close()
和using
是您與ObjectDataSource
一起使用的課程的朋友。
我的預感是,如果你已經有效地清理了代碼庫,你可能已經根除了這個問題。
我相信SqlDataSource會處理它自己的連接/閱讀器問題,所以不用擔心。至於你手動連接,我發現在過去的這個模式非常有用:
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
SqlCommand command = connection.CreateCommand();
command.CommandText = ...
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
do
{
while (reader.Read())
{
... handle each row ...
}
} while (reader.NextResult());
}
}
catch (Exception ex)
{
... error handling ...
}
finally
{
if (connection != null && connection.State == ConnectionState.Open)
{
connection.Close();
}
}
}
我同意,爲ObjectDataSource閉幕應由其選擇的方法處理。我的ObjectDataSource Select方法返回一個SqlDataReader。我關心的是......將SqlDataReader返回給用戶界面後,SqlDataReader在關閉時會無用。例如請參閱以下示例代碼。我沒有嘗試過,也不想在這個階段發展。
SqlDataReader MySelectMethod(){
SqlDataReader dr = null;
try{
dr = DBObject.GetDataReader();
return dr;
}
finally{
dr.Close();
}
}
感謝您收到的所有投入!
...........
我的理解是,隨着 的SqlDataSource,連接管理 爲您執行,你必須 有恃無恐。
ObjectDataSource控件不首先聊到 數據庫直接, 所以這將是安全的 - 只要 底層對象正確執行其 連接和讀者管理 。
正如其他人所說,關閉()和 使用您對 你的ObjectDataSource
使用的類的朋友。
這不起作用。由於它在finally塊中,所以在返回發生時會執行close(代碼將退出try塊並最終執行)。 – tvanfosson 2008-10-21 00:43:41
要提高Close()/ Dispose()的性能,請考慮在處理或關閉閱讀器之前在關聯的命令對象上調用Cancel(),特別是當您未達到記錄集的末尾時。
例如:
using (var cmd = ...))
{
using (var reader = (DbDataReader) cmd.ExecuteReader())
{
try
{
ConsumeData(reader); // may throw
}
catch(Exception)
{
cmd.Cancel();
throw;
}
}
}
在這裏,我們不得不在生產環境同樣的問題。
解決了這個問題。首先問題是,我的代碼中沒有使用任何聲明。 (這是幾年前建立的,有一些知識較少)。
然後我試着把SqlDataSource放在using子句中。但是這也沒有幫助。
這裏的訣竅就像tvanfosson和Mischa建議的那樣,把讀者放入使用條款中。這是實際關閉連接的對象。
中等負載時連接數縮小到最小池大小10。
同樣在這裏。我驚訝於有多少開發人員編寫不使用「使用」關鍵字來自動處理對象的代碼(特別是在使用像數據讀取器這樣的東西時)。 – Mun 2008-10-21 00:30:27