【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

接口作用:

可以实现自定义的连接池

接口内容:

package com.fr.stable.fun;

import com.fr.stable.fun.mark.Immutable;
import com.fr.stable.pool.DataSourceAdapter;

/**
 * Created by daniel on 2017/5/4.
 * 创建连接池适配器的接口
 */
public interface DataSourceProcessor extends Immutable {


    String XML_TAG = "DataSourceProcessor";

    int CURRENT_LEVEL = 1;

    DataSourceAdapter createDataSource();

}

注册方式:

<extra-core>
    <DataSourceProcessor class="com.fr.plugin.****.DataSourceProcessor实现类"/>
</extra-core>

其他:

该接口返回一个DataSourceAdapter的连接池适配器对象

DataSourceAdapter接口内容:
package com.fr.stable.pool;

import javax.sql.DataSource;
import java.sql.SQLException;

/**
 * Created by daniel on 2017/5/4.
 * 连接池适配器
 */
public interface DataSourceAdapter {

    void setDriverClassName(String driverClassName);

    void setUrl(String url);

    void setUsername(String username);

    void setPassword(String password);

    void setInitialSize(int initialSize);

    void setMaxActive(int maxActive);

    void setMaxIdle(int maxIdle);

    void setMinIdle(int minIdle);

    void setMaxWait(long maxWait);

    void setTestOnBorrow(boolean testOnBorrow);

    void setTestOnReturn(boolean testOnReturn);

    void setTestWhileIdle(boolean testWhileIdle);

    void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis);

    void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis);

    void setNumTestsPerEvictionRun(int numTestsPerEvictionRun);

    void setValidationQuery(String validationQuery);

    /*
    *关闭行为
     */
    void close() throws SQLException;

    /**
     * 获取真正的datasource
     * @return
     */
    DataSource get();

    String getDriverClassName();

    int getMaxActive();

    int getMaxIdle();

    int getNumActive();

    int getNumIdle();
}


DBCP的Adapter实现示例:

package com.fr.data.pool;

import com.fr.stable.pool.AbstractDataSourceAdapter;
import com.fr.third.org.apache.commons.dbcp.BasicDataSource;

import java.sql.SQLException;

/**
 * Created by daniel on 2017/5/4.
 */
public class DBCPDataSource extends AbstractDataSourceAdapter {

    private BasicDataSource dataSource;

    public DBCPDataSource(){
        this.dataSource = new BasicDataSource();
    }

    @Override
    public void setDriverClassName(String driverClassName) {
        get().setDriverClassName(driverClassName);
    }

    @Override
    public void setUrl(String url) {
        get().setUrl(url);
    }

    @Override
    public void setUsername(String username) {
        get().setUsername(username);
    }

    @Override
    public void setPassword(String password) {
        get().setPassword(password);
    }

    @Override
    public void setInitialSize(int initialSize) {
        get().setInitialSize(initialSize);
    }

    @Override
    public void setMaxActive(int maxActive) {
        get().setMaxActive(maxActive);
    }

    @Override
    public void setMaxIdle(int maxIdle) {
        get().setMaxIdle(maxIdle);
    }

    @Override
    public void setMinIdle(int minIdle) {
        get().setMinIdle(minIdle);
    }

    @Override
    public void setMaxWait(long maxWait) {
        get().setMaxWait(maxWait);
    }

    @Override
    public void setTestOnBorrow(boolean testOnBorrow) {
        get().setTestOnBorrow(testOnBorrow);
    }

    @Override
    public void setTestOnReturn(boolean testOnReturn) {
        get().setTestOnReturn(testOnReturn);
    }

    @Override
    public void setTestWhileIdle(boolean testWhileIdle) {
        get().setTestWhileIdle(testWhileIdle);
    }

    @Override
    public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
        get().setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
    }

    @Override
    public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
        get().setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
    }

    @Override
    public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
        get().setNumTestsPerEvictionRun(numTestsPerEvictionRun);
    }

    @Override
    public void setValidationQuery(String validationQuery) {
        get().setValidationQuery(validationQuery);
    }

    @Override
    public void close() throws SQLException {
        get().close();
    }

    @Override
    public BasicDataSource get() {
        return dataSource;
    }

    @Override
    public String getDriverClassName() {
        return get().getDriverClassName();
    }

    @Override
    public int getMaxActive() {
        return get().getMaxActive();
    }

    @Override
    public int getMaxIdle() {
        return get().getMaxIdle();
    }

    @Override
    public int getNumActive() {
        return get().getNumActive();
    }

    @Override
    public int getNumIdle() {
        return get().getNumIdle();
    }
}


这里使用适配器的目的是因为DataSource这个接口只有创建连接的方法,其他内置的设置都是各个连接池内部实现的,设计器提供了所有这些设置的方法,只要实现下该连接池下的方法就可以了

实现适配器的时候请继承

AbstractDataSourceAdapter 类来实现,这样可以避免接口变动带来的插件问题

你也可以不实现一些设置方法比如:

@Override
public void setMaxIdle(int maxIdle) {
    //doNothing druid 同学不需要这个
   // get().setMaxIdle(maxIdle);
}

这样的

  • No labels