管理連線
對於絕大多數的程式,您無需調整 sql.DB
連線池預設值。但對於一些進階程式,您可能需要調整連線池參數或明確使用連線。本主題說明如何執行此操作。
sql.DB
資料庫處理程序可供多個 goroutine 同時安全使用(表示處理程序就是其他語言中所謂的「執行緒安全」)。其他一些資料庫存取函式庫基於只能一次用於一個操作的連線。為了彌補這個差距,每個 sql.DB
都會管理一個連線池,其中包含與基礎資料庫的活動連線,並根據需要為 Go 程式中的平行處理建立新的連線。
連線池適用於大多數資料存取需求。當您呼叫 sql.DB
Query
或 Exec
方法時,sql.DB
實作會從池中擷取可用的連線,或在需要時建立一個連線。當不再需要時,套件會將連線傳回池中。這支援資料庫存取的高平行處理。
設定連線池屬性
您可以設定屬性來引導 sql
套件如何管理連線池。若要取得這些屬性的影響統計資料,請使用 DB.Stats
。
設定開啟連線的最大數目
DB.SetMaxOpenConns
對開啟連線的數目施加限制。超過此限制後,新的資料庫操作會等到現有操作完成,屆時 sql.DB
會建立另一個連線。預設情況下,sql.DB
會在需要連線時,在所有現有連線都已使用中時建立新的連線。
請記住,設定限制會使資料庫使用類似於取得鎖定或旗標,結果是您的應用程式可能會因等待新的資料庫連線而陷入僵局。
設定閒置連線的最大數目
DB.SetMaxIdleConns
變更 sql.DB
維護的閒置連線最大數目限制。
當特定資料庫連線上的 SQL 作業完成時,通常不會立即關閉:應用程式可能很快又需要一個,而且保留開啟的連線可避免在下次作業時重新連線至資料庫。預設情況下,sql.DB
會在任何特定時刻保留兩個閒置連線。在平行度高的程式中,提高限制可避免頻繁重新連線。
設定連線可閒置的最長時間
DB.SetConnMaxIdleTime
設定連線在關閉前可閒置的最長時間。這會導致 sql.DB
關閉閒置時間超過指定期間的連線。
預設情況下,當閒置連線新增至連線池時,它會保留在那裡,直到再次需要它。當使用 DB.SetMaxIdleConns
在平行活動期間增加允許的閒置連線數目時,也可以使用 DB.SetConnMaxIdleTime
安排在系統閒置時稍後釋放這些連線。
設定連線的最大使用壽命
使用 DB.SetConnMaxLifetime
設定連線在關閉前可保持開啟的最長時間。
預設情況下,連線可以在任意長的時間內使用和重複使用,但受上述限制約束。在某些系統中,例如使用負載平衡資料庫伺服器的系統中,確保應用程式不會在未重新連線的情況下過度使用特定連線會很有幫助。
使用專用連線
當資料庫可能對在特定連線上執行的作業順序賦予隱含意義時,database/sql
套件包含你可以使用的函式。
最常見的範例是交易,通常以 BEGIN
指令開始,以 COMMIT
或 ROLLBACK
指令結束,並包含在這些指令之間的連線中發出的所有指令,作為整體交易。對於此用例,請使用 sql
套件的交易支援。請參閱 執行交易。
對於其他用例,其中一連串的個別操作都必須在同一個連線中執行,sql
套件提供專用連線。 DB.Conn
取得一個專用連線,也就是 sql.Conn
。sql.Conn
具有方法 BeginTx
、ExecContext
、PingContext
、PrepareContext
、QueryContext
和 QueryRowContext
,這些方法的行為與 DB 上的等效方法相同,但只使用專用連線。使用完專用連線後,您的程式碼必須使用 Conn.Close
釋放它。