Go语言中内存释放 ≠ 资源释放

// QueryUserFileMetas : 批量获取用户文件信息
func QueryUserFileMetas(username string, limit int) ([]UserFile, error) {stmt, err := mydb.DBConn().Prepare("select file_sha1,file_name,file_size,upload_at," +"last_update from tbl_user_file where user_name=? limit ?")if err != nil {return nil, err}defer stmt.Close()rows, err := stmt.Query(username, limit)if err != nil {return nil, err}var userFiles []UserFilefor rows.Next() {ufile := UserFile{}err = rows.Scan(&ufile.FileHash, &ufile.FileName, &ufile.FileSize,&ufile.UploadAt, &ufile.LastUpdated)if err != nil {fmt.Println(err.Error())break}userFiles = append(userFiles, ufile)}return userFiles, nil
}

这里的stmt需要手动回收,rows需要吗?

对象是否需要手动关闭为什么
stmt(预处理语句)需要占用数据库连接资源,必须关闭释放资源
rows(查询结果集)也需要持有数据库游标或连接,必须关闭释放资源

🔍 原因详解
🔹1. stmt.Close()
stmt 是通过 Prepare() 创建的预编译语句句柄。
它通常会绑定数据库连接资源,即使查询结束也不会自动释放。
不关闭会导致连接池资源泄漏,最终使数据库拒绝新的连接。

🔹2. rows.Close()
rows 是执行查询后返回的结果集,底层其实是一个游标。
也持有数据库连接,直到你显式地关闭或完全遍历完所有行。
如果不 Close():
连接不会释放给连接池(可能一直挂起)
资源泄漏:数据库连接数会越来越多,直到超出限制

✅ 总结
stmt.Close() 和 rows.Close() 都必须显式调用,通常用 defer 来管理。
否则会引起连接池资源耗尽、数据库连接泄漏等问题。
Go 的数据库接口(database/sql)设计得很灵活,但需要你手动管理生命周期。

疑问?为什么不会随着函数的调用结束被内存自动回收了呢?

🧠 背后原理:内存释放 ≠ 资源释放

Go 的垃圾回收器(GC)能做什么?
GC 只能自动清理内存对象(如你创建的结构体、切片、字符串等),前提是这些对象不再被引用。
GC 无法自动释放 “非内存资源”,比如:

  1. 网络连接(TCP socket).
  2. 数据库连接
  3. 文件句柄
  4. goroutine(除非主动退出)
  5. 系统级游标、IO句柄等

✅ Go GC 是“内存管理器”,而非“资源管理器”。

🔍 对比:内存 vs 非内存资源

类型例子GC 能自动释放?需要手动释放?
内存对象[]byte, string, map✅ 是❌ 否
数据库连接rows, stmt, tx❌ 否✅ 是
网络连接net.Conn❌ 否✅ 是
文件句柄os.File❌ 否✅ 是

Go 的垃圾回收器只会自动释放内存,但不会自动关闭文件、数据库连接等 “非内存资源”。这些资源你必须手动关闭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win11+vs2022 安装opencv 4.11.0图解教程

1. 下载opencv opencv官网下载地址:Releases - OpenCV 2. 双击运行该exe,即可进行安装,安装文件夹可自行选择 安装后目录如下: 3. 配置环境变量 使用win键搜索环境变量,选中系统变量中的Path,然后点击编辑…

【Linux】进程 信号的产生

🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、掌握Linux信号的基本概念 🌠前台进程 VS 后台进程 🌠 小贴士: 🪄⼀个系统函数 --- signal() 🪄查看信号 --- man 7 sign…

Python 网络编程入门

目录 一、前言 二、网络通信基础12:TCP 与 UDP 协议解析 2.1 TCP 协议:可靠的面向连接通信 2.2 UDP 协7议:无连接的快速通信 2.3 Sock12et:网络通信的基石 三、TCP 编程实15战:从单工通信到双向聊天 3.1 TCP 客…

Django压缩包形式下载文件

通过web将minio上的文件以压缩包-文件夹-文件的形式下载到本地 import os from bx_mes import settings from io import BytesIO import zipfile from django.http import StreamingHttpResponse class FileRemote(GenericAPIView):def post(self,request):# 压缩包名folder_n…

Enhancing Relation Extractionvia Supervised Rationale Verifcation and Feedback

Enhancing Relation Extraction via Supervised Rationale Verification and Feedback| Proceedings of the AAAI Conference on Artificial Intelligencehttps://ojs.aaai.org/index.php/AAAI/article/view/34631 1. 概述 关系抽取(RE)任务旨在抽取文本中实体之间的语义关

【RAG】ragflow源码亮点:文档embedding向量化加权融合

引言: 最近在看ragflow源码,其中有一个较为巧妙地设计:分别将 文字 、 标题 行向量化 之后,直接根据权重,进行加法运算,得到向量融合,增强了文本向量化的表示能力,这里开始讨论一下…

限流系列:sentinel

目录 滑动窗口算法 Sentinel 数据模型 示例 大致流程 ​​​​​​​entry ​​​​​​​entryWithPriority ​​​​​​​FlowSlot.entry ​​​​​​​checkFlow ​​​​​​​canPass ​​​​​​​avgUsedTokens ​​​​​​​passQps ​​​​​​​pa…

Java 访问者模式深度重构:从静态类型到动态行为的响应式设计实践

一、访问者模式的本质与核心价值 在软件开发的漫长演进中,设计模式始终是架构师手中的利刃。当我们面对复杂对象结构上的多种操作需求时,访问者模式(Visitor Pattern)犹如一把精密的手术刀,能够优雅地分离数据结构与作…

UE 5 C++设置物体位置和旋转,初始化虚幻引擎样条线、加载引用虚幻编辑器中的蓝图、设置虚幻编辑器中Actor大小

一、设置物体位置和旋转 UE.cpp文件中代码: Mesh->SetWorldLocationAndRotation(FVector(50.0f, 50.0f, 50.0f),FRotator(0,-90,0)); vs代码编辑器中旋转信息顺序(yzx): Pitch、 Yaw、 Roll UE编辑器中旋转信息顺序&#xf…

【文本分类】KG-HTC 知识图谱提升分类准确率

最近看到一篇论文“KG-HTC: Integrating Knowledge Graphs into LLMs for Effective Zero-shot Hierarchical Text Classification”,介绍了文本分类的技巧,这篇文航主要利用了知识图谱大模型的思路,实验效果不错,里面的一些论述也…

三大微调技术对比:Prompt/Prefix/P-Tuning

Prompt Tuning、Prefix Tuning和P - Tuning的区别 概念方面: Prompt Tuning:在输入序列前添加可训练的额外Token以适配下游任务,预训练语言模型参数不变。比如在文本分类中,在句子前加特定Token如“(OPINION)”,让模型理解是对观点进行分类的任务。Prefix Tuning:在每层T…

14.「实用」扣子(coze)教程 | Excel文档自动批量AI文档生成实战,中级开篇

随着AI编程工具及其能力的不断发展,编程将变得越来越简单。 在这个大趋势下,大师兄判断未来的编程将真正成为像office工具一样的办公必备技能。每个人通过 (专业知识/资源编程)将自己变成一个复合型的人才,大大提高生…

量子-经典协同计算新路径:NISQ 时代混合算法对后量子密码学的适应性探索

内容来源:量子前哨(ID:Qforepost) 文丨浪味仙 排版丨浪味仙 行业动向:3700字丨10分钟阅读 5 月 20 日,由北京量子院、清华大学、数学工程与先进计算国家重点实验室、南洋理工大学、量子信息前沿科学中心…

CentOS中安装Docker Compose

在CentOS中安装Docker Compose的步骤如下: 步骤 1:确保Docker已安装 Docker Compose依赖Docker环境,请先安装Docker: # 添加Docker官方仓库 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://downlo…

电商小程序店铺详情页:头部无限分类与筛选功能实现

电商小程序店铺详情页:头部无限分类与筛选功能实现 一、场景需求与技术选型二、头部无限分类导航三、筛选功能实现:Picker多列选择组件一、场景需求与技术选型 在电商小程序生态中,店铺详情页作为用户浏览商品的核心流量入口,其交互效率与功能完整性直接影响商品转化率。传…

Graph Neural Network(GNN)

我们首先要了解什么是图,图是由节点和边组成的,边的不一样也导致节点的不同(参考化学有机分子中的碳原子) gnn可以处理classification的问题,也就是分类的问题 也可以处理generation的问题 借一部日剧来说明,这个日剧是讲主角寻找杀害他父亲的凶手的,剧中的人物有姓名和特征 …

FallbackHome的启动流程(android11)

首次开机开机动画播完进入Launcher桌面时黑屏进入Launcher,有黑屏不太美观,在重启以后会在进入桌面后会显示android正在启动等一会进入Launcher,这就是系统FallBackHome机制 接下来我们跟着代码看下首次启动系统如何进入FallbackHome的 在SystemServer的startOthe…

【EdgeYOLO】《EdgeYOLO: An Edge-Real-Time Object Detector》

Liu S, Zha J, Sun J, et al. EdgeYOLO: An edge-real-time object detector[C]//2023 42nd Chinese Control Conference (CCC). IEEE, 2023: 7507-7512. CCC-2023 源码:https://github.com/LSH9832/edgeyolo 论文:https://arxiv.org/pdf/2302.07483 …

宫格导航--纯血鸿蒙组件库AUI

摘要: 宫格导航(A_GirdNav):可设置导航数据,建议导航项超过16个,可设置“更多”图标指向的页面路由。最多显示两行,手机每行最多显示4个图标,折叠屏每行最多6个图标,平板每行最多8个图标。多余图…

调试的按钮

在Debug的时候,会有一些按钮,我们需要知道它们各自的作用。 注:调试器本身并没有一个直接的、可以撤销已执行代码效果的“返回上一步(Undo Last Step)”或“逆向执行(Reverse Debugging)”按钮…