一文理清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.pswp.cn/bicheng/15416.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15416.shtml
英文地址,請注明出處:http://en.pswp.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;這…