connection
コネクション
#WIP
DB接続の永続化
DBにアクセスする際、毎回以下のような流れが発生する
DBとのコネクションを新規作成
e.g.
TCP 3 way handshake
DB層のhandshake
DB層の認証
DBの接続用prosess/thread生成
etc.
この部分の処理が非常に重い
TLSのhandshakeだけでも100msぐらいかかる
クエリを送信
結果を受信
接続を終了
接続を維持し続ける
アプリケーション起動時に、10個くらいのDB接続を作っておく(プール)
各HTTPリクエストやバッチ処理がDBにアクセスするとき、その中から空いている接続を借りて使う
終わったら切断せずに、接続を元のプールに戻す
プール内の接続は アプリケーションが落ちるまでずっとDBとつながった状態である
つまり、TCPソケットもTLSも切断されていない状態で、再利用され続ける
2種類ある?
https://blog.yuuk.io/entry/architecture-of-database-connection#:~:text=とは異なる%E3%80%82-,データベース接続の永続化手法,-これらの接続オーバヘッド
WebApp Serverのreq処理中だけ、DBとの接続を永続化
reqのたびに新しく作るということ?
これのことを永続化って言えるのか
1回のreqの中で、複数個のSQLを打つ場合ってことか
流れ
WebApp Serverがリクエスト処理を開始
最初のDB接続後にDBオブジェクトのようなものをメモリ上に保持
req処理終了前にDBオブジェクトを破棄
接続をclose
常時接続を永続化する
アプリケーションのglobal空間に、DBとの接続したままのDB handler objectを保持しておき、破棄せずに使いまわす
connection数の上限
https://blog.yuuk.io/entry/architecture-of-database-connection#:~:text=あるだろう%E3%80%82-,コネクションプーリングとはなにか,-コネクション
2種類の制限がある
Linux kernelのポート数やファイルディスクリプタ数の上限
DB層での接続数の上限
その対策
Connection Poolを使う
https://dev.mysql.com/doc/internals/en/connection-phase.html
mysqlでconnection確立時にやっていること
#??
どういう概念
誰の責務?
どれぐらいconnection数を持つものなのか
どれぐらいのコストがあるのか
度の本に書いてあるのか
Webシステムにおけるデータベース接続アーキテクチャ概論 - ゆううきブログ
わかりやすい。最初に読むと良い
他ページへのリンクもある