2017-06-02 57 views
0

我有一個開始大量使用的大型企業Web應用程序。最近我注意到,我們正在進行許多數據庫調用,例如用戶權限,訪問權限,配置文件信息的一般位。大型應用程序 - 如何處理數據訪問

從我在Azure上可以看到的數據來看,我們每小時平均查看50,000 db查詢。

我們使用Linq通過DevExpress XPO ORM進行查詢。現在其中一些是連接,但大多數都是簡單的1表查詢。

是否不斷觸碰數據庫是訪問此類信息的最佳方式?我們是否有辦法卸載數據庫工作,因爲這些信息中的一些永遠不會改變?

在此先感謝。

+1

您的問題是非常廣泛和不確定的。我們無法瞭解您的設置,所以不能提出改進建議。即使*如果*你提供的這個問題太廣泛了,因爲有幾十個優化機會。此外,你認爲「大量使用」和「大量數據庫調用」可能是相關的。特別是它不是Linq *或*存儲過程,它也可以是一個加法。這兩者都沒有什麼區別,它們完全取決於你如何使用它們。 – HimBromBeere

+0

謝謝隊友,對不起,問題是模糊的。我已經重新措辭,希望它更清楚。 – bExplosion

+1

每小時50K查詢並不大。標準指導適用。不要認爲數據庫很慢,它始終是您的代碼。使用適當的模式,索引。不要加載你不想要的東西。不要使用ORM進行報告。使用樂觀併發。不要使用事務,因爲有人誤解了「每次請求事務」的含義。 –

回答

2

讓我們開始對此進行透視。一小時內3600秒,每秒鐘少於20次操作。在任何測量中都很低。

也就是說,例如緩存用戶權限,例如30秒或一分鐘,沒有任何問題。

通常嘗試緩存不在您的代碼中,但在前面 - ASP.NET輸出緩存和甜甜圈緩存是大多數忽略但仍然最有效的概念。

http://www.dotnettricks.com/learn/mvc/donut-caching-and-donut-hole-caching-with-aspnet-mvc-4

有更多的信息。然後忽略所有的大數字並運行一個分析器 - 看看你真正的重量級玩家是什麼(可能在每個頁面上都使用這些權限)。把它放到一個子系統中並緩存它。假設你可以將它預先加載到asp.net子系統中的用戶標識對象中 - 你的代碼不應該碰到頁面中的數據庫,所以緩存在asp.net中的一些過濾器中是孤立的。

措施。確保你的SQL很聰明 - EF和LINQ導致非常愚蠢的SQL,因爲人們太懶惰了。避免實例化完整的對象只是爲了拋棄它們,只問你需要的字段。確保你的指數是有效的。當你開始有一個真正的問題(測量)時回來。

但是舊的規則是:緩存提前。而且LINQ優化在後面還相當遠。

+0

提到LINQ和連接的問題表明ORM已經存在問題組態。我還會添加'不要使用事務,因爲您認爲樂觀併發是棘手的''並且'忘記每個請求的事務,它並不意味着數據庫事務'。這兩個足以使寫得不好的ORM代碼的行爲比VB6和ADO代碼差幾個數量級 –

+0

只是對問題做了一個快速更改,實際上我們並沒有使用事務。我使用了錯誤的詞:) – bExplosion

+0

謝謝湯姆,我將與分析一起研究這一點。 – bExplosion

0

爲了從數據庫中獲取用戶特定的信息,如配置文件,訪問等,而不是爲每個請求提取它,最好在登錄時獲取一次信息並保持會話。這應該減少您與數據庫的交易

相關問題