我已經被賦予了重新編寫用C#編寫的一些庫的任務,以便在啓動完成後沒有分配。沒有分配的.NET DB查詢?
我剛剛找到一個項目,每30秒對OdbcConnection執行一次數據庫查詢。我總是使用.ExecuteReader()創建一個OdbcDataReader。是否有任何模式(如SocketAsyncEventArgs套接字模式)可讓您重新使用您自己的OdbcDataReader?或者其他一些聰明的方式來避免分配?
因爲所有的dbs在工作都是基於Oracle的,而且最後我檢查過了,所以沒有官方的Linq To Oracle提供者,所以我沒有去學習LINQ。但是如果Linq有辦法做到這一點,我可以使用其中一個第三方。
更新:
我不認爲我明確規定了無ALLOC要求的原因。我們有一個關鍵線程正在運行,非常重要的是它不會凍結。這是一個近乎實時的交易應用程序,我們確實發現一些Gen 2收藏的凍結時間高達100 ms。 (我也聽說用C#編寫相同的遊戲)。有一個後臺線程會執行一些合規性檢查並每30秒運行一次。它現在做一個數據庫查詢。查詢速度很慢(大約需要500毫秒才能返回所有數據),但這沒關係,因爲它不會影響關鍵線程。除非工作線程正在分配內存,否則會導致凍結所有線程的GC。
我聽說所有的庫(包括這個)都不能在啓動後分配內存。不管我是否同意,這是簽署支票的人的要求:)。
現在,很明顯有一些方法可以在沒有分配的情況下將數據導入此過程。我可以設置另一個進程並使用套接字將其連接到此進程。新的.NET 3.5套接字被特別優化,根本不使用新的SocketAsyncEventArgs模式進行分配。 (實際上,我們正在使用它們連接到多個系統,並且從不會看到任何GC。)然後有一個預先分配的字節數組,它從套接字中讀取並遍歷數據,沿途不分配任何字符串。 (我不熟悉.NET中其他形式的IPC,所以我不確定內存映射文件和命名管道是否分配)。
但是,如果有一種更快的方法可以在不經歷所有這些麻煩的情況下完成這個無分配查詢,我更喜歡它。
每隔30秒鐘......你會發現分配對這種長時間段的影響非常非常低。 – Dykam 2010-04-10 21:10:30
嗯,沒有分配。首先從數據庫表中刪除所有字符串。當你完成後回來,我們可以解決問題#2到50.你最終必須切換到C++。 – 2010-04-10 21:31:24