0%

MySQL 核心监控监控命令全解析:诊断与优化必备工具

MySQL 提供了丰富的 show 命令用于监控数据库状态、索引、进程、日志等关键信息,是数据库诊断、性能优化和故障排查的核心工具。本文系统整理常用监控命令及其应用场景,帮助快速运维运维运维和开发人员快速掌握数据库运行状态。

索引与表信息监控

1. show index from <table>

  • 功能:展示指定表的所有索引详情,包括索引名称、类型、字段、基数(cardinality)等。

  • 示例:

    1
    show index from user;
  • 关键输出:

    • Key_name:索引名称(PRIMARY 表示主键)。
    • Seq_in_index:字段在索引中的位置(最左前缀原则依据)。
    • Cardinality:索引基数(估算的唯一值数量,接近表行数表示索引选择性好)。
  • 用途:分析索引有效性,识别冗余索引或低选择性索引(如性别字段的索引)。

2. show table status

  • 功能:展示当前数据库中所有表的元数据(如存储引擎、行数、大小等),可加 like 筛选特定表。

  • 示例:

    1
    2
    3
    4
    5
    -- 查看所有表状态
    show table status;

    -- 查看指定表状态
    show table status like 'user%';
  • 关键输出:

    • Engine:表使用的存储引擎(如 InnoDB、MyISAM)。
    • Rows:表中行数(InnoDB 为估算值)。
    • Data_length:数据占用空间(字节)。
    • Index_length:索引占用空间(字节)。
    • Auto_increment:自增字段的下一个值。
  • 用途:评估表大小、判断存储引擎是否合理、监控自增 ID 是否即将耗尽。

进程与线程监控

3. show [full] processlist

阅读全文 »

Druid 连接泄露检测与处理:保障连接池资源安全

数据库连接泄露是后端开发中常见的隐蔽问题,表现为连接池连接被耗尽、应用响应缓慢甚至超时。Druid 连接池内置了连接泄露检测功能,可自动识别并回收长时间未归还的连接。本文将详细解析 Druid 连接泄露检测的原理、配置方法及实战排查技巧,帮助你及时发现并解决连接泄露问题。

连接泄露的危害与成因

什么是连接泄露?

连接泄露指应用从连接池获取连接(getConnection())后,未正常关闭(close()),导致连接长期占用连接池资源,无法被其他请求复用。

泄露的危害

  • 连接池耗尽:连接泄露累积到一定程度,会导致 activeCount 达到 maxActive 上限,新请求无法获取连接,出现 TimeoutException
  • 性能下降:数据库连接是稀缺资源,泄露会导致连接池频繁创建新连接,增加数据库和应用服务器负担;
  • 业务中断:严重时所有请求阻塞,应用完全无法响应。

常见泄露成因

  • 代码缺陷:未在finally块中关闭连接,或因异常导致close()语句未执行;
1
2
3
4
5
6
7
8
// 错误示例:未在 finally 中关闭连接  
Connection conn = dataSource.getConnection();
try {
// 业务逻辑(若抛出异常,conn.close() 不会执行)
} catch (SQLException e) {
e.printStackTrace();
}
conn.close(); // 若上述代码抛异常,此处不会执行
  • 框架漏洞:ORM 框架(如 MyBatis、Hibernate)配置不当,导致连接未自动释放;

  • 长事务:连接被用于长时间运行的事务(如批量处理),未及时释放。

Druid 连接泄露检测机制

Druid 提供 removeAbandoned 系列配置,通过定时扫描连接池中的活跃连接,识别并回收 “超时未归还” 的连接,从根源上缓解泄露问题。

阅读全文 »

页面实时获取数据方案全解析:从轮询到 WebSocket 与 SSE

在实时交互场景中(如即时聊天、实时数据监控、在线协作工具),前端需要实时获取后端数据。传统的 “请求 - 响应” 模式无法满足实时性需求,因此衍生出轮询、WebSocket、SSE 等技术方案。本文将详细解析三种方案的原理、实现、优缺点及适用场景,帮助开发者选择合适的实时数据获取方式。

方案一:轮询(Polling)

轮询是最直观的实时数据获取方式,通过前端定时发送请求,后端返回最新数据,实现 “准实时” 效果。

原理

  • 前端:使用定时器(如setInterval)每隔固定时间(如 1 秒)向后端发送 HTTP 请求;
  • 后端:收到请求后,立即返回当前最新数据(无论是否有更新);
  • 特点:基于 HTTP 协议,无需特殊协议支持,实现简单。

实现示例

(1)前端代码
1
2
3
4
5
6
7
8
9
10
// 每1秒发送一次请求
setInterval(() => {
fetch("/api/realtime-data")
.then(response => response.json())
.then(data => {
console.log("最新数据:", data);
// 更新页面UI
})
.catch(error => console.error("请求失败:", error));
}, 1000);
(2)后端代码(Java Servlet)
1
2
3
4
5
6
7
8
9
10
@WebServlet("/api/realtime-data")
public class RealtimeDataServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("application/json;charset=UTF-8");
// 模拟实时数据(如当前在线人数、温度等)
String data = "{\"onlineUsers\":" + (int)(Math.random() * 100) + ", \"timestamp\":" + System.currentTimeMillis() + "}";
response.getWriter().write(data);
}
}

优缺点

优点:
  • 实现简单:无需特殊协议或后端配置,前端仅需定时器 + HTTP 请求;
  • 兼容性好:支持所有浏览器和服务器,无技术门槛。
缺点:
  • 资源浪费:无论数据是否更新,前端都会定时发送请求,无效请求占比高(如数据 10 秒才更新一次,1 秒一次的请求有 9 次无效);
  • 实时性差:数据更新延迟取决于轮询间隔(间隔 1 秒则最大延迟 1 秒);
  • 服务器压力大:高频请求会占用大量连接和带宽资源。

适用场景

阅读全文 »

Java NIO 路径监听:使用 WatchService 监控文件系统变化

Java NIO 提供的 WatchService 是一种高效的文件系统事件监听机制,可实时监控目录下的文件 / 文件夹创建、修改、删除等操作,类似于 ZooKeeper 的事件监听,但专注于本地文件系统。本文将详细解析 WatchService 的工作原理、核心 API 及实战案例,帮助实现可靠的文件系统监控功能。

WatchService 核心概念

WatchService 基于操作系统的文件系统通知机制(如 Linux 的 inotify、Windows 的 ReadDirectoryChangesW),通过以下组件协同工作:

组件 作用描述
WatchService 监听器服务,负责接收和管理文件系统事件。
Watchable 可被监听的对象(如 Path),通过 register() 方法注册到 WatchService
WatchKey 事件的载体,每个注册操作返回一个 WatchKey,用于获取事件和重注册监听。
WatchEvent 具体的事件对象,包含事件类型(如创建、修改)和触发事件的文件路径。
StandardWatchEventKinds 标准事件类型常量(如 ENTRY_CREATEENTRY_MODIFYENTRY_DELETE)。

核心事件类型

StandardWatchEventKinds 定义了三种常用事件类型:

阅读全文 »

Spring MVC 全流程详解:从请求到响应的完整链路

Spring MVC 作为分层架构的 Web 框架,其核心价值在于通过前端控制器(DispatcherServlet) 统一调度所有组件,将 HTTP 请求转化为业务逻辑处理与响应生成的标准化流程。从 “请求接收→组件协作→响应返回” 三个阶段,拆解 Spring MVC 的全流程执行逻辑,并结合核心组件(如 HandlerMapping、HandlerAdapter、ViewResolver)的作用,让你彻底理解每一步的底层原理。

Spring MVC 核心组件回顾

在解析全流程前,先明确参与流程的核心组件及其职责,这是理解流程的基础:

组件名称 核心职责
DispatcherServlet 前端控制器,全流程的 “总指挥”:接收请求、调度其他组件、返回响应
HandlerMapping 处理器映射器:根据请求 URL 找到对应的 Handler(Controller 方法)及拦截器,封装为 HandlerExecutionChain
HandlerAdapter 处理器适配器:适配不同类型的 Handler,调用其业务逻辑(如反射调用 @RequestMapping 方法)
Handler(Controller) 业务处理器:执行具体的业务逻辑,返回 ModelAndView(模型数据 + 视图名)或直接返回 JSON
HandlerInterceptor 拦截器:在请求处理的不同阶段(preHandle/postHandle/afterCompletion)执行横切逻辑(如权限校验、日志记录)
ViewResolver 视图解析器:将逻辑视图名(如 “user/list”)解析为具体的 View 对象(如 JSP、FreeMarker 模板)
View 视图:渲染模型数据到视图模板,生成 HTML 响应(如 JSP 引擎解析 EL 表达式)
HandlerMethodArgumentResolver 参数解析器:将 HTTP 请求数据(URL 参数、请求体、请求头)绑定为 Controller 方法参数
HttpMessageConverter 消息转换器:处理请求体 / 响应体与 Java 对象的转换(如 JSON 与 User 对象互转)

Spring MVC 全流程拆解(11 个核心步骤)

以下流程以 “用户访问 http://localhost:8080/user/list 获取用户列表” 为例,结合组件协作详细解析每一步:

阅读全文 »