golang接続mysqlデータベースは、必要性は、このライブラリにライブラリがgithub.com/go-sql-driver/mysqlサードパーティ製を使用するMySQLの接続プールを実現している、とだけ実現することができる2つのパラメータを設定する必要があります
一般的なMySQLの接続が最初にsql.Open関数を呼び出しますが、今回は、MySQLへの実際の接続はありませんが、唯一のオブジェクトDbがのみ作成されます。クエリまたはExecの方法を実行すると、データベースへの実際の接続になります。
デフォルトでは。各実行SQL文が実行端が接続を切断します、TCP接続を作成しますが、接続は、2つのアイドルのままになります。あなたが最初のアイドル状態の接続と、SQLの実行次回は、十分な時間は、接続を作成するために行きます。
この2つのクラスDbとのパラメータを設定すると、実際に接続プールを達成することができます。
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)
SetMaxOpenConns(10)接続の最大数は、ノートにある集合、あなただけの10のTCP接続まで作成することができますどのくらいの同時実行に関係なく、もポイントですSQLを実行するときに行ならば、接続は、行オブジェクトに転送していることです近くに、この接続は少なく、他の同時接続がライブにブロックされるより取得し、バックプールではありませんしません。
SetMaxIdleConns(5)は、これらの実装は、それはまだ大きなを保持するSQL文を終了した場合でも、完全にアイドル状態の接続を実行するように設定されています
プロセス・テストは、ウィンドウを開き、最初のコード100の同時実行SQLのすべての、つまりポート3306のTCP接続を確認するために、状況にnetstatの表情を保ち実装は5になります後、あなたは、10のTCP接続上で最大のを見ることができますホールドを接続すると、データがアイドル状態の接続が維持さそうということは、MySQLに渡され、10秒ごとに、tcpdumpの要求データポート3306、接続のアイドル時間を表示するには、ウィンドウを開きます。
mysqlClient.goは
最初のGitHubパッケージで引っ張る必要があり、行くGET github.com/go-sql-driver/mysql
パッケージメイン インポート( " データベース/ SQL " " FMT " " 時間" _ " github.com/go-sql-driver/mysql " ) FUNCのmain(){ デシベル、_: = sql.Open(" mysqlの"、" ルート:123456 @ TCP(127.0.0.1:3306)/ gocron " ) db.SetMaxOpenConns(10 ) db.SetMaxIdleConns(5。 ) // 接続されたデータベースクエリ のための I:= 0 ; I < 100 ; I ++ { 外出先でFUNC(I int型){ MSQL: = " ユーザーからの選択* " 行、_: = db.Query(MSQL) rows.Closeは()// あなたがプールへの接続を解放していない場合は、ここで、他の5回の同時実行がブロックされます FMT .Println(「第一」、I) }(私) } 用{ 時間 .Sleep(時間.Second) } }
netstatのままウィンドウを開き
クリアを行う; trueにしばらく日付を、netstatコマンド-altupnを| 3306をgrepする| grepのクライアントを、SLEEP 1を、DONE
アイドル状態の接続要求を表示するには、ウィンドウを開くのtcpdump、データは15秒ごとに要求
-i LOポート3306 -vvをtcpdumpの