c#编写的高并发数据库控制访问代码
来源: 阅读:775 次 日期:2015-04-01 15:26:30
温馨提示: 小编为您整理了“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

}

}

}

更多信息请查看IT技术专栏

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map