1 回答

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
您選擇了一個(gè)不好的示例,因?yàn)槟ǔ赜脭?shù)據(jù)庫連接,而不是每次使用時(shí)打開和關(guān)閉一個(gè)數(shù)據(jù)庫連接。因此,您可以將數(shù)據(jù)庫連接傳遞給使用它的函數(shù),并在調(diào)用者中進(jìn)行資源管理,而不需要資源管理器:
// Imports etc omitted for the sake of readability
func PingHandler(db *sql.DB) http.Handler (
? ? return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
? ? ? ?if err := db.ping(); err != nil {
? ? ? ? ? http.Error(w,e.Error(),500)
? ? ? ?}
? ? })
)
func main(){
? ? db,_ := sql.Open("superdb",os.Getenv("APP_DBURL"))
? ? // Note the db connection will only be closed if main exits.
? ? defer db.Close()
? ? // Setup the server
? ? http.Handle("/ping", PingHandler(db))
? ? server := &http.Server{Addr: ":8080"}
? ? // Create a channel for listening on SIGINT, -TERM and -QUIT
? ? stop := make(chan os.Signal, 1)
? ? // Register channel to be notified on said signals
? ? signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
? ? go func(){
? ? ? ? ? ? // When we get the signal...
? ? ? ? ? ? <- stop
? ? ? ? ? ? ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
? ? ? ? ? ? // ... we gracefully shut down the server.
? ? ? ? ? ? // That ensures that no new connections, which potentially
? ? ? ? ? ? // would use our db connection, are accepted.
? ? ? ? ? ? if err := server.Shutdown(ctx); err != nil {
? ? ? ? ? ? ? ? // handle err
? ? ? ? ? ? }
? ? }
? ? // This blocks until the server is shut down.
? ? // AFTER it is shut down, main exits, the deferred calls are executed.
? ? // In this case, the database connection is closed.
? ? // And it is closed only after the last handler call which uses the connection is finished.
? ? // Mission accomplished.
? ? server.ListenAndServe()
}
因此,在這個(gè)示例中,不需要資源管理器,而且老實(shí)說,我想不出真正需要資源管理器的示例。在極少數(shù)情況下,我需要類似的東西,我使用了sync.Pool
.
但是,對于 gRPC 客戶端連接,也無需維護(hù)池:
[...]但是,ClientConn 應(yīng)該自行管理連接,因此如果連接斷開,它將自動重新連接。如果您有多個(gè)后端,則可以連接到其中多個(gè)后端并在它們之間實(shí)現(xiàn)負(fù)載平衡。[...]
因此,同樣的原則適用:創(chuàng)建一個(gè)連接(池),根據(jù)需要傳遞它,確保在完成所有工作后關(guān)閉它。
不要將資源管理隱藏在其他地方,而是盡可能靠近使用資源的代碼并盡可能明確地管理資源。
- 1 回答
- 0 關(guān)注
- 154 瀏覽
添加回答
舉報(bào)