このトピックでは、Java Database Connectivity (JDBC) Druid接続プールを使用してAnalyticDB for MySQLクラスターに接続する方法について説明します。
注意事項
- Druid 1.1.16以降のバージョンのみがサポートされます。
- Druid接続プールを使用してAnalyticDB for MySQLクラスターに接続する場合は、
keepAlive
をtrueに設定することを推奨します。 これにより、接続を再利用して、短期間の接続を防ぐことができます。 - Server Load Balancer (SLB) は、AnalyticDB for MySQLのフロントエンドノードをクライアントに接続するために使用されます。 クライアント要求をフロントエンドノードに均等に送信するには、接続プールで多数の接続を構成し、maxEvictableIdleTimeMillisを小さな値に設定することをお勧めします。
- ビジネス要件に基づいて接続プールの設定を変更し、設定が有効になることを確認します。
DruidDataSource#getStatData()
とDruidDataSource#dump()
を呼び出して、有効な構成情報と接続プール情報を定期的に取得できます。 ログから設定情報を表示および確認することもできます。 - クエリを実行するには、接続プールから接続を取得します。 クエリが完了したら、できるだけ早い機会に
conn.close()
を呼び出して、使用済みの接続を接続プールに戻す必要があります。 次回クエリを実行するときに、接続プールから再度接続を取得できます。 接続が使用後に返されずに無効になった場合、Druidはその無効状態を検出できません。 - ゲートウェイ性能のボトルネック、長いネットワークリンク、ネットワークジッタ、高い再送信率、または高いパケット損失率を伴う複雑なネットワークシナリオでは、接続が閉鎖され得る。 接続プールが適切に構成されていても切断が続く場合は、再試行ポリシーを使用してコードを最適化することを推奨します。
Druid接続プールの設定
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- jdbc_url: 接続先のAnalyticDB for MySQLクラスターのエンドポイント。 エンドポイントは、AnalyticDB for MySQLコンソールの [クラスター情報] ページで取得できます。 -->
<property name="url" value="${jdbc_url}" />
<!-- jdbc_user: AnalyticDB for MySQLクラスターへの接続に使用されるアカウント。 特権アカウントまたは標準アカウントにすることができます。 -->
<property name="username" value="${jdbc_user}" />
<!-- jdbc_password: AnalyticDB for MySQLクラスターへの接続に使用されるアカウントのパスワード。 -->
<property name="password" value="${jdbc_password}" />
<!-接続プールの初期サイズ、および接続の最小数と最大数を設定します。 -->
<property name="initialSize" value="5" />
<property name="minIdle" value="10" />
<property name="maxActive" value="20" />
<!-- 接続プールから接続を取得するためのタイムアウト期間を設定します。 -->
<property name="maxWait" value="60000" />
<!-接続が接続プールでアイドル状態を維持するための最小時間と最大時間を設定します。 単位:ミリ秒。 接続のアイドル時間が最大時間を超えた場合、接続は削除されます。 -->
<property name="minEvictableIdleTimeMillis" value="600000" />
<property name="maxEvictableIdleTimeMillis" value="900000" />
<!-- システムがアイドル接続のクローズを検出する間隔を設定します。 単位:ミリ秒。 デフォルト値は60000です。 値が高いと、Druid接続プールが切断を検出できなくなる場合があります。 -->
<property name="timeBetweenEvictionRunsMillis" value="2000" />
<!-- 接続プールから接続を取得するたびに、アイドル時間がtimeBetweenEvictionRunsMillisの値よりも大きい接続の有効性を確認するかどうかを指定します。 値がtrueの場合は、接続の有効性がチェックされていることを示します。 値がfalseの場合は、接続の有効性がチェックされていないことを示します。 -->
<property name="testWhileIdle" value="true" />
<!-- 接続を取得するたびに接続の有効性を確認し、接続プールに接続を返すかどうかを指定します。 -->
<!-- これらのパラメータは、非常に重要または信頼性の低いネットワークシナリオでのみ指定します。 それ以外の場合は、これらのパラメーターをtestWhileIdleおよびtimeBetweenEvictionRunsMillisに置き換えることをお勧めします。 -->
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 通常のキープアライブ操作を設定するかどうかを指定し、キープアライブ間隔を設定します。 -->
<property name="keepAlive" value="true" />
<property name="keepAliveBetweenTimeMillis" value="30000" /> <!-- キープアライブ間隔のデフォルト値は120000です。 単位:ミリ秒。 -->
<!-接続を使用できる最大回数を指定します。 これにより、接続の長期使用によるサーバーの負荷の偏りを防ぎます。 -->
<property name="phyMaxUseCount" value="1000" />
<!-- 接続の有効性をテストおよび検証するために使用されるクエリを指定します。 Druidの新しいバージョンでは、このパラメーターはデフォルトでmysqlPingに置き換えられます。->
<property name="validationQuery" value="select 1" />
<!-- 統計のモニタリングに使用されるフィルターを指定します。 -->
<property name="filters" value="stat" />
</bean>
検証クエリ
Druidの新しいバージョンでは、validationQueryパラメーターはデフォルトでmysqlPingに置き換えられます。 validationQueryパラメーターを使用するには、次の設定を実行します。
druidDataSource.init();
Properties properties = new Properties();
properties.setProperty("druid.mysql.us ePingMethod", "false");
druidDataSource.setConnectProperties (プロパティ);
接続プールの情報を取得する
dataSource.dump()
を呼び出して、接続プールと接続の基本情報を取得できます。 {
CreateTime:"2022-06-01 15:28:10" 、# 接続プールが作成された時刻。
ActiveCount:0, # 接続プールから取得され、使用されている接続の数。
PoolingCount:2、# 接続プールに残っている接続の数。
CreateCount:2、# 破棄後に再作成される接続を含む、作成された接続の数。
DestroyCount:0, # 接続例外または有効期限のために破壊された接続を含む、破壊された接続の数。
CloseCount:4, # conn.close() を呼び出すことによって接続プールに返される接続の数。
ConnectCount:4, # dataSource.getConnection() を呼び出すことによって接続が取得される回数。
接続数: [
{
ID:525571, # 接続のID。
ConnectTime:"2022-06-01 15:28:11" 、# 接続が作成された時刻。
UseCount:0, # 接続が使用のために取得された回数。 すべての接続のUseCount値の合計は、ConnectCountの値に等しくなります。
LastActiveTime:"2022-06-01 15:28:11"# 接続が最後に取得されて使用される時刻。 この接続が使用されない場合、LastActiveTimeの値はConnectTimeの値と同じです。
},
{ID:1263877414、ConnectTime:"2022-06-01 15:28:11" 、UseCount:4、LastActiveTime:"2022-06-01 15:28:11"}
]
}
有効な接続プール設定の取得
dataSource.getStatData()
を呼び出して、有効な接続プール設定を取得します。 {
Identity=85777802、
名前=DataSource-85777802、
DbType=mysql、
DriverClassName=com.mysql.jdbc.Driver、
URL=jdbc:mysql:// host:port/db_name、
UserName=haicen、
FilterClassNames=[] 、
WaitThreadCount=0、
NotEmptyWaitCount=0、
NotEmptyWaitMillis=0、
PoolingCount=2、
PoolingPeak=2、
PoolingPeakTime=6月1日水曜日16:08:15 CST 2022、
ActiveCount=0、
ActivePeak=1、
ActivePeakTime=6月1日水曜日16:08:15 CST 2022、
InitialSize=1、
MinIdle=2、
MaxActive=3、
QueryTimeout=0、
TransactionQueryTimeout=0、
LoginTimeout=0、
ValidConnectionCheckerClassName=com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker、
ExceptionSorterClassName=com.alibaba.druid.pool.vendor.MySqlExceptionSorter、
TestOnBorrow=true、
TestOnReturn=true、
TestWhileIdle=true、
DefaultAutoCommit=true、
DefaultReadOnly=null、
DefaultTransactionIsolation=null、
LogicConnectCount=14、
LogicCloseCount=14、
LogicConnectErrorCount=0、
PhysicalConnectCount=6、
PhysicalCloseCount=4、
PhysicalConnectErrorCount=0、
DiscardCount=0、
ExecuteCount=14、
ExecuteUpdateCount=0、
ExecuteQueryCount=14、
ExecuteBatchCount=0、
ErrorCount=0、
CommitCount=0、
RollbackCount=0、
PSCacheAccessCount=0、
PSCacheHitCount=0、
PSCacheMissCount=0、
StartTransactionCount=0、
TransactionHistogram=[
J @ 6a472554、
ConnectionHoldTimeHistogram=[
J @ 7ff2a664,
RemoveAbandoned=true、
ClobOpenCount=0、
BlobOpenCount=0、
KeepAliveCheckCount=332、
KeepAlive=true、
FailFast=false、
MaxWait=6000、
MaxWaitThreadCount=-1、
PoolPreparedStatements=false、
MaxPoolPreparedStatementPerConnectionSize=10、
MinEvictableIdleTimeMillis=600000、
MaxEvictableIdleTimeMillis=900000、
LogDifferentThread=true、
RecycleErrorCount=0、
PreparedStatementOpenCount=0、
PreparedStatementClosedCount=0、
UseUnfairLock=false、
InitGlobalVariants=false、
InitVariants=false
}