今天下午,我们搭建了测试服务器,客户的两个管理人员,正在不停的添加数据,突然说页面打开错误,同时添加数据很慢,这时通过监控数据库服务器发现sql语句发现执行正常,但是客户的页面打不开。这时由于JBOSS服务器和数据库服务器都是放在一个服务器上,这时我看看内存和CPU,发现CPU占用100%,一般都在98%以上。这时很奇怪了,sql语句执行都比较快,为何内存占用98%居高不下,而且服务器还是中午重新启动过了。
这时我们关闭JBOSS服务器,这时cpu的一下下降到了5%左右。
这时继续让业务人员继续录入数据,不过多久,又出现页面打不开的情况,这时没办法,让用户停止添加数据。通过sql监控发现也是执行时间正常,这时通过两个方法来监控数据库。
1,SQL server 2005 里的Profiler监控正在执行什么语句
2,同时通过DMVs监控数据库执行了语句次数。
上面两个图是在业务人员停止录入数据后,所有人停止操作业务系统情况下,间隔几分钟的数据库前后执行语句次数。同时通过SQL Server Profiler监控发现数据库还在不停的执行sql语句,但是这时业务人员已经全部停止操作业务系统了。
为何还是在执行JBOSS 服务器提交过来的SQL语句。
这时我想起来,在Eclipse中调试程序时,发现设置了一个断点,没执行完,但是在前台还是可以操作的。这时一下子就明白很多了。
前提
1,在这里我还特意设定了为快照隔离级别,保证读写不互相堵塞情况下发生的。
2,Insert表有6万次表中就只有两个索引,一个单列聚集索引(32位字符),另一般索引(32位字符)
3,客户用户只有2个人同时频繁操作一个模块。
原因:
原来是java中的Servlet造成的,由于Servlet是多线程的。一个请求就是一个线程,这时如果用户操作的比较频繁,而且这时涉及到SQL语句比较多(虽然很短),但在SQL Server还是一条一条执行的。一下很多请求过来,JBOSS服务器,堆积了很多请求,都在竞争的象SQL Server提交。这时我们发现其实业务操作人员没操作,但数据库还是在不停的执行由JBOSS提交过来的请求的。
解决办法:
这种情况的确出在设计阶段,就应该检测修改,现在通过优化数据库是无能为力,只能通过改程序(或修改业务逻辑等),这也反映了系统的高并发差。
总结:
1,一个好的系统的确是设计和写出来的,而不是建立诸如几个索引提高的。
2,在高并发情况下,数据库执行的时间越短越好。(减少执行时间)
3,能通过一条SQL语句取出的数据,绝不能使用两条以上的SQL语句去取数据. (减少交互次数)
4,特别是在高并发情况下,注意使用绑定变量(减少分析和获取执行计划时间)