ドルイドはじめに:
高い並行性のシナリオの下で、接続プールを解決するように見える、パフォーマンス・オーバーヘッドのための各要求は、ときに、データベース接続プログラムを作成し、要求の応答時間を増やしています。以前にC3P0接続プール、およびそれ以降のドルイド懸念接続プールを使用する、分割は、監視及び生データベース接続プールとして知られているAlibabaのデータベースを生成しました。他の接続プールと比較して、リッチ、多次元データの監視を提供します。
ドルイドGitのソースアドレス:github.com/alibaba/dru ...
ドルイドの初期化:
共通の属性は、説明を名詞:
url :数据库地址,通过前缀指定驱动类型。
username :数据库用户名
password :数据库密码
initialSize :连接池初始化大小
maxActive :连接池最大连接数
maxWait :获取连接最大等待时间
testOnBorrow :获取连接时是否检测连接是否有效
testOnReturn :回收连接时是否检测连接是否有效
testWhileIdle :获取连接时是否检测连接连接空闲时间超过
timeBetweenEvictionRunsMillis,超过则检测连接
timeBetweenEvictionRunsMillis :DestroyConnectionThread线程(定时检测连接有效性)
执行间隔(Sleep控制)
minEvictableIdleTimeMillis :连接再线程池中最小存活时间
removeAbandoned :是否开启线程活动时间超过removeAbandonedTimeout,进行丢弃
removeAbandonedTimeout :活动线程最大存活时间,超过直接丢弃(单位分钟)。
logAbandoned :关闭abandon连接是否打印日志。
filters :需要启用Druid的过滤器。
connectionInitSqls :连接时需要设置的mysql参数,例:set names utf8mb4;asyncInit :是否异步初始化连接池
createScheduler :初始化连接的线程池
validationQuery :创建连接校验连接是否有效执行的sql语句
keepAlive :是否创建空闲连接
minIdle :最小空闲连接数
复制代码
スプリングは、データソースで構成することができ、直接initメソッドのinitメソッドのプロパティを呼び出します。
<bean name="readDataSource1" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">复制代码
手動で初期化を呼び出さない場合は、最初の呼び出しの際にデータソースgetConnectionメソッドは、初期化を完了するために、初期化ロジックをトリガーします。
public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
init();
if (filters.size() > 0) {
FilterChainImpl filterChain = new FilterChainImpl(this);
return filterChain.dataSource_connect(this, maxWaitMillis);
} else {
return getConnectionDirect(maxWaitMillis);
}
}复制代码
DruidDataSourceの初期化は、一般的にいくつかのことをしました:
1.プロセス・パラメータ値の定義。jdbcUrlとタイプの決意データベース(MySQLやOracleが)、彼らは初期化され、有効であるかどうかを確認し、フィルタドライバをロードするように構成します。
2.検出器を初期化し、などの接続検出のために有効で、クエリが有効な検出器です。
3. データソースの統計オブジェクトインスタンス化JdbcDataSourceStatは、データ・ストレージ・センターです!JdbcDataSourceStat。Druid连接池以监控闻名,
4.各接続が検出された生きた後、データベース接続、ドロップされた接続を記憶し、3つの配列を初期化し、データベース接続を初期化します。初期3つのスレッドは、スレッドがデータベース接続を生成し、ログインしている、との接続がタイムアウトするかどうかを検出します。
DruidDataSourceは、いくつかのキーポイントを初期化します。
接続プールを初期化します
if (createScheduler != null && asyncInit) {
for (int i = 0; i < initialSize; ++i) {
submitCreateTask(true);
}
} else if (!asyncInit) {
// init connections
while (poolingCount < initialSize) {
try {
PhysicalConnectionInfo pyConnectInfo = createPhysicalConnection();
DruidConnectionHolder holder = new DruidConnectionHolder(this, pyConnectInfo);
connections[poolingCount++] = holder;
} catch (SQLException ex) {
LOG.error("init datasource error, url: " + this.getUrl(), ex);
if (initExceptionThrow) {
connectError = ex;
break;
} else {
Thread.sleep(3000);
}
}
}
if (poolingCount > 0) {
poolingPeak = poolingCount;
poolingPeakTime = System.currentTimeMillis();
}
}复制代码
プロパティが設定されている場合createScheduler(スレッドプール)、asyncInit(ブール)、及びasyncInit真非同期初期化、遮断逆にメインスレッドを初期化が完了するまで。現在の行のためのpoolingCountプールサイズ。
private void submitCreateTask(boolean initTask) {
createTaskCount++;
//创建生成连接的Runnable任务
CreateConnectionTask task = new CreateConnectionTask(initTask);
if (createTasks == null) {
//long类型数组用于存放Runnable任务
createTasks = new long[8];
}
boolean putted = false;
for (int i = 0; i < createTasks.length; ++i) {
if (createTasks[i] == 0) {
createTasks[i] = task.taskId;
putted = true;
break;
}
}
if (!putted) {
//当createTasks数组满时,扩容为之前数组大小的1.5倍。
long[] array = new long[createTasks.length * 3 / 2];
System.arraycopy(createTasks, 0, array, 0, createTasks.length);
array[createTasks.length] = task.taskId;
createTasks = array;
}
//丢进线程池执行
this.createSchedulerFuture = createScheduler.submit(task);
}复制代码
方法createPhysicalConnection()が成立する実際の接続への参照を返します
場合asyncInit場合falseに構成された、以下のように、whileループ、コアコードによって作成された接続であります
while (poolingCount < initialSize) {
try {
PhysicalConnectionInfo pyConnectInfo = createPhysicalConnection();
DruidConnectionHolder holder = new DruidConnectionHolder(this, pyConnectInfo);
connections[poolingCount++] = holder;
} catch (SQLException ex) {
LOG.error("init datasource error, url: " + this.getUrl(), ex);
if (initExceptionThrow) {
connectError = ex;
break;
} else {
Thread.sleep(3000);
}
}
}复制代码
ロジックスレッドプールモードと一致しています。
これはドルイドスレッドプール、接続の数を指定した従来の構成と初期化パラメータを完了する。作成した残りの3つのスレッドは、分析を継続するために次の章に残してありますが、
注意:制限のレベルに基づいて、ちょうど自分自身の促進のための文書は、矛盾をアドバイスしてください。(不正転送の禁止)