2009-07-07 69 views
3

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的新代碼。兩種技術都使用相同的連接字符串來最大化連接池重用。

最近我遇到這些症狀描述的非常怪異的行爲:

  1. 一切都會很好地工作一天左右,然後突然每次調用(或幾乎所有的調用)數據層(包括ADO.NET和LINQ)返回的數據不能被我的代碼解析 - 我會得到像「無法將類型爲'System.Int32'的對象類型'System.String'的異常。」或「序列不包含元素」或「IndexOutOfRangeException」或「讀取器關閉時調用Read的無效嘗試」。有趣的是,我從來沒有從SqlCommand.ExecuteReader()或DataReader.Read()中獲取異常 - 只有當我嘗試解析返回的IDataRecord時纔會出現異常。

  2. 我能夠通過重新啓動Sql或IIS來臨時解決問題。幾個小時後它又回來了。

  3. 我試過監視連接池中的連接數,它永遠不會超過3左右。當然從未超過100.

  4. 我沒有在事件日誌中發現任何指示Sql或IIS出現問題的東西。

  5. 驅動器有9 GB的空白空間。

  6. 我懷疑壞RAM,但服務器正在使用註冊的ECC DIMM。

  7. 我有其他的應用程序使用ADO.NET,工作正常,永遠不會出現問題。

  8. 當問題發生時,我可以通過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的一部分代碼的另一部分組合,都使用來自連接池的相同連接,是否有一些奇怪的副作用?

問:有沒有我應該嘗試的調試步驟?任何可能有幫助的事件日誌或性能指標?

回答

1

UPDATE

我發現有人在SO誰顯然有同樣的問題

ASP.NET-MVC (IIS6) Error on high traffic: Specified cast is not valid

它是在回答ATLE expained

原帖

下的負載時,我已經看到了一個LINQ到SQL應用程序的問題。我使用了MVC - 店面 羅布康納利,所以我想很多人使用這種應用程序佈局。 在負載很小的情況下,應用程序可以很好地工作,但在中等負載情況下會出現奇怪的錯誤,就像您描述的那樣。

我懷疑這是存儲數據庫上下文的問題。

在我的情況下很容易重現:我使用jmeter並有5個線程,每個線程每秒有幾個請求(我想是20個)。我真的需要加載來自多個線程。

所以我的建議是:嘗試通過用Jmeter創建一些負載(不適合ASP.NET,但適用於ASP.NET MVC)或應用程序中心測試來重現開發中的錯誤。

+0

我用Rob的tutoaial作爲起點,在他從在SqlRepos中創建DC之後,開始使用Singletons來存儲DC實例後,我遇到了同樣的問題。當我/我們通過StructureMap移動到DI並在請求週期內在IoC容器中回收DC時,問題就消失了。仍然不處理DC,只是試圖保持它自然想要生存的時間。最好讓這些輕量級實例自己處理(它們不打開數據庫連接)。如果你試圖自己處理,你會遇到線程問題(這是什麼)。 – 2009-11-09 10:06:15

2

20次打開連接,每秒5次是我的一面紅旗。我們已經接近100次點擊/秒並且圍繞10個連接懸停。

內存使用情況如何?它高嗎?

我懷疑你在釋放資源時遇到問題。我仍然對LINQ to SQL很感興趣,並且我也對ADO.NET有很長的積極期待。我不知道你是否錯過了LINQ to SQL模式,它可以清理連接等。

試試這個 - 你可以在應用程序中隔離LINQ的ADO.NET代碼嗎?如果您只進行ADO.NET調用,內存,連接數等會發生什麼情況?然後添加LINQ的東西,看看它是如何影響它的。

資源問題似乎'起步晚',因爲他們需要一段時間積累。

+0

經過進一步檢查,這20個連接包括與Sql的所有連接(來自Reporting Services,另一個ASP.NET應用程序等)。實際上,該應用程序實際上只有〜3個連接。我已經修改了這個問題來反映這一點。內存使用情況似乎並不是很高(大約250 MB,並且緩存了所有內容)。 – Mike 2009-07-07 20:24:00