【仅供内部供应商使用,不提供对外解答和培训】
【仅供内部供应商使用,不提供对外解答和培训】
可以实现自定义的连接池
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);
}
这样的