数据库泄露导致信息泄露_数据库经历的五个阶段

数据库泄露导致信息泄露_数据库经历的五个阶段前言最近用了公司某框架,部署到现场后,现场运维开始维护现场数据,在不断操作的过程中,系统崩溃,查看后台日志,druid连接池已经获取不到连接。于是开始了排查之旅。在此记录。排查开始首先后台的报错

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

最近用了公司某框架,部署到现场后,现场运维开始维护现场数据,在不断操作的过程中,系统崩溃,查看后台日志,druid连接池已经获取不到连接。于是开始了排查之旅。在此记录。

排查开始

首先后台的报错是这样的。

exception=org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 10, maxActive 10

第一反应maxActive设置的数量太少了。于是改为100。重新启动,并再次操作大量数据。发现过了一段时间100个也满了。

此时问题不简单了。看来是有代码用了程序连接后,没有释放。

接下来开始确认原因到底是不是有没有释放。

在项目中使用的druid连接池。druid连接池是自带图形化监控工具的。于是开始在项目中配置,启动druid连接池。

import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DruidConfig {

   @Bean
   public ServletRegistrationBean statViewServlet(){
      ServletRegistrationBean srb =
         new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
      //设置控制台管理用户
      srb.addInitParameter("loginUsername","root");
      srb.addInitParameter("loginPassword","root");
      //是否可以重置数据
      srb.addInitParameter("resetEnable","false");
      return srb;
   }

   /**
    * 注册FilterRegistrationBean
    * @return
    */
   @Bean
   public FilterRegistrationBean druidStatFilter() {
      FilterRegistrationBean bean = new FilterRegistrationBean(new WebStatFilter());
      //添加过滤规则.
      bean.addUrlPatterns("/*");
      //添加不需要忽略的格式信息.
      bean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
      return bean;
   }
}

重新启动后,访问:localhost:8081/druid。这个路径有人大概会怀疑如果我是通过网关管理的微服务框架,需要通过网关转发访问吗?其实大可不必,通过网关也可以,也是跳转到直接访问的地址。

进入访问地址,跳转到如下的登录界面。

数据库泄露导致信息泄露_数据库经历的五个阶段

输入刚才在代码中配置的用户名和密码,则可以成功进入。
数据库泄露导致信息泄露_数据库经历的五个阶段

我们此时要点击数据源,去关注建立的逻辑连接数和关闭的逻辑连接数,关键的指标在这里,如果连接池的开启和关闭是正常的,那么二者的值应该是相等的。

数据库泄露导致信息泄露_数据库经历的五个阶段

再看看此时的活跃连接数

数据库泄露导致信息泄露_数据库经历的五个阶段

为0,此时正常,因为还没有进行操作。

接下来开始对之前的操作进行复现,锁定具体的操作。重复之前现场运维所做操作。

通过不断的点击功能,缩小功能范围,最终发现,只要点击左侧树,就会造成逻辑打开连接和逻辑关闭次数不一致。

数据库泄露导致信息泄露_数据库经历的五个阶段

活跃连接数也到了二者之差。等了几分钟,仍然是这个情况。那么实锤了 这里的代码有问题,连接应该没有释放。那么代码那么多,该如何发现具体代码的位置呢。

接下来配置druid的abandon策略。通过abandon可以强制回收数据库的连接。而活跃的连接被回收则会打印堆栈信息,这是就知道是哪里的sql代码没有释放了。

配置如下:

spring:
  datasource:
    druid:
      remove-abandoned: true
      remove-abandoned-timeout: 30
      log-abandoned: true

重启项目,这个时候durid的监控活跃连接数的功能就可以看到代码信息。

我们点击如下位置:

数据库泄露导致信息泄露_数据库经历的五个阶段

就会弹出上图的堆栈信息。打马赛克的地方就是代码的详细位置,会标记出来。开发人员去响应的类找到相应代码查看即可。

经过查看代码发现,代码的连接释放存在问题。是自己封装的sql查询类。改为mybatis的写法后,问题解决。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/166539.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 下载和安装R、RStudio !~~~「建议收藏」

    下载和安装R、RStudio !~~~「建议收藏」现如今,R语言是统计领域广泛使用的工具,是属于GNU系统的一个自由、免费、源代码开放的软件,是用于统计计算和统计绘图的优秀工具。而RStudio是R的集成开发环境,用它进行R编程的学习和实践会更加轻松和方便。下面就教大家如何下载并安装R和RStudio,比较简单。R的维护工作由一个国际化的开发者团队负责。R软件的官方下载页面叫作TheComprehensiveRArchiveNetwork

    2022年6月16日
    36
  • aspnetmvc和aspnetcoremvc的一些区别「建议收藏」

    aspnetmvc和aspnetcoremvc的一些区别「建议收藏」1.路由控制器添加特性:[RoutePrefix(“api/controller”)]=>[Route(“api/[controller]”)]方法添加特性:[HttpGet][Route(“{id}”)]=>[HttpGet(“{id}”)]2.返回参数webapiIHttpActionR…

    2022年9月29日
    0
  • uuid截取_jsp获取session中的值

    uuid截取_jsp获取session中的值switch_core_session_t*session=NULL;if(!(session=switch_core_session_locate(channel_uuid))){       return;}

    2022年8月10日
    3
  • Chrome断点调试

    Chrome断点调试1.断点调试是啥?难不难?断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了。操作起来似乎很简单,其实很多人纠结的是,是在哪里打断点?(我们先看一个断点截图,以chrome浏览器的断点为例)步骤记住没?用chrome浏览器打开页面→按f12打开开发者工具→打开Sources→打开你要调试的js代码文件→在行号上单击…

    2022年5月22日
    185
  • Spring Framework 简介

    Spring Framework 简介SpringFramework依赖注入、事务管理、Web应用程序、数据访问、消息传递、测试和更多的核心支持。Tips:Spring 官网:https://spring.io/spr

    2022年8月4日
    5
  • 哪些线程是安全的_redis是线程安全的吗

    哪些线程是安全的_redis是线程安全的吗Java中平时用的最多的map就是hashmap但是它却是线程不安全的。那除了hashmap还有哪些常见的线程安全的map?1.hashtableMap<String,Object>hashtable=newHashtable<String,Object>();这是所有人最先想到的,那为什么她是线程安全的?那就看看她的源码,我们可以看出我们常用的put,get,…

    2022年4月20日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号