第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何使用連接池將 mgo 會(huì)話轉(zhuǎn)換為 mongo-go-driver 客戶端?

如何使用連接池將 mgo 會(huì)話轉(zhuǎn)換為 mongo-go-driver 客戶端?

Go
忽然笑 2023-07-26 13:38:24
很久很久以前,當(dāng)我們使用 mgo.v2 時(shí),我們創(chuàng)建了一些包裝函數(shù)來(lái)復(fù)制會(huì)話、設(shè)置讀取首選項(xiàng)并返回該函數(shù)以供其他庫(kù)使用,例如func NewMonotonicConnection() (conn *Connection, success bool) {    conn := &Connection{        session: baseSession.Copy(),    }    conn.session.SetMode(mongo.Monotonic, true)    return conn, true}現(xiàn)在,我們只需在 init 函數(shù)中傳遞默認(rèn)客戶端(使用 mongo.Connect 初始化并傳遞到連接單例中),然后像這樣使用:func NewMonotonicConnection() (conn *Connection, success bool) {    conn = defaultConnection    return conn, true}我的理解是,要利用連接池,您需要使用相同的客戶端(包含在 defaultConn 中),并且會(huì)話現(xiàn)在在 / .All()cursor 拆卸內(nèi)部隱式處理。如果我在這里錯(cuò)了,請(qǐng)糾正我。如果我們?nèi)匀豢梢栽谶@些連接上設(shè)置 readpref(例如,在返回之前在此連接上設(shè)置 NearestMode),那就太好了,但是社區(qū)/標(biāo)準(zhǔn)的做法是什么?我知道我可以一遍又一遍地調(diào)用 mongo.Connect,但是那貴嗎?我可以創(chuàng)建不同的客戶端 - 每個(gè)客戶端都有不同的 readpref - 但我在想,如果在該連接上發(fā)生寫(xiě)入,它永遠(yuǎn)不會(huì)返回從從屬設(shè)備讀取??雌饋?lái)我*可以顯式創(chuàng)建會(huì)話,但我不確定我應(yīng)該或者在新驅(qū)動(dòng)程序中顯式管理這些會(huì)話是否有任何影響。
查看完整描述

1 回答

?
qq_花開(kāi)花謝_0

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊

在這個(gè)任務(wù)中,我通過(guò) mongo-go-driver 代碼庫(kù)學(xué)到了一些東西,我認(rèn)為在結(jié)束這個(gè)問(wèn)題之前我應(yīng)該與世界分享這些東西。如果我錯(cuò)了 - 請(qǐng)糾正我。

Connect()如果您想利用連接池,則不應(yīng)一遍又一遍地調(diào)用。看起來(lái)每次調(diào)用 Connect() 時(shí)都會(huì)創(chuàng)建一個(gè)新套接字。defer Close()這意味著隨著時(shí)間的推移,除非您每次都手動(dòng)進(jìn)行操作,否則存在套接字耗盡的風(fēng)險(xiǎn)。

All()在 mongo-go-driver 中,當(dāng)您調(diào)用執(zhí)行查詢時(shí)(例如),會(huì)話會(huì)在幕后自動(dòng)處理。您可以*顯式地創(chuàng)建和拆除會(huì)話,但您不能使用我上面提出的單例方法來(lái)使用它,而不必更改所有調(diào)用方函數(shù)。這是因?yàn)槟鸁o(wú)法再在會(huì)話上調(diào)用查詢操作,而是必須在數(shù)據(jù)庫(kù)操作本身上使用 WithSession 函數(shù)來(lái)使用它

我意識(shí)到writeconcern,readprefreadconcern都可以設(shè)置為:

  • 客戶端級(jí)別(如果不覆蓋,這些是所有內(nèi)容都將使用的默認(rèn)值)

  • 會(huì)話級(jí)別

  • 數(shù)據(jù)庫(kù)級(jí)

  • 查詢級(jí)別

所以我所做的是創(chuàng)建數(shù)據(jù)庫(kù)選項(xiàng)并重載 *mongo.Database 例如:

// Database is a meta-helper that allows us to wrap and overload

// the standard *mongo.Database type

type Database struct {

    *mongo.Database

}


// NewEventualConnection returns a new instantiated Connection

// to the DB using the 'Nearest' read preference.

// Per https://github.com/go-mgo/mgo/blob/v2/session.go#L61

// Eventual is the same as Nearest, but may change servers between reads.

// Nearest: The driver reads from a member whose network latency falls within

// the acceptable latency window. Reads in the nearest mode do not consider

// whether a member is a primary or secondary when routing read operations;

// primaries and secondaries are treated equivalently.

func NewEventualConnection() (conn *Connection, success bool) {

    conn = &Connection{

        client: baseConnection.client,

        dbOptions: options.Database().

            SetReadConcern(readconcern.Local()).

            SetReadPreference(readpref.Nearest()).

            SetWriteConcern(writeconcern.New(

                writeconcern.W(1))),

    }


    return conn, true

}

// GetDB returns an overloaded Database object

func (conn Connection) GetDB(dbname string) *Database {

    dbByName := &Database{conn.client.Database(dbname, conn.dbOptions)}

}

這使我能夠利用連接池并保持與我們的代碼庫(kù)的向后兼容性。希望這對(duì)其他人有幫助。


查看完整回答
反對(duì) 回復(fù) 2023-07-26
  • 1 回答
  • 0 關(guān)注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)