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