Java Web应用程序在缓慢的MySQL查询中停滞不前

我有一个使用
Java servlet编写的Web应用程序.我使用Tomcat 7作为我的servlet引擎,但之前使用过Glassfish并且遇到了完全相同的问题.

有问题的页面有一个“统计”部分,每5分钟更新一次.由于涉及MySQL表的大小,统计信息大约需要30秒.

当我收到页面加载时,我会显示缓存的统计信息.在呈现页面中的所有内容后,我刷新然后关闭输出流.然后我更新统计数据.这样,在页面完全发送之后,用户不必等待约30秒才能加载页面并更新统计信息.

问题是,如果我在运行查询时刷新页面,则在查询完成之前页面不会加载,这意味着尽管初始用户没有任何延迟,但在此之后会有很长的延迟.

为什么应用程序有效停止?即使一个线程仍然忙,Tomcat是否应该能够使用另一个工作线程来处理请求?

谢谢.

最佳答案 可能发生的事情是您的数据在更新过程中被“锁定以进行更新” – 这取决于数据的重新计算方式.

解决此问题的一种好方法是将新计算放入单独的数据区域,然后在完成所有操作后切换到使用新数据.实现此目的的一种方法是使用数据库视图和版本号,如下所示:

create table my_statistics (
  id int not null primary key auto_increment,
  version int not null,
  -- other columns with your data
);

create table stats_version (current_version int); -- holds just one row

create view stats as
select * 
from stats_version v
join my_statistics s on s.version = v.current_version);

将新统计数据放入表中,版本号为current_version 1.完成所有计算后.然后一个简单的更新stats_version set current_version = current_version 1将切换到使用新数据.这最后一个语句只需几毫秒即可执行,因此锁定等待很小.

切换后,您可以删除旧的统计数据以节省空间.

使用“切换”方法进行更新和“原子更新” – 更新“立即完全”发生,因此用户看不到部分更改的数据集.

点赞