由于建立连接比较耗资源,所以建议尽量使用长连接,但是使用长连接后,MySQL 占用内存涨得特别快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 MySQL 异常重启了。
处理过程如下:
用户发送请求到 tomcat ,通过 tomcat 链接池和 mysql 连接池建立连接,然后通过连接发送 SQL 语句到 MySQL; MySQL 有一个单独的监听线程,读取到请求数据,得到连接中请求的SQL语句; 将获取到的SQL数据发送给SQL接口去执行; SQL接口将SQL发送给SQL解析器进行解析; 将解析好的SQL发送给查询优化器,找到最优的查询路劲,然后发给执行器; 执行器根据优化后的执行方案调用存储引擎的接口按照一定的顺序和步骤进行执行。 举个例子,比如执行器可能会先调用存储引擎的一个接口,去获取“users”表中的第一行数据,然后判断一下这个数据的 “id”字段的值是否等于我们期望的一个值,如果不是的话,那就继续调用存储引擎的接口,去获取“users”表的下一行数据。 就是基于上述的思路,执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL 语句的执行计划,大致就是不停的更新或者提取一些数据出来。