真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言sql內(nèi)存溢出,golang內(nèi)存溢出例子

【golang】?jī)?nèi)存逃逸常見情況和避免方式

因?yàn)槿绻兞康膬?nèi)存發(fā)生逃逸,它的生命周期就是不可知的,其會(huì)被分配到堆上,而堆上分配內(nèi)存不能像棧一樣會(huì)自動(dòng)釋放,為了解放程序員雙手,專注于業(yè)務(wù)的實(shí)現(xiàn),go實(shí)現(xiàn)了gc垃圾回收機(jī)制,但gc會(huì)影響程序運(yùn)行性能,所以要盡量減少程序的gc操作。

尚義ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

1、在方法內(nèi)把局部變量指針返回,被外部引用,其生命周期大于棧,則溢出。

2、發(fā)送指針或帶有指針的值到channel,因?yàn)榫幾g時(shí)候無法知道那個(gè)goroutine會(huì)在channel接受數(shù)據(jù),編譯器無法知道什么時(shí)候釋放。

3、在一個(gè)切片上存儲(chǔ)指針或帶指針的值。比如[]*string,導(dǎo)致切片內(nèi)容逃逸,其引用值一直在堆上。

4、因?yàn)榍衅腶ppend導(dǎo)致超出容量,切片重新分配地址,切片背后的存儲(chǔ)基于運(yùn)行時(shí)的數(shù)據(jù)進(jìn)行擴(kuò)充,就會(huì)在堆上分配。

5、在interface類型上調(diào)用方法,在Interface調(diào)用方法是動(dòng)態(tài)調(diào)度的,只有在運(yùn)行時(shí)才知道。

1、go語(yǔ)言的接口類型方法調(diào)用是動(dòng)態(tài),因此不能在編譯階段確定,所有類型結(jié)構(gòu)轉(zhuǎn)換成接口的過程會(huì)涉及到內(nèi)存逃逸發(fā)生,在頻次訪問較高的函數(shù)盡量調(diào)用接口。

2、不要盲目使用變量指針作為參數(shù),雖然減少了復(fù)制,但變量逃逸的開銷更大。

3、預(yù)先設(shè)定好slice長(zhǎng)度,避免頻繁超出容量,重新分配。

golang配制高性能sql.DB

有很多教程是關(guān)于Go的sql.DB類型和如何使用它來執(zhí)行SQL數(shù)據(jù)庫(kù)查詢的。但大多數(shù)內(nèi)容都沒有講述 SetMaxOpenConns() , SetMaxIdleConns() 和 SetConnMaxLifetime()方法, 您可以使用它們來配置sql.DB的行為并改變其性能。

轉(zhuǎn)自:

整理:go語(yǔ)言中文文檔:

在本文我將詳細(xì)解釋這些設(shè)置的作用,并說明它們所能產(chǎn)生的(積極和消極)影響。

一個(gè)sql.DB對(duì)象就是一個(gè)數(shù)據(jù)庫(kù)連接池,它包含“正在用”和“空閑的”連接。一個(gè)正在用的連接指的是,你正用它來執(zhí)行數(shù)據(jù)庫(kù)任務(wù),例如執(zhí)行SQL語(yǔ)句或行查詢。當(dāng)任務(wù)完成連接就是空閑的。

當(dāng)您創(chuàng)建sql.DB執(zhí)行數(shù)據(jù)庫(kù)任務(wù)時(shí),它將首先檢查連接池中是否有可用的空閑連接。如果有可用的連接,那么Go將重用現(xiàn)有連接,并在執(zhí)行任務(wù)期間將其標(biāo)記為正在使用。如果池中沒有空閑連接,而您需要一個(gè)空閑連接,那么Go將創(chuàng)建一個(gè)新的連接。

默認(rèn)情況下,在同一時(shí)間打開連接的數(shù)量是沒有限制(包含使用中+空閑)。但你可以通過SetMaxOpenConns()方法實(shí)現(xiàn)自定義限制,如下所示:

在這個(gè)示例代碼中,連接池現(xiàn)在有5個(gè)并發(fā)打開的連接數(shù)。如果所有5個(gè)連接都已經(jīng)被標(biāo)記為正在使用,并且需要另一個(gè)新的連接,那么應(yīng)用程序?qū)⒈黄鹊却?,直?個(gè)連接中的一個(gè)被釋放并變?yōu)榭臻e。

為了說明更改MaxOpenConns的影響,我運(yùn)行了一個(gè)基準(zhǔn)測(cè)試,將最大打開連接數(shù)設(shè)置為1、2、5、10和無限?;鶞?zhǔn)測(cè)試在PostgreSQL數(shù)據(jù)庫(kù)上執(zhí)行并行的INSERT語(yǔ)句,您可以在這里找到代碼。測(cè)試結(jié)果:

對(duì)于這個(gè)基準(zhǔn)測(cè)試,我們可以看到,允許打開的連接越多,在數(shù)據(jù)庫(kù)上執(zhí)行INSERT操作所花費(fèi)的時(shí)間就越少(打開的連接數(shù)為1時(shí),執(zhí)行速度3129633ns/op,而無限連接:531030ns/op——大約快了6倍)。這是因?yàn)樵试S打開的連接越多,可以并發(fā)執(zhí)行的數(shù)據(jù)庫(kù)查詢就越多。

默認(rèn)情況下,sql.DB允許連接池中最多保留2個(gè)空閑連接。你可以通過SetMaxIdleConns()方法改變它,如下所示:

從理論上講,允許池中有更多的空閑連接將提高性能,因?yàn)檫@樣就不太可能從頭開始建立新連接——因此有助于提升數(shù)據(jù)庫(kù)性能。

讓我們來看看相同的基準(zhǔn)測(cè)試,最大空閑連接設(shè)置為none, 1,2,5和10:

當(dāng)MaxIdleConns設(shè)置為none時(shí),必須為每個(gè)INSERT從頭創(chuàng)建一個(gè)新的連接,我們可以從基準(zhǔn)測(cè)試中看到,平均運(yùn)行時(shí)和內(nèi)存使用量相對(duì)較高。

只允許保留和重用一個(gè)空閑連接對(duì)基準(zhǔn)測(cè)試影響特別明顯——它將平均運(yùn)行時(shí)間減少了大約8倍,內(nèi)存使用量減少了大約20倍。繼續(xù)增加空閑連接池的大小會(huì)使性能變得更好,盡管改進(jìn)并不明顯。

那么,您應(yīng)該維護(hù)一個(gè)大的空閑連接池嗎?答案取決于應(yīng)用程序。重要的是要意識(shí)到保持空閑連接是有代價(jià)的—它占用了可以用于應(yīng)用程序和數(shù)據(jù)庫(kù)的內(nèi)存。

還有一種可能是,如果一個(gè)連接空閑時(shí)間太長(zhǎng),那么它可能會(huì)變得不可用。例如,MySQL的wait_timeout設(shè)置將自動(dòng)關(guān)閉任何8小時(shí)(默認(rèn))內(nèi)未使用的連接。

當(dāng)發(fā)生這種情況時(shí),sql.DB會(huì)優(yōu)雅地處理它。壞連接將自動(dòng)重試兩次,然后放棄,此時(shí)Go將該連接從連接池中刪除,并創(chuàng)建一個(gè)新的連接。因此,將MaxIdleConns設(shè)置得太大可能會(huì)導(dǎo)致連接變得不可用,與空閑連接池更小(使用更頻繁的連接更少)相比,會(huì)占有更多的資源。所以,如果你很可能很快就會(huì)再次使用,你只需保持一個(gè)空閑的連接。

最后要指出的是,MaxIdleConns應(yīng)該總是小于或等于MaxOpenConns。Go強(qiáng)制執(zhí)行此操作,并在必要時(shí)自動(dòng)減少M(fèi)axIdleConns。

現(xiàn)在讓我們看看SetConnMaxLifetime()方法,它設(shè)置連接可重用的最大時(shí)間長(zhǎng)度。如果您的SQL數(shù)據(jù)庫(kù)也實(shí)現(xiàn)了最大連接生命周期,或者—例如—您希望方便地在負(fù)載均衡器后交換數(shù)據(jù)庫(kù),那么這將非常有用。

你可以這樣使用它:

在這個(gè)例子中,所有的連接都將在創(chuàng)建后1小時(shí)“過期”,并且在過期后無法重用。但注意:

從理論上講,ConnMaxLifetime越短,連接過期的頻率就越高——因此,需要從頭創(chuàng)建連接的頻率就越高。為了說明這一點(diǎn),我運(yùn)行了將ConnMaxLifetime設(shè)置為100ms、200ms、500ms、1000ms和無限(永遠(yuǎn)重用)的基準(zhǔn)測(cè)試,默認(rèn)設(shè)置為無限打開連接和2個(gè)空閑連接。這些時(shí)間段顯然比您在大多數(shù)應(yīng)用程序中使用的時(shí)間要短得多,但它們有助于很好地說明行為。

在這些特定的基準(zhǔn)測(cè)試中,我們可以看到,與無限生存期相比,在100ms生存期時(shí)內(nèi)存使用量增加了3倍以上,而且每個(gè)INSERT的平均運(yùn)行時(shí)也稍微長(zhǎng)一些。

如果您在代碼中設(shè)置了ConnMaxLifetime,那么一定要記住連接將過期(隨后重新創(chuàng)建)的頻率。例如,如果您總共有100個(gè)連接,而ConnMaxLifetime為1分鐘,那么您的應(yīng)用程序可能每秒鐘殺死和重新創(chuàng)建1.67個(gè)連接(平均值)。您不希望這個(gè)頻率太大,最終會(huì)阻礙性能,而不是提高性能。

最后,如果不說明超過數(shù)據(jù)庫(kù)連接數(shù)量的硬限制將會(huì)發(fā)生什么,那么本文就不完整了。 為了說明這一點(diǎn),我將修改postgresql.conf文件,這樣總共只允許5個(gè)連接(默認(rèn)是100個(gè))…

然后在無限連接的情況下重新運(yùn)行基準(zhǔn)測(cè)試……

一旦達(dá)到5個(gè)連接的硬限制,數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序(pq)立即返回一個(gè)太多客戶端連接的錯(cuò)誤消息,而無法完成INSERT。為了防止這個(gè)錯(cuò)誤,我們需要將sql.DB中打開連接的最大總數(shù)(正在使用的+空閑的)設(shè)置為低于5。像這樣:

現(xiàn)在,sql.DB在任何時(shí)候最多只能創(chuàng)建3個(gè)連接,基準(zhǔn)測(cè)試運(yùn)行時(shí)應(yīng)該不會(huì)出現(xiàn)任何錯(cuò)誤。但是這樣做需要注意:當(dāng)達(dá)到開放連接數(shù)限制,并且所有連接都在使用時(shí),應(yīng)用程序需要執(zhí)行的任何新的數(shù)據(jù)庫(kù)任務(wù)都將被迫等待,直到連接標(biāo)記為空閑。例如,在web應(yīng)用程序的上下文中,用戶的HTTP請(qǐng)求看起來會(huì)“掛起”,甚至在等待數(shù)據(jù)庫(kù)任務(wù)運(yùn)行時(shí)可能會(huì)超時(shí)。

為了減輕這種情況,你應(yīng)該始終在一個(gè)上下文中傳遞。在調(diào)用數(shù)據(jù)庫(kù)時(shí),啟用上下文的方法(如ExecContext()),使用固定的、快速的超時(shí)上下文對(duì)象。

總結(jié)

1、根據(jù)經(jīng)驗(yàn),應(yīng)該顯式設(shè)置MaxOpenConns值。這應(yīng)該小于數(shù)據(jù)庫(kù)和基礎(chǔ)設(shè)施對(duì)連接數(shù)量的硬性限制。

2、一般來說,更高的MaxOpenConns和MaxIdleConns值將帶來更好的性能。但你應(yīng)該注意到效果是遞減的,連接池空閑連接太多(連接沒有被重用,最終會(huì)變壞)實(shí)際上會(huì)導(dǎo)致性能下降。

3、為了降低上面第2點(diǎn)帶來的風(fēng)險(xiǎn),您可能需要設(shè)置一個(gè)相對(duì)較短的ConnMaxLifetime。但你也不希望它太短,導(dǎo)致連接被殺死或不必要地頻繁重建。

4、MaxIdleConns應(yīng)該總是小于或等于MaxOpenConns。

對(duì)于中小型web應(yīng)用程序,我通常使用以下設(shè)置作為起點(diǎn),然后根據(jù)實(shí)際吞吐量水平的負(fù)載測(cè)試結(jié)果進(jìn)行優(yōu)化。

GO語(yǔ)言(十六):模糊測(cè)試入門(上)

本教程介紹了 Go 中模糊測(cè)試的基礎(chǔ)知識(shí)。通過模糊測(cè)試,隨機(jī)數(shù)據(jù)會(huì)針對(duì)您的測(cè)試運(yùn)行,以嘗試找出漏洞或?qū)е卤罎⒌妮斎?。可以通過模糊測(cè)試發(fā)現(xiàn)的一些漏洞示例包括 SQL 注入、緩沖區(qū)溢出、拒絕服務(wù)和跨站點(diǎn)腳本攻擊。

在本教程中,您將為一個(gè)簡(jiǎn)單的函數(shù)編寫一個(gè)模糊測(cè)試,運(yùn)行 go 命令,并調(diào)試和修復(fù)代碼中的問題。

首先,為您要編寫的代碼創(chuàng)建一個(gè)文件夾。

1、打開命令提示符并切換到您的主目錄。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為 fuzz 的目錄。

3、創(chuàng)建一個(gè)模塊來保存您的代碼。

運(yùn)行g(shù)o mod init命令,為其提供新代碼的模塊路徑。

接下來,您將添加一些簡(jiǎn)單的代碼來反轉(zhuǎn)字符串,稍后我們將對(duì)其進(jìn)行模糊測(cè)試。

在此步驟中,您將添加一個(gè)函數(shù)來反轉(zhuǎn)字符串。

a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 main.go 的文件。

獨(dú)立程序(與庫(kù)相反)始終位于 package 中main。

此函數(shù)將接受string,使用byte進(jìn)行循環(huán) ,并在最后返回反轉(zhuǎn)的字符串。

此函數(shù)將運(yùn)行一些Reverse操作,然后將輸出打印到命令行。這有助于查看運(yùn)行中的代碼,并可能有助于調(diào)試。

e.該main函數(shù)使用 fmt 包,因此您需要導(dǎo)入它。

第一行代碼應(yīng)如下所示:

從包含 main.go 的目錄中的命令行,運(yùn)行代碼。

可以看到原來的字符串,反轉(zhuǎn)它的結(jié)果,然后再反轉(zhuǎn)它的結(jié)果,就相當(dāng)于原來的了。

現(xiàn)在代碼正在運(yùn)行,是時(shí)候測(cè)試它了。

在這一步中,您將為Reverse函數(shù)編寫一個(gè)基本的單元測(cè)試。

a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 reverse_test.go 的文件。

b.將以下代碼粘貼到 reverse_test.go 中。

這個(gè)簡(jiǎn)單的測(cè)試將斷言列出的輸入字符串將被正確反轉(zhuǎn)。

使用運(yùn)行單元測(cè)試go test

接下來,您將單元測(cè)試更改為模糊測(cè)試。

單元測(cè)試有局限性,即每個(gè)輸入都必須由開發(fā)人員添加到測(cè)試中。模糊測(cè)試的一個(gè)好處是它可以為您的代碼提供輸入,并且可以識(shí)別您提出的測(cè)試用例沒有達(dá)到的邊緣用例。

在本節(jié)中,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,這樣您就可以用更少的工作生成更多的輸入!

請(qǐng)注意,您可以將單元測(cè)試、基準(zhǔn)測(cè)試和模糊測(cè)試保存在同一個(gè) *_test.go 文件中,但對(duì)于本示例,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試。

在您的文本編輯器中,將 reverse_test.go 中的單元測(cè)試替換為以下模糊測(cè)試。

Fuzzing 也有一些限制。在您的單元測(cè)試中,您可以預(yù)測(cè)Reverse函數(shù)的預(yù)期輸出,并驗(yàn)證實(shí)際輸出是否滿足這些預(yù)期。

例如,在測(cè)試用例Reverse("Hello, world")中,單元測(cè)試將返回指定為"dlrow ,olleH".

模糊測(cè)試時(shí),您無法預(yù)測(cè)預(yù)期輸出,因?yàn)槟鸁o法控制輸入。

但是,Reverse您可以在模糊測(cè)試中驗(yàn)證函數(shù)的一些屬性。在這個(gè)模糊測(cè)試中檢查的兩個(gè)屬性是:

(1)將字符串反轉(zhuǎn)兩次保留原始值

(2)反轉(zhuǎn)的字符串將其狀態(tài)保留為有效的 UTF-8。

注意單元測(cè)試和模糊測(cè)試之間的語(yǔ)法差異:

(3)確保新包unicode/utf8已導(dǎo)入。

隨著單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,是時(shí)候再次運(yùn)行測(cè)試了。

a.在不進(jìn)行模糊測(cè)試的情況下運(yùn)行模糊測(cè)試,以確保種子輸入通過。

如果您在該文件中有其他測(cè)試,您也可以運(yùn)行g(shù)o test -run=FuzzReverse,并且您只想運(yùn)行模糊測(cè)試。

b.運(yùn)行FuzzReverse模糊測(cè)試,查看是否有任何隨機(jī)生成的字符串輸入會(huì)導(dǎo)致失敗。這是使用go test新標(biāo)志-fuzz執(zhí)行的。

模糊測(cè)試時(shí)發(fā)生故障,導(dǎo)致問題的輸入被寫入將在下次運(yùn)行的種子語(yǔ)料庫(kù)文件中g(shù)o test,即使沒有-fuzz標(biāo)志也是如此。要查看導(dǎo)致失敗的輸入,請(qǐng)?jiān)谖谋揪庉嬈髦写蜷_寫入 testdata/fuzz/FuzzReverse 目錄的語(yǔ)料庫(kù)文件。您的種子語(yǔ)料庫(kù)文件可能包含不同的字符串,但格式相同。

語(yǔ)料庫(kù)文件的第一行表示編碼版本。以下每一行代表構(gòu)成語(yǔ)料庫(kù)條目的每種類型的值。由于 fuzz target 只需要 1 個(gè)輸入,因此版本之后只有 1 個(gè)值。

c.運(yùn)行沒有-fuzz標(biāo)志的go test; 新的失敗種子語(yǔ)料庫(kù)條目將被使用:

由于我們的測(cè)試失敗,是時(shí)候調(diào)試了。

sql server 執(zhí)行循環(huán)插入100萬條數(shù)據(jù),當(dāng)插入10萬條左右時(shí)內(nèi)存溢出了

CREATE TABLE #ta(A1 int,ID bigint NOT NULL IDENTITY(1,1));go

DECLARE @max AS INT, @rc AS INT;

SET @max = 1000000;

SET @rc = 1;

INSERT INTO #ta(A1) select 1

WHILE @rc ceiling(log(@max) / log(2))

BEGIN

INSERT INTO #ta(A1) SELECT 1 FROM #ta;

SET @rc = @rc + 1 ;

END

select @max = @max - @@IDENTITY

INSERT INTO #ta(A1)

SELECT 1 FROM #ta where id = @max

insert into book3

select 'a'+ltrim(str(id)),'b'+ltrim(str(id)),'c'+ltrim(str(id)),'d'+ltrim(str(id)),'e'+ltrim(str(id)),'2-12-2012'

from #ta

GO語(yǔ)言(三十):訪問關(guān)系型數(shù)據(jù)庫(kù)(上)

本教程介紹了使用 Godatabase/sql及其標(biāo)準(zhǔn)庫(kù)中的包訪問關(guān)系數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)。

您將使用的database/sql包包括用于連接數(shù)據(jù)庫(kù)、執(zhí)行事務(wù)、取消正在進(jìn)行的操作等的類型和函數(shù)。

在本教程中,您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),然后編寫代碼來訪問該數(shù)據(jù)庫(kù)。您的示例項(xiàng)目將是有關(guān)老式爵士樂唱片的數(shù)據(jù)存儲(chǔ)庫(kù)。

首先,為您要編寫的代碼創(chuàng)建一個(gè)文件夾。

1、打開命令提示符并切換到您的主目錄。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為 data-access 的目錄。

3、創(chuàng)建一個(gè)模塊,您可以在其中管理將在本教程中添加的依賴項(xiàng)。

運(yùn)行g(shù)o mod init命令,為其提供新代碼的模塊路徑。

此命令創(chuàng)建一個(gè) go.mod 文件,您添加的依賴項(xiàng)將在其中列出以供跟蹤。

注意: 在實(shí)際開發(fā)中,您會(huì)指定一個(gè)更符合您自己需求的模塊路徑。有關(guān)更多信息,請(qǐng)參閱一下文章。

GO語(yǔ)言(二十五):管理依賴項(xiàng)(上)

GO語(yǔ)言(二十六):管理依賴項(xiàng)(中)

GO語(yǔ)言(二十七):管理依賴項(xiàng)(下)

接下來,您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。

在此步驟中,您將創(chuàng)建要使用的數(shù)據(jù)庫(kù)。您將使用 DBMS 本身的 CLI 創(chuàng)建數(shù)據(jù)庫(kù)和表,以及添加數(shù)據(jù)。

您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),其中包含有關(guān)黑膠唱片上的老式爵士樂錄音的數(shù)據(jù)。

這里的代碼使用MySQL CLI,但大多數(shù) DBMS 都有自己的 CLI,具有類似的功能。

1、打開一個(gè)新的命令提示符。

在命令行,登錄到您的 DBMS,如下面的 MySQL 示例所示。

2、在mysql命令提示符下,創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。

3、切到您剛剛創(chuàng)建的數(shù)據(jù)庫(kù),以便您可以添加表。

4、在文本編輯器的 data-access 文件夾中,創(chuàng)建一個(gè)名為 create-tables.sql 的文件來保存用于添加表的 SQL 腳本。

將以下 SQL 代碼粘貼到文件中,然后保存文件。

在此 SQL 代碼中:

(1)刪除名為album表。 首先執(zhí)行此命令可以讓您更輕松地稍后重新運(yùn)行腳本。

(2)創(chuàng)建一個(gè)album包含四列的表:title、artist和price。每行的id值由 DBMS 自動(dòng)創(chuàng)建。

(3)添加帶有值的四行。

5、在mysql命令提示符下,運(yùn)行您剛剛創(chuàng)建的腳本。

您將使用以下形式的source命令:

6、在 DBMS 命令提示符處,使用SELECT語(yǔ)句來驗(yàn)證您是否已成功創(chuàng)建包含數(shù)據(jù)的表。

接下來,您將編寫一些 Go 代碼進(jìn)行連接,以便進(jìn)行查詢。

現(xiàn)在你已經(jīng)有了一個(gè)包含一些數(shù)據(jù)的數(shù)據(jù)庫(kù),開始你的 Go 代碼。

找到并導(dǎo)入一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,該驅(qū)動(dòng)程序會(huì)將您通過database/sql包中的函數(shù)發(fā)出的請(qǐng)求轉(zhuǎn)換為數(shù)據(jù)庫(kù)可以理解的請(qǐng)求。

1、在您的瀏覽器中,訪問SQLDrivers wiki 頁(yè)面以識(shí)別您可以使用的驅(qū)動(dòng)程序。

2、使用頁(yè)面上的列表來識(shí)別您將使用的驅(qū)動(dòng)程序。為了在本教程中訪問 MySQL,您將使用 Go-MySQL-Driver。

3、請(qǐng)注意驅(qū)動(dòng)程序的包名稱 - 此處為github.com/go-sql-driver/mysql.

4、使用您的文本編輯器,創(chuàng)建一個(gè)用于編寫 Go 代碼的文件,并將該文件作為 main.go 保存在您之前創(chuàng)建的數(shù)據(jù)訪問目錄中。

5、進(jìn)入main.go,粘貼以下代碼導(dǎo)入驅(qū)動(dòng)包。

在此代碼中:

(1)將您的代碼添加到main包中,以便您可以獨(dú)立執(zhí)行它。

(2)導(dǎo)入 MySQL 驅(qū)動(dòng)程序github.com/go-sql-driver/mysql。

導(dǎo)入驅(qū)動(dòng)程序后,您將開始編寫代碼以訪問數(shù)據(jù)庫(kù)。

現(xiàn)在編寫一些 Go 代碼,讓您使用數(shù)據(jù)庫(kù)句柄訪問數(shù)據(jù)庫(kù)。

您將使用指向結(jié)構(gòu)的指針sql.DB,它表示對(duì)特定數(shù)據(jù)庫(kù)的訪問。

編寫代碼

1、進(jìn)入 main.go,在import您剛剛添加的代碼下方,粘貼以下 Go 代碼以創(chuàng)建數(shù)據(jù)庫(kù)句柄。

在此代碼中:

(3)使用 MySQL 驅(qū)動(dòng)程序Config和FormatDSN類型以收集連接屬性并將它們格式化為連接字符串的 DSN。

該Config結(jié)構(gòu)使代碼比連接字符串更容易閱讀。

(4)調(diào)用sql.Open 初始化db變量,傳遞 FormatDSN。

(5)檢查來自 的錯(cuò)誤sql.Open。例如,如果您的數(shù)據(jù)庫(kù)連接細(xì)節(jié)格式不正確,它可能會(huì)失敗。

為了簡(jiǎn)化代碼,您調(diào)用log.Fatal結(jié)束執(zhí)行并將錯(cuò)誤打印到控制臺(tái)。在生產(chǎn)代碼中,您會(huì)希望以更優(yōu)雅的方式處理錯(cuò)誤。

(6)調(diào)用DB.Ping以確認(rèn)連接到數(shù)據(jù)庫(kù)有效。在運(yùn)行時(shí), sql.Open可能不會(huì)立即連接,具體取決于驅(qū)動(dòng)程序。您在Ping此處使用以確認(rèn) database/sql包可以在需要時(shí)連接。

(7)檢查來自Ping的錯(cuò)誤,以防連接失敗。

(8)Ping如果連接成功,則打印一條消息。

文件的頂部現(xiàn)在應(yīng)該如下所示:

3、保存 main.go。

1、開始跟蹤 MySQL 驅(qū)動(dòng)程序模塊作為依賴項(xiàng)。

使用go get 添加 github.com/go-sql-driver/mysql 模塊作為您自己模塊的依賴項(xiàng)。使用點(diǎn)參數(shù)表示“獲取當(dāng)前目錄中代碼的依賴項(xiàng)”。

2、在命令提示符下,設(shè)置Go 程序使用的DBUSER和DBPASS環(huán)境變量。

在 Linux 或 Mac 上:

在 Windows 上:

3、在包含 main.go 的目錄中的命令行中,通過鍵入go run來運(yùn)行代碼。

連接成功了!

接下來,您將查詢一些數(shù)據(jù)。


網(wǎng)頁(yè)題目:go語(yǔ)言sql內(nèi)存溢出,golang內(nèi)存溢出例子
網(wǎng)頁(yè)URL:http://weahome.cn/article/hdodpg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部