go語(yǔ)言中文破解 go破解guan網(wǎng)

golang配制高性能sql.DB

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

成都創(chuàng)新互聯(lián)公司是一家專(zhuān)注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃、成都微信小程序、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動(dòng)互聯(lián)開(kāi)發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立十載以來(lái),已經(jīng)為上千多家成都LED顯示屏各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)?,F(xiàn)在,服務(wù)的上千多家客戶與我們一路同行,見(jiàn)證我們的成長(zhǎng);未來(lái),我們一起分享成功的喜悅。

轉(zhuǎn)自:

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

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

一個(gè)sql.DB對(duì)象就是一個(gè)數(shù)據(jù)庫(kù)連接池,它包含“正在用”和“空閑的”連接。一個(gè)正在用的連接指的是,你正用它來(lái)執(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)記為正在使用。如果池中沒(méi)有空閑連接,而您需要一個(gè)空閑連接,那么Go將創(chuàng)建一個(gè)新的連接。

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

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

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

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

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

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

讓我們來(lái)看看相同的基準(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í)“過(guò)期”,并且在過(guò)期后無(wú)法重用。但注意:

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

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

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

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

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

一旦達(dá)到5個(gè)連接的硬限制,數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序(pq)立即返回一個(gè)太多客戶端連接的錯(cuò)誤消息,而無(wú)法完成INSERT。為了防止這個(gè)錯(cuò)誤,我們需要將sql.DB中打開(kāi)連接的最大總數(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á)到開(kāi)放連接數(shù)限制,并且所有連接都在使用時(shí),應(yīng)用程序需要執(zhí)行的任何新的數(shù)據(jù)庫(kù)任務(wù)都將被迫等待,直到連接標(biāo)記為空閑。例如,在web應(yīng)用程序的上下文中,用戶的HTTP請(qǐng)求看起來(lái)會(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、一般來(lái)說(shuō),更高的MaxOpenConns和MaxIdleConns值將帶來(lái)更好的性能。但你應(yīng)該注意到效果是遞減的,連接池空閑連接太多(連接沒(méi)有被重用,最終會(huì)變壞)實(shí)際上會(huì)導(dǎo)致性能下降。

3、為了降低上面第2點(diǎn)帶來(lái)的風(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ǔ)言怎么輸出字符串中的某個(gè)中文字符?

for index,val := range a {

if val == '好' {

fmt.println(index,x)

}

}

對(duì)string做range得到的val是int32類(lèi)型,直接用單引號(hào)比較就行

go語(yǔ)言u(píng)nresolved type string

這是引入類(lèi)型失敗的錯(cuò)誤提示,

import org.wltea ,說(shuō)明你引入了某個(gè)jar 包或者類(lèi),但是沒(méi)有找到 ,就報(bào)錯(cuò)了.IK analyzer 中文分詞器 開(kāi)源的項(xiàng)目 ,有源碼的.把這個(gè)下載好就可以了。

Go語(yǔ)言之Context

golang在1.6.2的時(shí)候還沒(méi)有自己的context,在1.7的版本中就把golang.org/x/net/context包被加入到了官方的庫(kù)中。中文譯作“上下文”,它主要包含了goroutine 的運(yùn)行狀態(tài)、環(huán)境等信息。

context 主要用來(lái)在 goroutine 之間傳遞上下文信息,包括:同步信號(hào)、超時(shí)時(shí)間、截止時(shí)間、請(qǐng)求相關(guān)值等。

該接口定義了四個(gè)需要實(shí)現(xiàn)的方法:

如果有個(gè)網(wǎng)絡(luò)請(qǐng)求Request,然后這個(gè)請(qǐng)求又可以開(kāi)啟多個(gè)goroutine做一些事情,當(dāng)這個(gè)網(wǎng)絡(luò)請(qǐng)求出現(xiàn)異常和超時(shí)時(shí),這個(gè)請(qǐng)求結(jié)束了,這時(shí)候就可以通過(guò)context來(lái)跟蹤這些goroutine,并且通過(guò)Context來(lái)取消他們,然后系統(tǒng)才可回收所占用的資源。

為了更方便的創(chuàng)建Context,包里頭定義了Background來(lái)作為所有Context的根,它是一個(gè)emptyCtx的實(shí)例。

Background返回一個(gè)非空的Context。它永遠(yuǎn)不會(huì)被取消。它通常用來(lái)初始化和測(cè)試使用,作為一個(gè)頂層的context,也就是說(shuō)一般我們創(chuàng)建的context都是基于Background。

TODO返回一個(gè)非空的Context。當(dāng)不清楚要使用哪個(gè)上下文的時(shí)候可以使用TODO。

他們兩個(gè)本質(zhì)上都是emptyCtx結(jié)構(gòu)體類(lèi)型,是一個(gè)不可取消,沒(méi)有設(shè)置截止時(shí)間,沒(méi)有攜帶任何值的Context。

有了如上的根Context,那么是如何衍生更多的子Context的呢?這就要靠context包為我們提供的With系列的函數(shù)了。

通過(guò)這些函數(shù),就創(chuàng)建了一顆Context樹(shù),樹(shù)的每個(gè)節(jié)點(diǎn)都可以有任意多個(gè)子節(jié)點(diǎn),節(jié)點(diǎn)層級(jí)可以有任意多個(gè)。

WithCancel函數(shù),最常用的派生 context 方法。該方法接受一個(gè)父 context。父 context 可以是一個(gè) background context 或其他 context。

WithDeadline函數(shù),該方法會(huì)創(chuàng)建一個(gè)帶有 deadline 的 context。當(dāng) deadline 到期后,該 context 以及該 context 的可能子 context 會(huì)受到 cancel 通知。另外,如果 deadline 前調(diào)用 cancelFunc 則會(huì)提前發(fā)送取消通知。

WithTimeout和WithDeadline基本上一樣,這個(gè)表示是超時(shí)自動(dòng)取消,是多少時(shí)間后自動(dòng)取消Context的意思。

WithValue函數(shù)和取消Context無(wú)關(guān),它是為了生成一個(gè)綁定了一個(gè)鍵值對(duì)數(shù)據(jù)的Context,這個(gè)綁定的數(shù)據(jù)可以通過(guò)Context.Value方法訪問(wèn)到,一般我們想要通過(guò)上下文來(lái)傳遞數(shù)據(jù)時(shí),可以通過(guò)這個(gè)方法,如我們需要tarce追蹤系統(tǒng)調(diào)用棧的時(shí)候。

使用Context的程序應(yīng)遵循以下規(guī)則,以使各個(gè)包之間的接口保持一致:

1.不要將 Context 塞到結(jié)構(gòu)體里。直接將 Context 類(lèi)型作為函數(shù)的第一參數(shù),而且一般都命名為 ctx。

2.不要向函數(shù)傳入一個(gè) nil 的 context,如果你實(shí)在不知道傳什么,標(biāo)準(zhǔn)庫(kù)給你準(zhǔn)備好了一個(gè) context:todo。

3.不要把本應(yīng)該作為函數(shù)參數(shù)的類(lèi)型塞到 context 中,context 存儲(chǔ)的應(yīng)該是一些共同的數(shù)據(jù)。例如:登陸的 session、cookie 等。

4.同一個(gè) context 可能會(huì)被傳遞到多個(gè) goroutine,別擔(dān)心,context 是并發(fā)安全的。

聽(tīng)說(shuō)Java不適合寫(xiě)外掛,那么go語(yǔ)言適合嗎???為什么?

因?yàn)镴ava是以沙箱機(jī)制運(yùn)行的,進(jìn)程間隔離,要想用Java寫(xiě)外掛也不是完全不可以,只是先得用C/C++編寫(xiě)注入程序(通常是動(dòng)態(tài)鏈接庫(kù)),然后用JNI方式編寫(xiě)其Java擴(kuò)展。

至于Go語(yǔ)言,不太了解。但是外掛主要是指ABI層次的,和語(yǔ)言無(wú)關(guān),只要一種語(yǔ)言的調(diào)用約定符合你要注入的程序的調(diào)用約定(以Windows為例就是WindowsAPI)都可以的(Java就是和C語(yǔ)言的調(diào)用約定不同所以不能直接寫(xiě)外掛)。

關(guān)于注入的技巧,可以中搜這個(gè)文章

Three

Ways

to

Inject

Your

Code

into

Another

Process

或中文《注入代碼的

3

種方法》

golang 開(kāi)源項(xiàng)目

這個(gè)項(xiàng)目可以理解為針對(duì)互聯(lián)網(wǎng)IT人打造的中文版awesome-go。已有的awesome-go項(xiàng)目, 匯總了很多go開(kāi)源項(xiàng)目, 但存在的問(wèn)題是收集太全了, 而且每個(gè)項(xiàng)目沒(méi)有詳細(xì)描述。

本項(xiàng)目作為awesome-go的一個(gè)擴(kuò)展,根據(jù)go語(yǔ)言中文社區(qū)提供的資料,還有互聯(lián)網(wǎng)企業(yè)架構(gòu)設(shè)計(jì)中的常見(jiàn)組件分類(lèi), 共精心挑選了153個(gè)開(kāi)源項(xiàng)目(項(xiàng)目不限于在github開(kāi)源的項(xiàng)目), 分成以下17個(gè)大類(lèi)。

項(xiàng)目初衷是幫助到那些想學(xué)習(xí)和借鑒優(yōu)秀golang開(kāi)源項(xiàng)目, 和在互聯(lián)網(wǎng)架構(gòu)設(shè)計(jì)時(shí)期望快速尋找合適輪子的人。

ps: 以下項(xiàng)目 star數(shù)均大于100 ,且會(huì)定期檢查項(xiàng)目的url,剔除無(wú)效鏈接。 每個(gè)分類(lèi)下的項(xiàng)目會(huì)按照 star數(shù)從高到低 進(jìn)行排列。

名稱(chēng)欄目:go語(yǔ)言中文破解 go破解guan網(wǎng)
標(biāo)題路徑:http://muchs.cn/article16/docdjdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站策劃微信小程序、云服務(wù)器網(wǎng)站設(shè)計(jì)、App開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)