ホームページ  >  記事  >  バックエンド開発  >  golang mysql データベース接続プールを理解します。

golang mysql データベース接続プールを理解します。

藏色散人
藏色散人転載
2021-05-11 11:32:542900ブラウズ

以下は、golang チュートリアル コラムからの golang mysql データベース接続プールの紹介です。困っている友人の役に立てば幸いです。

最近、Go 言語の ORM を使用してデータベース操作を行っていましたが、最終的に無効な接続と呼ばれるバグを見つけたので、接続プールと mysql のタイムアウトについて学習しました。 go ORM.mysql を使用して説明します (言語はすべて接続されており、原則は同じである必要があることを理解しています)。

データベースを追加、削除、変更、確認する場合、最初のステップはデータベースに接続することです

//conn the database
func ConnDb(dbConnString string, dbName string) error {
	maxIdle := 50
	maxConn := 50
	err := orm.RegisterDataBase(dbName, "mysql", dbConnString+"?charset=utf8&loc=Asia%2FShanghai", maxIdle, maxConn)

	if err != nil {
		util.GLogger.Errorw("in Connect DB", "err", err)
	}
	return err
}

ここでの接続は mysql データベースです。設定される最大接続プールは次のとおりです。 50. アイドル接続の最大数は 50 です。

この接続プールは主に何をするのですか?簡単に言うと、データベースからデータを取得してデータを変更したい場合は、データベースとのパイプラインを確立する必要があります。これは、ネットワーク接続を確立することです。TCP 接続には時間がかかることは誰もが知っています。このパイプラインを構築するのにある程度の時間がかかりました。どうすればそれを捨てずに取り出して使用できますか?接続プールは、これらの確立されたパイプが保存される場所です。値 50 は、単純に最大 50 パイプとして理解できます。大きすぎると、より多くのメモリを占有するため、大きいほど良いことに注意してください。もちろん、メモリを多く消費し、小さすぎるとブロック待ちが発生します。

これらのパイプは接続プールに配置されているため、アイドル接続はこれらのアイドル パイプを参照し、アイドル接続の値設定が接続プールのサイズより大きくないことは明らかです。接続が大きくなると、プールはアイドル状態の接続パイプをあまり節約できなくなるためです。

これらの簡単な概念を理解した後、データベースにアクセスするときのワークフローはどのようなものになるでしょうか?

#この図を通して、接続アクセス プロセス全体を明確に見ることができます。

step1 (利用可能な接続を取得する) 接続プールに移動して、利用可能なアイドル状態の接続を見つけます。アイドル状態の接続がない場合は、接続プールがいっぱいかどうかを確認します。そうでない場合は、新しい接続を作成します。接続がいっぱいである場合は、接続が解放されるのを待ちます。もちろん、アイドル状態の接続がある場合は、接続の有効期限が切れているかどうかを直接判断します。有効期限が切れていない場合は、直接使用されます。有効期限が切れた場合は、接続が期限切れになります。接続プールが満杯かどうかを再判断します。いいえ、満杯の場合は、新しい接続を作成し、満杯になるまで待ちます。

step2 (操作データベース) この接続を取得した後、追加、削除、変更、およびクエリの操作を実行します。

step3 (接続の解放) データベースの操作後、接続を解放する必要がありますが、解放された接続はアイドル状態になります。アイドル状態の接続数を超えた場合は、直接接続が切断されます。そうでない場合は、接続が切断されます。待機に使用されます。

次に、この接続が失敗することに気づくでしょう:

mysql データベースのタイムアウト、データベースとの接続を確立するとき、データベースは常にあなたを信頼できるわけではなく、データベースはタイムアウト、つまり、この時間が経過すると、あなたの接続は信頼されません。もう一度接続する必要があります。次のように、データベースによって設定されているさまざまなタイムアウト ステートメントを確認してください:

show variables like  '%timeout%';

その中には 2 つあります。タイムアウト: インタラクティブ接続タイムアウト (interactive_timeout) および非インタラクティブ接続タイムアウト (wait_timeout)

インタラクティブ接続: コマンド ラインを介して mysql に接続します

非インタラクティブ接続: に接続します。プログラム内の mysql

そして、この非対話型タイムアウトは、接続プール内のアイドル接続のアイドル時間が wait_timeout 設定を超えた場合に発生します。このとき、プログラムがアイドル状態の接続を取得してクエリを実行すると、無効な接続という元の問題が発生します。

基本原則を理解した後、無効な接続に対する解決策は非常に簡単です:

1. データベースの wait_timeout 時間を延長します。

2. プログラムは定期的にこれらの失敗した接続をチェックし、適時に破棄しますが、ここでのプログラムのチェック時間は、mysql によって設定された wait_timeout 値よりも短い必要があることに注意してください。

上記は接続プールに関する私の理解です。間違いがあればご指摘ください。ありがとうございます~

以上がgolang mysql データベース接続プールを理解します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。