需求
1. 使用dbcp 数据库连接池,可以配置连接有效性检测配置。现在使用的boneCP没有这样的机制,并且pool实例是lazy初始化,只有查库时才能确定连接池是否正常。
2. 多数据源的情况下,如何自动适配检测所有boneCP。
解决方案
/**
* bonecp 连接池检测
*
* @author yangpan3
* @since 2016-11-24 13:20
*/
public class BoneCPConnectionDetectSupport implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@PostConstruct
public void setup() {
Map
beans = this.applicationContext.getBeansOfType(BoneCPDataSource.class);
for (BoneCPDataSource dataSource : beans.values()) {
detect(dataSource);
}
}
private void detect(BoneCPDataSource dataSource) {
try {
System.out.println("--BoneCPConnectionDetectSupport.detect() : url = " + dataSource.getJdbcUrl());
Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement();
statement.executeQuery("SELECT 1").close();
statement.close();
connection.close();
} catch (SQLException e) {
System.err.println("--BoneCPConnectionDetectSupport.detect() Fail: url = " + e.getMessage());
e.printStackTrace();
}
}
}
Mr.Key
spring容器启动过程中需要注入applicationContext,可以实现ApplicationContextAware 接口。
拥有applicationContext就可以完成所有“资源”的访问,比如此处需要的多数据源bean。
设计模式:观察者模式
需要改进的点
启动正常,不一定永远正常,可以定时执行此检测方法,起到监控的作用。
// create SingleThreadScheduledExecutor
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
// 定时执行
future = executor.scheduleAtFixedRate(runnable, 5, 5, TimeUnit.MILLISECONDS);