程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#編寫的高並發數據庫掌握拜訪代碼

c#編寫的高並發數據庫掌握拜訪代碼

編輯:C#入門知識

c#編寫的高並發數據庫掌握拜訪代碼。本站提示廣大學習愛好者:(c#編寫的高並發數據庫掌握拜訪代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是c#編寫的高並發數據庫掌握拜訪代碼正文


代碼的感化在於包管在上端緩存辦事掉效(普通來講幾率比擬低)時,構成倒瓶頸,從而可以或許掩護數據庫,數據庫宕了,才是年夜成績(好比影響其他運用)。

假定(非完整准確數據,僅做示例):
每秒支撐10,000,000次查詢(萬萬);
一次讀庫須要耗時:1ms;
修正內存變量須要耗時:0.001ms;
那末:
每秒終究拜訪的數據庫的要求數目 < 1000
其他的9,900,000個要求會前往到其他頁面。這就是為啥許多搶單網站有人可以拜訪,而有人獲得忙碌中頁面的緣由。

微不雅到1ms來看,在currentValidSessionID == -1的時光是 1ms,從而均勻會有10000筆記錄湧入。
currentValidSessionID從-1變成其他值的時光為0.001ms,這個時光內,


  lock (databaseDoor)
  {
    // now there is only one request can reach below codes.
    if (currentValidSessionID == -1)
    {
      currentValidSessionID = currentRequest.SessionID;
    }
  }

均勻會有 10000×0.001=10筆記錄會履行到上述這段代碼,操作體系會為鎖構成期待序列。
那末我們的目的是,每毫秒只許可一次讀庫(由於其他運用也會應用),所以我們只願望這進入的10條,終究只要一條可以或許持續進步。
那末這就是


if (currentValidSessionID == -1)
{
}

的感化了。再次停止一次斷定,進入原子掩護隊列的要求,也只要一個可以或許持續。

一點思慮:
其實關於一個主頻能上N GHz的辦事器來講,一個內存數賦值給另外一個內存數據就是1~4條指令(均勻2條,兩次MOV操作),也就是2/N ns時光,而不是我們上述假定的 1000ns(0.001ms)。其實不消原子,我們曾經可以把千億級要求的拜訪數掌握在個位數。
不外一個架構師,假如可以用一個99.99%平安的計劃,就相對不消99.9%。 SO。


public static long currentValidSessionID = -1;
public static object databaseDoor = new object();
void readDatabase(Request currentRequest)
{
    // use currentValidSessionID to filter out other requests came in during the execute time gap
    if (currentValidSessionID == -1)
    {
        // use object-lock to filter out other requests came in during the variable change time gap.
        lock (databaseDoor)
        {
            // now there is only very little number of requests can reach below codes.
            if (currentValidSessionID == -1)
            {   // now there will be only one request can access the database
                currentValidSessionID = currentRequest.SessionID;
            }
        }
    }
    if (currentValidSessionID == currentRequest.SessionID)
    {   // here is the one !
        try
        {
            // use transaction to guarantee the execute time to void block
            // access database codes go here
        }
        catch()
        {
            // exception codes go here
        }
        finally
        {
            currentValidSessionID = -1;  // recover to original state
        }
    }
}

以上就是本文所述的全體內容了,願望對年夜家進修C#的高並發編程可以或許有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved