首页 > 数据库 >使用dapper,因错误SQL字串拼接方式 导致的内存泄漏

使用dapper,因错误SQL字串拼接方式 导致的内存泄漏

时间:2024-08-07 19:28:21浏览次数:13  
标签:缓存 对象 sql SqlMapper 内存 SQL dapper 字串

作者就职的公司在19年就开始使用.net core并且部署到Linux上,这些年也遇到不少问题,有些问题都是使用土方法去解决,后面再慢慢写吧,准备将遇到的问题写成一个系列。

 

前情提要

本次的项目是20年上线的储值卡系统,上线后发现内存缓慢增长(半个月涨到4G多),一直没有找到原因就让运维小伙伴设置每半个月重启来解决这个问题,但是公司的发展增长的内存越来越大,不得不去学习一些知识去解决这个问题了。这就有了今天这篇博文了。

让运维小伙伴帮忙拿到dump,开始分析。(如何从Linux拿到dump?参考黄老师(一线码农)的博文:https://www.cnblogs.com/huangxincheng/p/17440153.html)


 

分析思路:

一、先观察一下dump的摘要信息

打开WinDbg,使用 !address -summary 命令观察摘要信息

 发现 MEM_COMMIT 中占用1.501GB

二、判断是托管内存还是非托管内存泄露

1、使用 !eeheap -gc 命令观察一下

 发现 Small object heap(小对象堆)占了800多M的内存,Large object heap(大对象堆)占了90多M的内存,那还有500多M的内存在哪里呢?

2、那我们通过!sos maddress -summary 命令观察一下

 

发现栈(stack)和映像(Image)占了519M内存,上面缺少的500多M在这里了,这个占用是正常的,那么我们就可以确认问题出现在Small object heap(小对象堆)中了

 

三、看看统计下托管堆上内存所有对象和小对象堆中的内存所有对象

1、通过 !sos dumpheap -stat 命令查看托管堆上内存所有对象

 发现数量最多分别是Dapper.SqlMapper+CacheInfo和Dapper.SqlMapper+Identity和string,我们在来看看某个小对象堆中的所有对象是不是这些内容

 

2、通过 !dumpheap -segment XXX(小对象堆中的segment 命令观察小对象堆上内存所有对象

 

发现和上面托管堆的中的对象一样,那我们接下来就去看看数量最多string中都是些什么东西吧。

 

四、查看string对象中的内容

1、通过 !dumpheap -mt 7f6f8b160f90 命令查看对象中的信息

 内容有点多,那我们就看看其中一个对象的内容吧

2、通过 !dumpobj /d 7f6f73ffadd8 命令查看对象中的内容

 ????怎么会是sql语句呢?我在看几个

 怎么都是sql呀?????那我就看看谁在占用它吧

 3、通过 !sos gcroot 7f6f71cf4ac8 命令查看谁在占用该内存对象

 

居然是dapper在占用它,看上去是dapper的缓存?啊???dapper还把sql语句都作为缓存了?

好我们找到问题了,那就开始解决它


 

 

 

 解决问题:

一、要解决问题那必须先了解问题

通过查看源码,找到Dapper.SqlMapper.Identity

发现会缓存起来,为什么会缓存起来呢?原因是为了效率

 

(详细的大家请看:深入Dapper.NET源码 (文长) - 阿翰 - 博客园 (cnblogs.com)

 二、解决办法

 1、规范sql,条件都必须通过参数传递,避免缓存过得造成内存泄露

 2、如果没办法规范sql怎么办呢?也有解决版本

通过阅读源码发现有两个方法 SqlMapper.GetCachedSQLCount()SqlMapper.PurgeQueryCache(),可以通过以上两个方法解决这个问题,避免过多的缓存,如果大于阈值就清空缓存

 

 

下一篇再见了大家

 

 

Large object heap

标签:缓存,对象,sql,SqlMapper,内存,SQL,dapper,字串
From: https://www.cnblogs.com/hyxf/p/18347745

相关文章

  • SqlServer 主从复制错误分析--20598
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、在分发服务器执行如下脚本select*fromMSsubscriber_infoselect*fromMSpublications 2、选择分发数据库-distribution,执行如下脚本 sp_helpsubscriptionerrors'IZQY9C2TQSKGS9ZTEST','DBTEST','DbPiblish'......
  • node.js: mysql sequelize in WebStorm 2023.1
    mysql:select*fromtutorials;#CREATETABLEIFNOTEXISTS`tutorials`(`id`INTEGERNOTNULLauto_increment,`title`VARCHAR(255),`description`VARCHAR(255),`published`TINYINT(1),`createdAt`DATETIMENOTNULL,`updatedAt`DATETIMENOTNULL,PRIMA......
  • CentOs7 中mysql8 设置远程连接
    迁移csdnCentOs7中Mysql8.0设置远程连接1登陆Mysqlmysql-uroot-p输入密码2选择mysql数据库usemysql;在mysql数据库中存储了用户信息的user表3在mysql数据库的user表中查看当前root用户的相关信息selecthost,user,authentication_string,pluginfromus......
  • DockerCompose中使用自定义网络的方式实现部署SpringBoot+Mysql+Redis
    场景Docker中Docker网络-理解Docker0与自定义网络的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/140788458Docker中使用自定义网络方式实现Redis集群部署与测试流程:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/140797109上面介绍了D......
  • CentOS Stream 9 安装mysql 开启远程访问 忽略大小写
     更新sudodnfupdate安装MySQL服务器:这边安装的是默认8.0sudodnfinstallmysql-server启动MySQL服务:sudosystemctlstartmysqld确保MySQL服务设置为在启动时自动启动:sudosystemctlenablemysqld运行初始安全脚本来设置root用户密码和调整安全......
  • EF Core连接PostgreSQL数据库
    PostgreSQL数据库介绍PostgreSQL是一个功能强大的开源对象关系型数据库管理系统(RDBMS)。最初于1986年在加州大学伯克利分校的POSTGRES项目中诞生,PostgreSQL以其稳定性、灵活性和扩展性而著称。它支持丰富的数据类型、复杂的查询、事务完整性、多版本并发控制(MVCC)、存储过程等高级......
  • 基于springboot+MySQL校园社团信息管理系统的设计与实现-计算机毕设 附源码 02705
    springboot校园社团信息管理系统的设计与实现目 录摘要1绪论1.1研究背景1.2 研究意义1.3论文结构与章节安排2 校园社团信息管理系统系统分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.2.2数据修改流程2.2.3数据删除流程2.3 系统......
  • SSM+MySQL四川工商学院图书馆管理系统-计算机毕设 附源码 03457
    SSM四川工商学院图书馆管理系统目 录摘 要1绪论1.1课题背景1.2研究目的和意义1.3国内外研究现状1.4系统设计思想1.5本章小结2 开发环境及相关技术介绍2.1MySQL数据库的介绍2.2 B/S架构的介绍2.3 Java语言2.4 SSM框架2.5本章小结3 ......
  • mysql数据库:数学函数
    mysql数据库:数学函数数学函数是MySQL中常用的函数,主要用于处理数字,包括整形、浮点数等。包括绝对值函数、正弦函数、余弦函数、和随机函数等。abs(x)求绝对值PI()返回圆周率sqrt(x)x的平方根mod(x,y)x除以y的余数pow(x,y)power(x,y)返回x的y次方exp(x)......
  • MySQL删除重复记录并且只保留最新一条
    目录测试表方式一:分组查询出每组最大的ID,其余的删除方式二:先标记重复待清理的数据,检查后清理附言查询所有重复的列:这里给到MySQL5.7和8.0版本的查询方式在开发过程中,因为某些问题可能会导致同一条数据在表中重复出现,此时我们需要申请权限走SQL去修复,下面介绍下具体修......