MySQL接続プールの原理と設計

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;
}

おすすめ

転載: blog.csdn.net/locahuang/article/details/110354958