2013-04-06 65 views
0

我有一個應用程序,我需要多次查詢SQL Server CE數據庫,通常是針對相同的數據。該數據庫有許多表,有意增加將來表的數量,所以沒有什麼固定的。將SQL Server CE數據庫加載到內存中

這個過程非常慢,所以我需要一種方法將整個數據庫轉儲到內存中,然後在那裏執行查詢。查詢將會非常簡單(與從表Y中獲取ID爲X的記錄相同)。

我正在考慮一個DataTable,但我有很多表,所以這是行不通的。我也在考慮使用LINQ,但每個表格都非常不同,我不想每次都手寫一個新對象(並且.dbml文件不會與SQL Server CE一起工作 - 請參閱圖)。

任何其他解決方案?

+0

請提供一些示例來幫助支持此問題。我幾乎將VTC視爲*本地化*,但我認爲在一些工作中這可能是一個很好的問題。 – Yuck 2013-04-06 16:49:00

+0

什麼樣的例子?一般的問題(將整個sqlce數據庫轉儲到內存中以使其工作更快)在我看來並不太狹窄。 – Haedrian 2013-04-06 16:52:20

+0

在這種情況下,我認爲它更適合於DBA.SE,因爲這是一個服務器級別的優化。這個問題本質上是,*我如何在內存*中創建SQL Server CE緩存結果。 – Yuck 2013-04-06 17:03:20

回答

0

我最終解決它的方法如下。

我保留一個字典,將表名映射到數據表。

每當我嘗試訪問DataTable,我都會搜索名字是否在字典中。

public static DataTable GetDataTable(string tableName) 
    { 
      lock (lockMe) 

      { 
        if (!dictionary.Keys.Contains(tableName)) 
        { 
         ReadTableIntoMemory(tableName); 
        } 

        return dictionary[tableName]; 
      } 

    } 

如果它們不存在,我懶洋洋地讀取整個表到內存(使用select *和數據表),並把它添加到字典中。

該解決方案適用於我的情況,但它可能作爲一般解決方案過於具體。

+0

這不是線程安全的。如果你採取這種方法,你應該使用'懶惰' – Yuck 2013-04-06 17:04:24

+0

哦對。我的功能不需要線程安全性,但我會編輯後代的答案。 – Haedrian 2013-04-06 17:05:38

+0

這也不處理更新或刪除。如果這些都不會發生,爲什麼你會使用'DataTable'?爲什麼不在開始時將所有內容加載到字典中? – 2013-04-06 19:48:08

相關問題