客户对一些反应慢的页面做了多个请求的并发测试,发现数据库明显受到这些请求的影响,发现一些查询数据库的sql查询时间越长越容易引起数据库的CPU和内存消耗。
这也是我一直怀疑的问题。当数据库还没有返回结果之前,不停的发送请求会不会对数据库有影响?所有的数据库查询工具都是只有返回结果了执行按钮才能使用。 这就是应用程序层面的问题了,应用程序对客户任何请求都做出响应,并实时查询数据库。应用程序应该控制在用户请求了一次之后,如果数据库还没有返回结果应该把客户的之后的请求视为无效。否则用户的恶搞肯定容易引起问题。我想其他的大型系统都做了这样的控制,我们的系统还没进行这样的处理,真是汗颜啊!
方法可以采用两种页面级别的和后台级别的。页面在请求没有得到响应之前有个保护层,不让做任何操作。这种方法可以起到作用,但对于用户刷新浏览器的操作就不能起作用了,所以最根本的解决办法是在后台程序控制。采用token令牌,也就是根据当前用户的session,在每个url中会带上sessionid,唯一的,如果是相同的sessionID,则不会再次提交到后台,否则会提交到后台。