一文理清database/sql包的使用场景和宕机查询流程

一文理清database/sql包你可能遇到的问题

    • 那么database/sql包实现了什么功能呢?
      • 建立数据库连接
      • 检测连接是否能ping通
      • 通过连接进行具体的sql查询
      • 查询完将连接进行关闭
      • 当数据库宕掉重启后再次查询
    • database/sql包创建的db连接 对于数据库宕掉后重启是否仍然有效?


当你点开这篇文章的时候你应该是想用go来与数据库进行交互的咯,那么正常流程下,你会涉及到建立数据库连接、检测连接是否能ping通、通过连接进行具体的sql查询,查询完将连接进行关闭,当数据库宕掉重启后再次查询等等。下面对于这些实现都会有介绍。

那么database/sql包实现了什么功能呢?

我们来看一下官方的答案。

Go语言中的database/sql包提供了一套与数据库进行交互的统一编程接口。它的主要功能和特性可以总结为以下几点:

  1. 统一的编程接口database/sql包通过提供一组统一的API,如Prepare(), Exec(), Query()等,使得开发人员能够以相同的方式操作不同的数据库。这大大提高了代码的可移植性和灵活性。
  2. 驱动支持database/sql包本身并不直接与数据库通信,而是依赖于第三方数据库驱动程序。这些驱动程序需要实现database/sql/driver包中定义的Driver接口,并在程序初始化阶段通过sql.Register()方法注册到database/sql中。常见的关系型数据库如MySQL、PostgreSQL、Oracle、Gbase8s等都有对应的Go语言驱动程序。比如oracle的驱动mattn/go-oci8: Oracle driver for Go using database/sql (github.com)
  3. 连接池管理database/sql维护了一个数据库连接池,用于管理数据库连接。当通过sql.Open()打开一个数据库连接时,database/sql会在合适的时机调用注册的驱动来创建一个具体的连接,并将其添加到连接池中。连接池会负责连接的复用、管理和维护工作,并且这是并发安全的。
  4. 事务支持database/sql包还支持事务处理,可以通过Tx类型的方法如Begin(), Commit(), Rollback()等来进行事务的管理。
  5. 安全性:为了防止SQL注入攻击,database/sql包推荐使用预编译语句和参数化查询。这样可以确保所有的SQL语句在执行前都会被预先分析和编译,从而避免了潜在的安全问题。

建立数据库连接

package demoimport ("database/sql"
)var mydb,_ =  sql.Open("mysql","connection_string")

检测连接是否能ping通

err = db.Ping()
if err != nil {panic(err)
}

通过连接进行具体的sql查询

func testSelect(db *sql.DB) error {rows, err := db.Query("select 3.14, 'foo' from dual")if err != nil {return err}defer rows.Close()for rows.Next() {var f1 float64var f2 stringrows.Scan(&f1, &f2)println(f1, f2) // 3.14 foo}return nil
}
//当然 对于不同的查询需求使用的函数不一样 这里就当你使用的时候直接去搜就好啦
//比如 需要返回值时
var primary string
err := c.db.QueryRow("select ha_primary from sysha_type").Scan(&primary)

查询完将连接进行关闭

db.Close()

当数据库宕掉重启后再次查询

if err = testSelect(db); err != nil {fmt.Println(err)return}

大家应该发现了再次查询和查询语句是一样的。其实对于执行上,都是执行的查询语句。但是我们需要考虑的是经历过数据库宕掉之后,还是传原来的db吗?那么就引出下一个问题。

database/sql包创建的db连接 对于数据库宕掉后重启是否仍然有效?

当数据库宕掉后重启,原先由database/sql包创建的db连接并不会自动恢复其有效性。在Go语言中,database/sql包提供了与SQL数据库进行交互的功能,其中包括连接池的管理。连接池负责维护打开的数据库连接,以便在多个数据库操作之间重用这些连接,从而提高应用程序的性能。然而,当数据库宕机并重新启动后,原有的数据库连接将不再有效,需要重新建立连接。以下是具体分析:

  1. 数据库连接状态检测
    • 在正常情况下,database/sql的连接池会维护一定数量的活跃和空闲连接。
    • db.SetMaxIdleConns()用于设置连接池中空闲连接的最大数量。
    • db.SetMaxOpenConns()用于设置到数据库的同时最大打开连接数。
    • db.SetConnMaxLifetime()可以设置连接的最大生命周期,超过这个时间,连接将被关闭并从池中移除。
  2. 数据库宕机影响
    • 当数据库宕机时,所有现有的数据库连接将会失效。
    • 即使数据库随后重启,这些失效的连接也不会自动恢复其有效性。
  3. 数据库重启处理
    • 在数据库重启后,必须创建新的数据库连接以替换失效的连接。
    • database/sql包本身不提供自动重连功能,因此需要在应用程序逻辑中处理这种情况。
  4. 连接池参数配置
    • 通过合理配置连接池参数,如最大空闲连接数、最大打开连接数和连接最大生命周期,可以优化数据库连接的使用效率。
    • 这些参数的设置应根据应用程序的具体需求和数据库的实际性能进行调整。
  5. 异常情况处理
    • 应用程序应具备异常处理机制,能够在数据库不可用时进行适当的错误处理和重试逻辑。
    • 可以考虑实现自定义的重连策略,例如指数退避算法,以避免在数据库重启期间过多地尝试连接。
  6. 测试与验证
    • 在开发过程中,应通过模拟数据库宕机和重启的场景来测试应用程序的异常处理能力。
    • 确保在实际部署前,应用程序能够正确处理数据库连接失效的情况。

所以,正确的执行步骤应该是,ping时发现db连接失效了,不通了,执行close操作,再次使用Open打开新的连接,ping检查db连接是否有效,再进行查询。

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

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

相关文章

AI绘画工具:创意与技术的完美融合

随着人工智能技术的飞速发展,我们见证了无数领域的革新与变革。其中,AI绘画工具的出现,无疑为艺术界带来了一股清新的风潮。这些工具以其独特的魅力,吸引了无数艺术家和创意人士的目光,成为他们表达自我、探索未知的重…

Compose在xml中使用滑动冲突处理

一、背景 在现有Android项目中使用Compose可能存在滑动冲突问题,例如 SmartRefreshLayoutCoordinatorLayoutComposeView(ComposeView这里又是一个LazyColumn) 二、解决方案 官方介绍:https://developer.android.google.cn/develop/ui/compose/touch-inp…

huggingface 笔记:device_map

1 基本映射方法 设计设备映射时,可以让Accelerate库来处理设备映射的计算通过设置device_map为支持的选项之一("auto"、 "balanced"、 "balanced_low_0"、 "sequential");或者如果想更精…

golang的context和chan 的使用

1. context 作用 context包的context的接口,主要是控制协程执行上下文的时间,以及取消程序的执行,以及上下文中传递数据等作用,golang中耗时或者需要协同的操作都会见到context的身影。 context有几个常用的方法 1.1 context.B…

用爬山算法解决离散的优化问题

爬山算法,也称为梯度上升算法或局部搜索算法,是一种简单有效的优化算法,常用于解决连续或离散的优化问题。爬山算法的基本思想是从一个随机的初始点开始,通过迭代地向局部最优的方向移动,逐步逼近全局最优解。 爬山算…

git管理Codeup云效平台

HTTPS方式实现Git命令 1.进入项目路径,如 cd demo,与此同时,在Codeup平台创建一个空仓库repo,获取空仓库的https协议地址,例如 https://codeup.aliyun.com/xxxx/xxxx/xxx.git。 2.在demo项目下执行 git init命令初始化…

从反向传播(BP)到BPTT:详细数学推导【原理理解】

从反向传播到BPTT:详细推导与问题解析 在本文中,我们将从反向传播算法开始,详细推导出反向传播通过时间(Backpropagation Through Time, BPTT)算法。重点讨论BPTT中的梯度消失和梯度爆炸问题,并解释如何解…

采用LoRA方法微调llama3大语言模型

文章目录 前言一、Llama3模型简介1.下载llama3源码到linux服务器2.安装依赖3.测试预训练模型Meta-Llama-3-8B4.测试指令微调模型Meta-Llama3-8B-Instruct5.小结 二、LoRA微调Llama31.引入库2.编写配置文件3.LoRA训练的产物 三、测试新模型效果1.编写配置文件2.运行配置文件&…

QT教程-一,初识QT

目录 一,QT是什么?能够使用它做什么? 二,Qt 能够使用的语言 三,Qt主要用于什么领域? 四,Qt开发的软件 一,QT是什么?能够使用它做什么? Qt是一个跨平台的 C 开发库,主…

全球最高点赞记录,世界点赞第一名是谁?世界点赞第一人名字的由来

世界点赞第一人名字的由来: 起源与概念提出: 二十一世纪东方伟大的思想家哲学家教育家颜廷利教授,一位在中国21世纪早期便以其非凡才华和创新精神著称的学者,早在互联网尚未普及的20世纪90年代,就已经提出了“点赞”的…

算法提高之最大数

算法提高之最大数 核心思想&#xff1a;线段树 添加数 看作原本的数组有数(0) 现在将他修改成另一个值 询问后l个数的最大值query函数具体实现 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 200010;typed…

python爬虫登录到海康相机管理页面

简述 1.最近接到个任务是在管理页面更改相机的某个参数&#xff0c;下载官方的sdk貌似没有提供这个接口&#xff0c;所以只能自己写爬虫登录发请求了。 1.主要步骤 1.1 发送get请求获取到salt&#xff0c;sessionID&#xff0c;challenge等信息 http://admin:123456192.168.…

交叉熵损失函数计算过程(tensorflow)

交叉熵损失函数通常用于多类分类损失函数计算。计算公式如下&#xff1a; P为真实值&#xff0c;Q为预测值。 使用tensorflow计算 import tensorflow as tf import keras# 创建一个示例数据集 # 假设有3个样本&#xff0c;每个样本有4个特征&#xff0c;共2个类别 # 目标标签…

Spark Client 配置

前言 记录Spark Client 配置,这里的 Spark Client 和 HDFS、YARN 不在一个节点,只是一个单节点的 Spark Client,需要能连接其他节点的大数据集群的 Hive 和 能提交到Yarn 。 环境信息 大数据节点(已配置好Spark): 192.168.44.154 192.168.44.155 192.168.44.156 客户端…

P2P 技术:点对点网络的兴起

目录 概述 P2P 的兴起 P2P 的定义和特征 定义 特征 P2P 的发展 早期发展 快速成长 成熟应用 P2P 的关键技术 P2P 的应用 总结 概述 P2P&#xff08;Peer-to-Peer&#xff09;&#xff0c;即点对点网络&#xff0c;是一种去中心化的网络架构&#xff0c;它允许网络中…

2024最新私有化部署AI大模型,让每个人都有属于自己的AI助理

让每个人都拥有一个属于自己的本地大模型 下载Ollama 下载地址 ​ https://ollama.com/download ​ Ollama支持MacOS、Linux、Windows 解压 下载完成后&#xff0c;会得到一个Ollama-darwin.zip文件&#xff0c;解压后&#xff0c;以Mac为例是一个可运行文件&#xff1a;O…

Jupyter 使用手册: 探索交互式计算的无限可能

什么是 Jupyter? Jupyter 是一个开源的 Web 应用程序,可用于创建和共享包含实时代码、可视化和叙述性文本的文档。它最初是作为 IPython 项目的一部分开发的,后来发展成为支持多种编程语言的交互式计算环境。 应用场景 作为一个开源的交互式计算环境,Jupyter 在以下几个领域…

AI应用案例:服务器智能分析管理系统

服务器硬件配置、性能状态、所运行的应用系统等信息分散于多个不同的信息管理系统。人为查询判断现有的服务器资源是否满足用户需求&#xff0c;且需结合资产管理系统与Maximo基础资源、性能监控、运维管理等各个系统互不关联&#xff0c;数据分散不能为运维管理提供完整一致的…

在Spring 当中存在的八大模式

在Spring 当中存在的八大模式 文章目录 在Spring 当中存在的八大模式每博一文案1. 简单工厂模式2. 工厂方法模式3. 单例模式4. 代理模式5. 装饰器模式6. 观察者模式7. 策略模式8. 模板方法模式最后&#xff1a; 每博一文案 我认为 “知世故而不世故” 才是真正意义上的成熟。回…

Micrometer中0.5 0.9 0.99三个百分位数详解

Micrometer的Timer类中的publishPercentiles方法使用0.5, 0.95, 0.99这三个百分位数&#xff0c;是因为它们在性能监控和SLA&#xff08;Service Level Agreement&#xff0c;服务等级协议&#xff09;指标测量中具有特定的意义和普遍应用。 在系统性能监控领域&#xff0c;这…