我有一个使用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。完成所有计算后。然后,一个简单的方法update stats_version set current_version = current_version + 1
将切换为使用新数据。最后一条语句只需执行毫秒,因此锁定等待时间很小。
切换后,您可以删除旧的统计信息以节省空间。
使用“切换”方法进行更新和“原子更新”-更新“立即且完全”发生,因此用户看不到部分更改的数据集。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句