gpt4 book ai didi

Java Web 应用程序在缓慢的 MySQL 查询中停止

转载 作者:搜寻专家 更新时间:2023-11-01 03:28:29 27 4
gpt4 key购买 nike

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

相关页面有一个“统计”部分,每 5 分钟更新一次。由于所涉及的 MySQL 表的大小,统计信息大约需要 30 秒才能生成。

当我获得页面加载时,我会显示缓存的统计信息。呈现页面中的所有内容后,我刷新然后关闭输出流。然后我更新统计数据。这样,用户无需等待大约 30 秒来加载页面,并在页面已完全发送后更新统计信息。

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

为什么应用程序实际上停止了? Tomcat 不应该能够使用另一个工作线程来处理请求,即使一个线程仍然很忙吗?

谢谢。

最佳答案

可能发生的情况是您的数据在更新过程中被“锁定以进行更新”——这完全取决于数据是如何重新计算的。

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

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 将切换到使用新数据。最后一条语句只需几毫秒即可执行,因此锁定等待时间很短。

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

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

关于Java Web 应用程序在缓慢的 MySQL 查询中停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7053705/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com