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

2024-05-25 19:52

本文主要是介绍一文理清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连接是否有效,再进行查询。

这篇关于一文理清database/sql包的使用场景和宕机查询流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定