我有一个使用Java servlets编写的web应用程序。我使用Tomcat7作为我的servlet引擎,但以前使用过Glassfish,遇到了完全相同的问题。
有问题的页面有一个“统计”部分,每5分钟更新一次。由于涉及的MySQL表的大小,统计信息需要大约30秒才能生成。
当我加载页面时,我会显示缓存的统计信息。在渲染完页面中的所有内容之后,我刷新然后关闭输出流。然后我更新统计数据。这样,在页面完全发送之后,用户不必等待大约30秒来加载页面和更新统计信息。
问题是,如果我在运行查询的同时刷新页面,页面直到查询完成才会加载,这意味着尽管初始用户没有任何延迟,但在此之后会有很长的延迟。
为什么应用程序实际上处于停滞状态?Tomcat是否应该能够使用另一个工作线程来处理请求,即使其中一个线程仍然很忙?
谢谢。
发布于 2011-08-13 22:57:05
可能发生的情况是,当更新发生时,您的数据被“锁定以进行更新”-这取决于数据是如何重新计算的。
解决此问题的一个好方法是将新计算放入一个单独的数据区,然后在所有计算完成后切换到使用新数据。实现这一点的一种方法是使用数据库视图和版本号,如下所示:
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的表中。然后,一个简单的update stats_version set current_version = current_version + 1
将切换到使用新数据。最后一条语句的执行时间只有几毫秒,因此锁定等待时间很短。
切换后,您可以删除旧的统计数据以节省空间。
使用“切换”方法使得更新和“原子更新”-更新“立即和完全”发生,因此用户看不到部分更改的数据集。
https://stackoverflow.com/questions/7053705
复制相似问题