UPDATE混合ADO.NET和LINQ-TO-SQL不好?我的數據層不工作
由於馬蒂亞斯低於所指出的,這個確切的問題已經被報告並解決這裏: ASP.NET-MVC (IIS6) Error on high traffic: Specified cast is not valid
原帖
這可能是太特定一個調試問題將發佈在這裏,但我仍然發佈它的希望,它產生了一個解決方案,其他人覺得有用。
我有一個web應用程序,在中等負載下運行 - 也許每秒5個請求。它有一些較老的代碼通過ADO.NET + DataReaders與Sql進行交流,並且至少在五年內一直使用這種相同的技術。它還有一些使用LINQ-to-SQL的新代碼。兩種技術都使用相同的連接字符串來最大化連接池重用。
最近我遇到這些症狀描述的非常怪異的行爲:
一切都會很好地工作一天左右,然後突然每次調用(或幾乎所有的調用)數據層(包括ADO.NET和LINQ)返回的數據不能被我的代碼解析 - 我會得到像「無法將類型爲'System.Int32'的對象類型'System.String'的異常。」或「序列不包含元素」或「IndexOutOfRangeException」或「讀取器關閉時調用Read的無效嘗試」。有趣的是,我從來沒有從SqlCommand.ExecuteReader()或DataReader.Read()中獲取異常 - 只有當我嘗試解析返回的IDataRecord時纔會出現異常。
我能夠通過重新啓動Sql或IIS來臨時解決問題。幾個小時後它又回來了。
我試過監視連接池中的連接數,它永遠不會超過3左右。當然從未超過100.
我沒有在事件日誌中發現任何指示Sql或IIS出現問題的東西。
驅動器有9 GB的空白空間。
我懷疑壞RAM,但服務器正在使用註冊的ECC DIMM。
我有其他的應用程序使用ADO.NET,工作正常,永遠不會出現問題。
當問題發生時,我可以通過Management Studio調用完全相同的存儲過程,並返回正確的預期結果。
這裏是我的ADO.NET訪問模式:
using (var dbConn = Database.Connection) // gets already-open connection
{
var cmd = new SqlCommand("GetData", dbConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@id", id);
SomeDataObject dataObject = null;
var dr = cmd.ExecuteReader(CommandBehavior.CloseConnection | CommandBehavior.SingleRow);
if (dr.Read())
dataObject = new SomeDataObject(dr);
dr.Close();
return dataObject;
}
理論:有沒有可能是ADO.NET的代碼和LINQ的一部分代碼的另一部分組合,都使用來自連接池的相同連接,是否有一些奇怪的副作用?
問:有沒有我應該嘗試的調試步驟?任何可能有幫助的事件日誌或性能指標?
我用Rob的tutoaial作爲起點,在他從在SqlRepos中創建DC之後,開始使用Singletons來存儲DC實例後,我遇到了同樣的問題。當我/我們通過StructureMap移動到DI並在請求週期內在IoC容器中回收DC時,問題就消失了。仍然不處理DC,只是試圖保持它自然想要生存的時間。最好讓這些輕量級實例自己處理(它們不打開數據庫連接)。如果你試圖自己處理,你會遇到線程問題(這是什麼)。 – 2009-11-09 10:06:15