Merge pull request #1932 from xiaoshan00/master

修复自定义的ValidConnectionChecker被覆盖的问题
This commit is contained in:
高铁
2017-08-29 15:13:45 +08:00
committed by GitHub
2 changed files with 60 additions and 0 deletions
@@ -1107,6 +1107,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
}
private void initValidConnectionChecker() {
if (this.validConnectionChecker != null) {
return;
}
String realDriverClassName = driver.getClass().getName();
if (JdbcUtils.isMySqlDriver(realDriverClassName)) {
this.validConnectionChecker = new MySqlValidConnectionChecker();
@@ -0,0 +1,56 @@
package com.alibaba.druid.bvt.pool;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.ValidConnectionChecker;
import org.junit.Assert;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* 给对象 {@link DruidDataSource} 已经设置了自定义的 validConnectionChecker的情况下,
* 使用MySQL等已知的Driver的时候, 会用内置的checker覆盖自定义的checker.
* 由于测试用例{@link DruidDataSourceTest5}使用的是mock driver, 导致并不能测试自定义checker被修改的问题.
* 此处单独列出Test Case. 由于需要用到真实的MySQL Driver, 以main函数方式提供测试用例.
* 如需运行此用例, 请先修改连接信息.
*/
public class DruidDataSourceTestValidConnectionChecker {
public static void main(String[] args) throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
ValidConnectionChecker checker = new ValidConnectionChecker() {
@Override
public boolean isValidConnection(Connection c, String query, int validationQueryTimeout) throws Exception {
return true;
}
@Override
public void configFromProperties(Properties properties) {
}
};
// 运行测试用例之前请先修改连接信息.
String jdbcUrl = "jdbc:mysql://localhost:3306/test";
String user = "test";
String password = "test";
Assert.assertTrue("运行此用例之前请先修改上面的连接信息, 并注释此行", false);
String driverClass = "com.mysql.jdbc.Driver";
dataSource.setUrl(jdbcUrl);
dataSource.setUsername(user);
dataSource.setPassword(password);
dataSource.setDriverClassName(driverClass);
dataSource.setValidConnectionChecker(checker);
Assert.assertEquals(checker, dataSource.getValidConnectionChecker());
dataSource.init();
// 已经设置了自定义的validConnectionChecker的情况下, 即使加载了MySQL Driver之后checker对象也不应该发生变化.
Assert.assertEquals(checker, dataSource.getValidConnectionChecker());
}
}