先从一个列子来说:我们经常听到说某某网站的每天访问用户数有几十,几千,几百万甚至上千万,同时在线用户数有几万,几十万的。
从这个列子我们来分析,数据库并发的概念。
首先,这儿有两个名词,一个是每天访问的用户数,一个是同时在线用户数。那么这两个数据是不是就是数据库的并发数呢?oracle数据库的一个相对比较稳定的并发数是200左右,也就是说一台比较好的服务器,并发数在200时,还能够正常的运行,不会死机。由此可见,上面两个数据都不是并发数。
我们再来了解这两个名词的含义。
访问用户数:一个大型的网站,每天肯定是有很多人访问的,每当有人进入这个网站时,访问数就会加一,这就造成了访问数很大。有人访问,进入这个网站,肯定就是要查询数据库的,除非是纯静态的网站,一人访问就会连接一次数据库,从里面拿出数据,这个时候就有并发了,并发数为1.如果还有人在此时此刻也访问了,注意,此时此刻是指连接数据库的时间,那么并发再累加。但是,我们要明白一个事实,能够做到在同一时刻访问数据库,是一件很困难的事情,总得有个时间的先后顺序,但也不是没有,只是数量不多而已,(比如,访问数据库的信息量比较大,第一个人还没有断开连接,又有人来访问了,就造成了并发)一般也就在10以下,这个数据大多数服务器都能接收,所以造成并发过高的机率就很低了。
在线用户数:指这个系统在某个时间点有多少个用户正在登陆,登录也就一瞬间的事儿,和访问网站差不多,他登陆并不意味着要干啥事,可能在发呆,也可能在嗑瓜子打游戏。
并发指同时刻或同一秒钟有多少个用户正在对这个系统做操作并产生数据交互。比如论坛,一个用户在写帖子的时候,没有和服务器发生数据交互,这时并发数+0,在他提交的那一瞬间,并发数+1;用户在打开帖子的时候,并发数+1,因为他需要从服务器读数据,浏览帖子时,并发数+0,因为数据已经下载到客户端。
对于数据库或中间层来说,上面的并发被转译为活动连接数。一个存在的连接不能称为并发,因为它可能是空闲的,通过这个连接操作数据才算并发数
对于Oracle数据库来说,一个并发数指一个状态为Active的session,总用户并发数指状态为Active的非后台Session的个数,你可以从gv$session中查到数据。
那么怎么来防止并发呢?在程序上我们是可以控制的,比如spring,连接池就是一个很好的东东,连接池里有多的,就给你用,用完了,你就等着吧。当然等的时间不会太久,基本感觉不出来,但是,访问的数据过大时,可能会给你造成一种自己网速慢的假象,其实是被人还没下载完呢!