ドルイドの単純な分析接続プールの初期化(A)

ドルイドはじめに

高い並行性のシナリオの下で、接続プールを解決するように見える、パフォーマンス・オーバーヘッドのための各要求は、ときに、データベース接続プログラムを作成し、要求の応答時間を増やしています。以前に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()が成立する実際の接続への参照を返します

オブジェクトPhysicalConnectionInfo、プロパティの構成によれば、データベース接続を作成します。接続を初期化(自動コミットするかどうか、あなたが作成した後にトランザクション分離レベルを設定し、実行前
connectionInitSqls文で提供されるデータの量 )、妥当性チェックを構成するSQL文を実行されます。

DruidDataSourceが生成され、PhysicalConnetionInfoを返さ 
DruidConnectionHolderオブジェクト(セルの実際の動作をオブジェクトのリンク)、プールは、接続プール・サイズと等しくなるまでアレイに接続されている INITIALSIZE。

場合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つのスレッドは、分析を継続するために次の章に残してありますが、


注意:制限のレベルに基づいて、ちょうど自分自身の促進のための文書は、矛盾をアドバイスしてください。(不正転送の禁止)


おすすめ

転載: juejin.im/post/5d67bd8ef265da03b5745ef6