首页 > 数据库 >System.Data.SqlClient老版本引发内存溢出的问题

System.Data.SqlClient老版本引发内存溢出的问题

时间:2024-10-30 09:34:24浏览次数:1  
标签:SNIMarsManager System SNI SqlClient 内存 Data

有一个朋友和我说他负责的项目有内存溢出的情况,内存一直居高不下达到了8G。生产环境碰到内存溢出的情况我还没有碰到过,这次有机会实践一下,准备试试,拿到了dump文件,压缩包300M,解压出来3G。该事件是发生在2023年,写这篇文件的是已经是2024年了,为什么会间隔这么久才写这篇文章,因为当时没想到要写文章记录一下,但是后面想写的时候发现dump文件不见了,最近在整理电脑资料的时候发现了这个大文件。

1. 用VS查看dump

1.1 通过VS打开dump

image

1.2 选择右侧的调试托管内存

image

image

看计数和大小以及非独占大小确实存活的对象好多,并且占用的内存也不小。

1.3 分析这些没有被GC回收的对象

image

image

image
image

通过查看前几个对象发现,最终都指向到同一个类System.Data.SqlClient.SNI.SNIMarsManager里面的一个静态变量Singleton,看到这里的时候还很疑惑,这不是微软的库嘛,有内存溢出的问题不该早解决了。

1.4 查找System.Data.SqlClient.SNI.SNIMarsManager该类的相关资料

确实在GitHub上面找到了一个说自己写一个了web api链接sqlserver并且启用了MARS会导致产生了内存但没有释放,这里的疑惑在于该问题已于2017年解决了,现在的项目怎么也不可能用2017年的版本SqlClient。

image

Memory overconsumption on SqlClient with MARS #22949

image

  1. 查看System.Data.SqlClient该库源码看看
    通过反编译工具查看已经没有SNIMarsManager这个类了。
    image

接着继续找该类的资料,后面发现.NET Core 2.0 November Update - November 14, 2017这里有一个提交记录就是和该类相关的,这个时候才反映过来了为什么这个类找不到,原来类被删了
image
通过提交记录找到了提交之前的代码,该类源码如下:

using System.Collections.Concurrent;
using System.Collections.Generic;

namespace System.Data.SqlClient.SNI
{
    /// <summary>
    /// Singleton to manage all MARS connection
    /// </summary>
    internal class SNIMarsManager
    {
        public static readonly SNIMarsManager Singleton = new SNIMarsManager();
        private ConcurrentDictionary<SNIHandle, SNIMarsConnection> _connections = new ConcurrentDictionary<SNIHandle, SNIMarsConnection>();

        /// <summary>
        /// Constructor
        /// </summary>
        public SNIMarsManager()
        {
        }

        /// <summary>
        /// Create a MARS connection
        /// </summary>
        /// <param name="lowerHandle">Lower SNI handle</param>
        /// <returns>SNI error code</returns>
        public uint CreateMarsConnection(SNIHandle lowerHandle)
        {
            SNIMarsConnection connection = new SNIMarsConnection(lowerHandle);

            if (_connections.TryAdd(lowerHandle, connection))
            {
                return connection.StartReceive();
            }
            else
            {
                return TdsEnums.SNI_ERROR;
            }
        }

        /// <summary>
        /// Get a MARS connection by lower handle
        /// </summary>
        /// <param name="lowerHandle">Lower SNI handle</param>
        /// <returns>MARS connection</returns>
        public SNIMarsConnection GetConnection(SNIHandle lowerHandle)
        {
            return _connections[lowerHandle];
        }
    }
}

通过源码可以很明显的看到该类有一个静态变量Singleton,而且只有添加没有删除,这就导致MARS连接越来越多的时候内存越来越大,并且没有释放,导致程序运行占了8G,到这里基本上就找到问题的原因了,从晚上七点半一直到十一点,可以睡个好觉了。

3. 升级System.Data.SqlClient

第二天告知朋友升级System.Data.SqlClient,老版本确实存在内存泄漏的这个问题。朋友告诉我他用的库版本号是4.2。
image
我说你升级到最新就行了。但是这个时候奇葩的问题来了,项目找不到该库,我让他程序集和nuget引用都找找,最后定位到hangfire这个库,这是一个定时任务的库,该库可以使用sqlserver存储,有一个单独库叫Hangfire.SqlServer,在老版本安装的时候会自动安装System.Data.SqlClient,System.Data.SqlClient在Hangfire.SqlServer的依赖里面。升级一下Hangfire.SqlServer就解决了。

4. 总结

Bug出现在老版本的System.Data.SqlClient,然而ORM使用老版本的Hangfire.SqlServer的依赖库System.Data.SqlClient。过了一个月再问确实是没有再出现内存溢出的问题了,当时想着问题解决了就好,并没有想着记录,后面才发现这种机会难得还是需要记录一下。

标签:SNIMarsManager,System,SNI,SqlClient,内存,Data
From: https://www.cnblogs.com/dx5800/p/18510794

相关文章

  • Data-Free,多目标域适应合并方案,简单又有效 | ECCV'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:Training-FreeModelMergingforMulti-targetDomainAdaptation论文地址:https://arxiv.org/abs/2407.13771论文代码:https://air-discover.github.io/ModelMerging创新点对域适应的场景解析模型中的模式连通性进......
  • 有没有类似DataV开源库
    DataV是一个为开发者提供大数据可视化展示解决方案的库,以便将数据通过更直观的方式呈现给用户。本文将深入探讨:一、DataV的核心功能与特点;二、ECharts的使用及其特性;三、AntVG2的功能概览及适用场景;四、Three.js在数据可视化中的应用;五、D3.js的强大工具和灵活性。通过对比这些......
  • 深度学习入门笔记——DataLoader的使用
    如何使用数据集DataSet?在介绍DataLoader之前,需要先了解数据集DataSet的使用。Pytorch中集成了很多已经处理好的数据集,在pytorch的torchvision、torchtext等模块有一些典型的数据集,可以通过配置来下载使用。以CIFAR10数据集为例,文档已经描述的很清晰了,其中要注意的就是transform......
  • CSCI235 – Database Systems
    CSCI235 – Database Systems2024 S4Implementation Task 2Dueon 7 November 2024ScopeTheImplementationofTask2 is relatedtothecontents oftopic on Indexing.This Implementation is due byThursday, 7 November 2024, 9:00 pm Singa......
  • IC-GVINS: A Robust, Real-Time, INS-Centric GNSS-Visual-Inertial Navigation Syste
    IC-GVINS:ARobust,Real-Time,INS-CentricGNSS-Visual-InertialNavigationSystemIC-GVINS:一种稳健的实时以惯性导航系统为中心的全球导航卫星系统视觉惯性导航系统XiaojiNiu${}^{\circledR}$,HailiangTang${}^{\circledR}$,TishengZhang${}^{\circledR......
  • 什么是Nand Flash的Data Strobe信号
    NANDFlash的DataStrobe信号是一种用于同步数据传输的信号,特别是在高速NAND闪存接口(如ONFI规范的DDR模式)中使用。它帮助确保主机和NAND闪存设备之间的高效且准确的数据交换。具体而言,DataStrobe信号(简称DQS)的功能如下:数据同步:DataStrobe信号用于协调数据......
  • CIVIL-AI-SYSTEM 简介
    CIVIL-AI-SYSTEM是一个旨在简化NPC复杂行为的工具,它允许开发者快速迭代,提高开发效率。这个系统专为RPG和城市建设环境设计,但同样适用于其他多种环境。通过一个简单易学且深入的职位系统,用户可以快速开发出复杂的行为,为场景注入活力。核心特性简化AI设计:与传统的有限状态......
  • GaussDB技术解读——GaussDB架构介绍之数据持久化存取层(DataNode)关键技术方案
    数据持久化存取层(DataNode)关键技术方案Datanode节点主要负责数据的持久化和快速写入、读取。数据持久化采用物理日志wal,事务提交wal刷盘,对外提供逻辑日志功能,反解析物理日志为SQL逻辑日志。图1datanode数据持久化Astore:存储格式为追加写优化设计,其多版本元组采用新、老版......
  • FCA-FineDataLink认证试题及答案
    Part.1:判断题(总分:18分得分:18)第1题对于取出的API数据,希望进一步进行数据处理后再同步至数据库,此时可以在数据转换中使用API输入,然后做数据处理后再同步至数据库。(得分:2分满分:2分)A.正确B.错误第2题在进行数据连接时,可能会因为产品未内置对应版本的数据库......
  • 新接口 易宝OA-ExecuteSqlForDataSet接口存在SQL注入漏洞
    0x01阅读须知        本文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考。本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁......