Java Web应用程序因MySQL查询缓慢而停滞

汤姆·马泰纳(Tom Marthenal):

我有一个使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章