管理連線
對於絕大多數程式,您無需調整 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
釋放它。