From 7ca1ebc5a913a8becd3e8db8676a8647981dd164 Mon Sep 17 00:00:00 2001 From: lichenglong Date: Mon, 28 Aug 2017 19:35:00 +0800 Subject: [PATCH] Fix: Cannot using customized ValidConnectionChecker when loading known drivers such as MySQL Driver. --- .../alibaba/druid/pool/DruidDataSource.java | 4 ++ ...dDataSourceTestValidConnectionChecker.java | 56 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/bvt/pool/DruidDataSourceTestValidConnectionChecker.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 5d6beac297..42cf1616e9 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -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(); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/DruidDataSourceTestValidConnectionChecker.java b/src/test/java/com/alibaba/druid/bvt/pool/DruidDataSourceTestValidConnectionChecker.java new file mode 100644 index 0000000000..f6e2eebbfc --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/DruidDataSourceTestValidConnectionChecker.java @@ -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()); + } +}