1.データベース接続プールとは何ですか?
公式:
データベース接続プールは、プログラムの開始時に十分なデータベース接続を確立するためのものであり、これらの接続は接続プールを形成し、プログラムはプール内の接続を動的に適用、使用、および解放します。
言葉:
データベース接続の作成は非常に時間のかかる操作であり、データにセキュリティリスクを簡単に引き起こす可能性があります。したがって、プログラムが初期化されると、複数のデータベース接続が一元的に作成され、プログラムで使用できるように一元管理されます。これにより、データベースの読み取りと書き込みの速度が向上し、安全性と信頼性が向上します。
2.なぜデータベース接続プールが必要なのですか?
""最初に2つの写真の比較を見てください
----->
接続プールを使用せずにSQLステートメントを実行するために必要なネットワークの相互作用
SQLステートメントが実行されるたびに、ネットワークの相互作用には次のものが含まれます
。1)TCP接続確立の3方向ハンドシェイク(クライアントとmysqlサーバー間の接続はTCPプロトコルに基づいています)。
2)MySQL認証のためのスリーウェイハンドシェイク。
3)実際のSQLの実行。
4)MySQLをシャットダウンします。
5)TCPの4つの波が閉じます。
----->
接続プールシナリオを使用する
最初の訪問で接続を確立する必要がありますが、その後の訪問では、以前に作成された接続が再利用され、SQLステートメントが直接実行されます。
「接続プールを使用する利点
1)リソースの再利用
データベース接続が再利用されるため、接続の頻繁な作成と解放によるパフォーマンスのオーバーヘッドが回避されます。システム消費の削減に基づいて、システム動作環境の安定性も向上します。(メモリの断片化と一時的なデータベースプロセス/スレッドの数を減らします)。
2)システム速度の高速
化データベース接続プールの初期化中に、複数のデータベース接続が作成され、スタンバイ用にプールに配置されることがよくあります。この時点で、接続の初期化は完了しています。ビジネス要求処理の場合、既存の使用可能な接続を直接使用して、データベース接続の初期化および解放プロセスのオーバーヘッドを回避し、それによってシステムの全体的な応答時間を短縮します。
3)データベース接続リークを回避するための統合接続管理
比較的完全なデータベース接続プールの実装では、事前に設定された接続占有タイムアウトに従って、占有された接続を強制的に回復できます。これにより、従来のデータベース接続操作で発生する可能性のあるリソースリークが回避されます。
3、データベース接続プールの操作メカニズム
》》接続プールの動作メカニズム
- 接続プールから使用可能な接続を取得または作成します。
- 使用後、接続は接続プールに戻されます。
- システムをシャットダウンする前に、すべての接続を切断し、占有されているシステムリソースを解放してください。
》》接続プールとスレッドプールの違い
接続プール:パッシブ使用。
スレッドプール:キューからタスクをアクティブかつ継続的に実行します。
》》MySQL接続に必要な要素
ホストIP、ホストポート、ユーザー名、パスワード。
4、接続プール接続番号の設定
参考計算式:接続数=(コア数* 2)+有効ディスク数
5、接続プールの設計アイデア
》》接続プールの設計思想
1)データベースへの接続には、ホストIP、ホストポート、ユーザー名、パスワード、データベース名が含まれます。データベースへの各接続は独立しています。
2)リストなどのキュー管理接続が必要です。
3)接続リソースを要求します。
4)接続リソースを返します。
》》適切な接続プールを設計する際に考慮する必要のある要素
1)再接続メカニズムと再接続時間の統計。
2)接続の総数の統計。
3)1、5、および15秒ごとに1回カウントするなどのピーク接続の数、およびその後のパフォーマンス評価のための接続のピーク数。
4)タイムアウトメカニズム、ブロッキングモードと非ブロッキングモードなど。
6、いくつかの重要なソースコード
》》複数の接続を作成する
int CDBPool::Init()
{
for (int i = 0; i < conn_num; i++)
{
CDBConn *pDBConn = new CDBConn(this);
int ret = pDBConn->Init();
if (ret)
{
delete pDBConn;
return ret;
}
m_conn_list.push_back(pDBConn);
}
return 0;
}
》》データベースに接続します
CDBConn::CDBConn(CDBPool *pPool)
{
m_pDBPool = pPool;
m_mysql = NULL;
}
int CDBConn::Init()
{
m_mysql = mysql_init(NULL);
if (!m_mysql)
{
return 1;
}
my_bool reconnect = true;
// 配合mysql_ping实现自动重连
//从MySQL 5.0.3开始默认情况下禁止再连接;这是5.0.13中的新选项,提供了一种以显式方式设置再连接行为的方法
mysql_options(m_mysql, MYSQL_OPT_RECONNECT, &reconnect);
mysql_options(m_mysql, MYSQL_SET_CHARSET_NAME, "utf8mb4");
if (!mysql_real_connect(m_mysql, m_pDBPool->GetDBServerIP(), m_pDBPool->GetUsername(), m_pDBPool->GetPasswrod(),
m_pDBPool->GetDBName(), m_pDBPool->GetDBServerPort(), NULL, 0))
{
return 2;
}
return 0;
}