热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在使用database/sql时应避免掉进这11个坑!(Go数据库)

下面由golang教程栏目给大家介绍在使用databasesql时应避免掉进这11个坑,希望对需要的朋友有所帮助!我们是Go语言及其数据库访问库databasesql的忠实粉丝。正如你可能亲眼看到的那样

下面由golang教程栏目给大家介绍在使用database/sql时应避免掉进这11个坑 ,希望对需要的朋友有所帮助!

我们是 Go 语言及其数据库访问库 database/sql 的忠实粉丝。正如你可能亲眼看到的那样,database/sql 的体积非常小,但是你可以用它做很多事情。这包括大量的错误和欺骗性错误的风险。这篇博文专门介绍我们过去犯过的一些错误,希望到时候你不会再犯同样的错误。

常见陷阱

  • 在循环内延迟。 长生命期函数在循环内有查询,在循环内延迟 rows.Close(),会导致内存和连接使用量都无限制地增长。

  • 打开许多 db 对象。 请创建一个全局sql.DB,并且不要为你的 API 服务器应该响应的每个传入 HTTP 请求打开一个新的。否则,你将打开和关闭大量到数据库的 TCP 连接。 TIME_WAIT 状态下的延迟,负载和 TCP 连接很多。

  • 操作完成后不做 rows.Close() 忘记关闭 rows 变量意味着连接泄漏。再加上服务器上不断增长的负载,这可能意味着会遇到 max_connections 错误或类似情况。请尽快运行 rows.Close() ,即使它稍后会再次用到(也是无害的)。出于同样的原因,将 db.QueryRow().Scan() 链接在一起。

  • 预处理语句膨胀。 如果代码以高并发运行,请考虑预处理语句是否是正确的解决方案,因为当连接繁忙时,它们可能会在不同的连接上多次重新预处理。

  • strconv 或 casts 使代码杂乱无章。 建议将结果扫描到一个你想要的类型的变量中,让 .Scan() 在幕后为你转换。

  • 错误处理和重试导致代码混乱。database/sql 为你处理连接池、重新连接和重试逻辑。

  • rows.Next() 之后忘记检查错误。 别忘了,rows.Next() 循环可能会异常退出。

  • 使用 db.Query() 进行非 SELECT 查询。 如果没有结果集,不要告诉 Go 你希望在结果集上迭代,否则会泄露连接。

  • 假设后续语句使用相同的连接。 如果连续运行两个语句,则它们很可能在两个不同的连接上运行。运行 LOCK TABLES tbl1 WRITE,然后运行SELECT * FROM tbl1,你很可能会阻塞并等待。如果需要保证使用单条语句,则需要使用参数 sql.Tx

  • 在使用 TX 的同时访问数据库。 sql.Tx 与事务绑定,但数据库没有绑定,所以访问它不会参与事务。

  • 对一个 NULL 感到惊讶。 你不能将一个 NULL 类型扫描成变量,除非它是 database/sql 包提供的 NullXXX 类型之一(或者是你自己制作的,或者是驱动提供的),否则。仔细检查您的模式,因为如果一个列可以是 NULL,那么总有一天它会变成 NULL,而在测试中有效的内容可能会在生产中崩溃。

原文地址:https://orangematter.solarwinds.com/2017/03/23/common-pitfalls-when-using-database-sql-in-go/

译文地址:https://learnku.com/go/t/50966

以上就是在使用database/sql时应避免掉进这11个坑 !(Go 数据库)的详细内容,更多请关注其它相关文章!


推荐阅读
  • 图数据库与传统数仓实现联邦查询使用CYPHER实现从关系数据库过滤时间序列指标一、MySQL得到研报实体在Oracle中的唯一ID二、Oracle中过滤时间序列数据三、CYPHER ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
  • 在运行于MS SQL Server 2005的.NET 2.0 Web应用中,我偶尔会遇到令人头疼的SQL死锁问题。过去,我们主要通过调整查询来解决这些问题,但这既耗时又不可靠。我希望能找到一种确定性的查询模式,确保从设计上彻底避免SQL死锁。 ... [详细]
  • 本文介绍了如何在 SQL Server 2005 中创建和使用数据库快照,包括创建数据库、数据表、插入数据、创建快照、查询快照数据以及使用快照进行数据恢复等操作。 ... [详细]
  • 理解GiST索引的空间构造原理
    通过空间思维解析GiST索引的构建方式及其在空间数据检索中的应用。 ... [详细]
  • 阿里面试题解析:分库分表后的无限扩容瓶颈与解决方案
    本文探讨了在分布式系统中,分库分表后的无限扩容问题及其解决方案。通过分析不同阶段的服务架构演变,提出了单元化作为解决数据库连接数过多的有效方法。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • h5调用本地摄像头和麦克风一
    h5调用本地摄像头和麦克风一,Go语言社区,Golang程序员人脉社 ... [详细]
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 如何将两个具有相同主键的Excel表格合并
    本文介绍如何将两个具有相同主键的Excel表格进行合并,通过左连接的方式将表2的数据插入到表1中。具体步骤包括在表1中添加新的列、使用VLOOKUP函数进行数据匹配,以及通过SQL语句实现数据库中的表连接。 ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
author-avatar
手机用户2502853217
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有