我有一个使用Java servlet编写的Web应用程序.我使用Tomcat 7作为我的servlet引擎,但之前使用过Glassfish并且遇到了完全相同的问题.有问题的页面有一个“统计”部分,每5分钟更新一次.由于涉及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将切换到使用新数据.这最后一个语句只需几毫秒即可执行,因此锁定等待很小.
切换后,您可以删除旧的统计数据以节省空间.
使用“切换”方法进行更新和“原子更新” – 更新“立即完全”发生,因此用户看不到部分更改的数据集.
本文标题为:Java Web应用程序在缓慢的MySQL查询中停滞不前
基础教程推荐
- Spring事件监听器之@EventListener原理分析 2023-08-07
- SpringSecurity注销设置的方法 2023-05-14
- SpringBoot整合SpringSecurity实现认证拦截的教程 2023-07-15
- Mybatis返回Map数据方式示例 2022-12-04
- Spring Boot整合持久层之JPA多数据源 2023-04-12
- Java easyExcel的复杂表头多级表头导入 2023-01-18
- JSP 开发之Servlet解决网页缓存问题 2023-07-30
- CompletableFuture 异步编排示例详解 2023-05-09
- Spring Boot实现登录验证码功能的案例详解 2023-04-07
- Java 不同版本的 Switch语句 2022-12-16