This is an automated email from the ASF dual-hosted git repository.

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 97b8b10  Add DBCPDataSourcePoolMetaData and test cases (#15255)
97b8b10 is described below

commit 97b8b1033b9442f0d51829a66115992a9cd9454a
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Feb 6 13:55:47 2022 +0800

    Add DBCPDataSourcePoolMetaData and test cases (#15255)
    
    * Add more test case for DataSourcePoolCreatorTest
    
    * Use getJdbcUrl instead of getJdbcUrlFieldName in DataSourcePoolMetaData
    
    * Add DBCPDataSourcePoolMetaData and test cases
    
    * Add DBCPDataSourcePoolMetaData and test cases
    
    * Add DBCPDataSourcePoolMetaData and test cases
    
    * Add DBCPDataSourcePoolMetaData and test cases
---
 pom.xml                                            |  7 +++
 .../shardingsphere-infra-common/pom.xml            |  6 ++
 .../pool/creator/DataSourcePoolCreator.java        | 24 ++++++--
 .../pool/creator/DataSourceReflection.java         | 31 +++-------
 .../pool/metadata/DataSourcePoolMetaData.java      | 34 +++++++++--
 .../metadata/DataSourcePoolMetaDataFactory.java    |  2 +-
 .../DBCPDataSourcePoolMetaData.java}               | 44 ++++++++++----
 .../DefaultDataSourcePoolMetaData.java             | 17 +++++-
 .../HikariDataSourcePoolMetaData.java              | 19 ++++--
 .../TomcatDBCPDataSourcePoolMetaData.java}         | 44 ++++++++++----
 .../datasource/props/DataSourceProperties.java     |  2 +-
 .../props/DataSourcePropertiesCreator.java         |  4 +-
 ...datasource.pool.metadata.DataSourcePoolMetaData |  6 +-
 .../pool/creator/DataSourcePoolCreatorTest.java    | 15 -----
 .../type/DBCPDataSourcePoolCreatorTest.java        | 70 ++++++++++++++++++++++
 .../type/HikariDataSourcePoolCreatorTest.java      | 61 +++++++++++++++++++
 .../type/TomcatDBCPDataSourcePoolCreatorTest.java  | 70 ++++++++++++++++++++++
 .../DataSourcePoolMetaDataFactoryTest.java         |  4 +-
 .../fixture/MockedDataSourcePoolMetaData.java      | 18 ++++--
 .../datasource/props/DataSourcePropertiesTest.java |  2 +-
 .../shardingsphere-jdbc-core/pom.xml               |  4 ++
 .../pom.xml                                        |  9 +++
 .../pom.xml                                        |  9 +++
 .../shardingsphere-mode-core/pom.xml               | 10 ++++
 .../shardingsphere-cluster-mode-core/pom.xml       | 11 ++++
 .../shardingsphere-standalone-mode-core/pom.xml    | 11 ++++
 .../shardingsphere-proxy-backend/pom.xml           |  8 +++
 27 files changed, 450 insertions(+), 92 deletions(-)

diff --git a/pom.xml b/pom.xml
index c83f4a4..44f4ae1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -94,6 +94,7 @@
         
         <hikari-cp.version>3.4.2</hikari-cp.version>
         <commons-dbcp2.version>2.2.0</commons-dbcp2.version>
+        <tomcat.version>10.0.16</tomcat.version>
         <commons-pool.version>1.6</commons-pool.version>
         <h2.version>1.4.196</h2.version>
         <mysql-connector-java.version>5.1.47</mysql-connector-java.version>
@@ -553,6 +554,12 @@
                 <scope>test</scope>
             </dependency>
             <dependency>
+                <groupId>org.apache.tomcat</groupId>
+                <artifactId>tomcat-dbcp</artifactId>
+                <version>${tomcat.version}</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
                 <groupId>org.apache.curator</groupId>
                 <artifactId>curator-test</artifactId>
                 <version>${curator.version}</version>
diff --git a/shardingsphere-infra/shardingsphere-infra-common/pom.xml 
b/shardingsphere-infra/shardingsphere-infra-common/pom.xml
index ef205b8..1621a93 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/pom.xml
+++ b/shardingsphere-infra/shardingsphere-infra-common/pom.xml
@@ -74,6 +74,12 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-dbcp2</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-dbcp</artifactId>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>io.vertx</groupId>
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreator.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreator.java
index 20f992b..a6ebff9 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreator.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreator.java
@@ -23,11 +23,13 @@ import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData;
 import 
org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaDataFactory;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
+import 
org.apache.shardingsphere.infra.datasource.props.custom.CustomDataSourceProperties;
 
 import javax.sql.DataSource;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Properties;
 import java.util.stream.Collectors;
 
 /**
@@ -52,13 +54,15 @@ public final class DataSourcePoolCreator {
      * @param dataSourceProps data source properties
      * @return created data source
      */
+    @SuppressWarnings("rawtypes")
     public static DataSource create(final DataSourceProperties 
dataSourceProps) {
         DataSource result = 
createDataSource(dataSourceProps.getDataSourceClassName());
         DataSourcePoolMetaData poolMetaData = 
DataSourcePoolMetaDataFactory.newInstance(dataSourceProps.getDataSourceClassName());
         DataSourceReflection dataSourceReflection = new 
DataSourceReflection(result);
         setDefaultFields(dataSourceReflection, poolMetaData);
         setConfiguredFields(dataSourceProps, dataSourceReflection, 
poolMetaData);
-        
dataSourceReflection.addDefaultDataSourceProperties(poolMetaData.getJdbcUrlPropertiesFieldName(),
 poolMetaData.getJdbcUrlFieldName());
+        
appendJdbcUrlProperties(dataSourceProps.getCustomDataSourceProperties(), 
result, poolMetaData);
+        dataSourceReflection.addDefaultDataSourceProperties(poolMetaData);
         return result;
     }
     
@@ -67,23 +71,33 @@ public final class DataSourcePoolCreator {
         return (DataSource) 
Class.forName(dataSourceClassName).getConstructor().newInstance();
     }
     
-    private static void setDefaultFields(final DataSourceReflection 
dataSourceReflection, final DataSourcePoolMetaData poolMetaData) {
+    private static void setDefaultFields(final DataSourceReflection 
dataSourceReflection, final DataSourcePoolMetaData<?> poolMetaData) {
         for (Entry<String, Object> entry : 
poolMetaData.getDefaultProperties().entrySet()) {
             dataSourceReflection.setField(entry.getKey(), entry.getValue());
         }
     }
     
-    private static void setConfiguredFields(final DataSourceProperties 
dataSourceProps, final DataSourceReflection dataSourceReflection, final 
DataSourcePoolMetaData poolMetaData) {
+    private static void setConfiguredFields(final DataSourceProperties 
dataSourceProps, final DataSourceReflection dataSourceReflection, final 
DataSourcePoolMetaData<?> poolMetaData) {
         for (Entry<String, Object> entry : 
dataSourceProps.getAllLocalProperties().entrySet()) {
             String fieldName = entry.getKey();
             Object fieldValue = entry.getValue();
-            if (isValidProperty(fieldName, fieldValue, poolMetaData)) {
+            if (isValidProperty(fieldName, fieldValue, poolMetaData) && 
!fieldName.equals(poolMetaData.getJdbcUrlPropertiesFieldName())) {
                 dataSourceReflection.setField(fieldName, fieldValue);
             }
         }
     }
     
-    private static boolean isValidProperty(final String key, final Object 
value, final DataSourcePoolMetaData poolMetaData) {
+    private static boolean isValidProperty(final String key, final Object 
value, final DataSourcePoolMetaData<?> poolMetaData) {
         return !poolMetaData.getInvalidProperties().containsKey(key) || null 
== value || !value.equals(poolMetaData.getInvalidProperties().get(key));
     }
+    
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    private static void appendJdbcUrlProperties(final 
CustomDataSourceProperties customDataSourceProps, final DataSource 
targetDataSource, final DataSourcePoolMetaData poolMetaData) {
+        if (null != poolMetaData.getJdbcUrlPropertiesFieldName() && 
customDataSourceProps.getProperties().containsKey(poolMetaData.getJdbcUrlPropertiesFieldName()))
 {
+            Properties jdbcUrlProps = (Properties) 
customDataSourceProps.getProperties().get(poolMetaData.getJdbcUrlPropertiesFieldName());
+            for (Entry<Object, Object> entry : jdbcUrlProps.entrySet()) {
+                
poolMetaData.appendJdbcUrlProperties(entry.getKey().toString(), 
entry.getValue().toString(), targetDataSource);
+            }
+        }
+    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourceReflection.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourceReflection.java
index 5187cac..460e96e 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourceReflection.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourceReflection.java
@@ -22,6 +22,7 @@ import com.google.common.collect.Sets;
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
+import 
org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData;
 
 import javax.sql.DataSource;
 import java.lang.reflect.Method;
@@ -153,22 +154,22 @@ public final class DataSourceReflection {
     /**
      * Add default data source properties.
      *
-     * @param dataSourcePropsFieldName data source properties field name
-     * @param jdbcUrlFieldName JDBC URL field name
+     * @param dataSourcePoolMetaData data source pool meta data
      */
-    public void addDefaultDataSourceProperties(final String 
dataSourcePropsFieldName, final String jdbcUrlFieldName) {
-        if (null == dataSourcePropsFieldName || null == jdbcUrlFieldName) {
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public void addDefaultDataSourceProperties(final DataSourcePoolMetaData 
dataSourcePoolMetaData) {
+        String jdbcUrl = dataSourcePoolMetaData.getJdbcUrl(dataSource);
+        Properties jdbcUrlProps = 
dataSourcePoolMetaData.getJdbcUrlProperties(dataSource);
+        if (null == jdbcUrl || null == jdbcUrlProps) {
             return;
         }
-        Properties targetDataSourceProps = 
getDataSourceProperties(dataSourcePropsFieldName);
-        String jdbcUrl = getJdbcUrl(jdbcUrlFieldName);
         DataSourceMetaData dataSourceMetaData = 
DatabaseTypeRegistry.getDatabaseTypeByURL(jdbcUrl).getDataSourceMetaData(jdbcUrl,
 null);
         Properties queryProps = dataSourceMetaData.getQueryProperties();
         for (Entry<Object, Object> entry : 
dataSourceMetaData.getDefaultQueryProperties().entrySet()) {
             String defaultPropertyKey = entry.getKey().toString();
             String defaultPropertyValue = entry.getValue().toString();
-            if (!containsDefaultProperty(defaultPropertyKey, 
targetDataSourceProps, queryProps)) {
-                targetDataSourceProps.setProperty(defaultPropertyKey, 
defaultPropertyValue);
+            if (!containsDefaultProperty(defaultPropertyKey, jdbcUrlProps, 
queryProps)) {
+                
dataSourcePoolMetaData.appendJdbcUrlProperties(defaultPropertyKey, 
defaultPropertyValue, dataSource);
             }
         }
     }
@@ -176,18 +177,4 @@ public final class DataSourceReflection {
     private boolean containsDefaultProperty(final String defaultPropertyKey, 
final Properties targetDataSourceProps, final Properties queryProps) {
         return targetDataSourceProps.containsKey(defaultPropertyKey) || 
queryProps.containsKey(defaultPropertyKey);
     }
-    
-    @SneakyThrows(ReflectiveOperationException.class)
-    private Properties getDataSourceProperties(final String 
dataSourcePropsFieldName) {
-        return (Properties) 
dataSource.getClass().getMethod(getGetterMethodName(dataSourcePropsFieldName)).invoke(dataSource);
-    }
-    
-    @SneakyThrows(ReflectiveOperationException.class)
-    private String getJdbcUrl(final String jdbcUrlFieldName) {
-        return (String) 
dataSource.getClass().getMethod(getGetterMethodName(jdbcUrlFieldName)).invoke(dataSource);
-    }
-    
-    private String getGetterMethodName(final String fieldName) {
-        return GETTER_PREFIX + 
CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, fieldName);
-    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaData.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaData.java
index ef4d072..e0bbdc7 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaData.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaData.java
@@ -20,13 +20,17 @@ package 
org.apache.shardingsphere.infra.datasource.pool.metadata;
 import org.apache.shardingsphere.spi.required.RequiredSPI;
 import org.apache.shardingsphere.spi.typed.TypedSPI;
 
+import javax.sql.DataSource;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Properties;
 
 /**
  * Data source pool meta data.
+ * 
+ * @param <T> type of target data source
  */
-public interface DataSourcePoolMetaData extends TypedSPI, RequiredSPI {
+public interface DataSourcePoolMetaData<T extends DataSource> extends 
TypedSPI, RequiredSPI {
     
     /**
      * Get default properties.
@@ -50,20 +54,38 @@ public interface DataSourcePoolMetaData extends TypedSPI, 
RequiredSPI {
     Map<String, String> getPropertySynonyms();
     
     /**
-     * Get JDBC URL field name.
-     *
-     * @return JDBC URL field name
+     * Get JDBC URL.
+     * 
+     * @param targetDataSource target data source
+     * @return JDBC URL
      */
-    String getJdbcUrlFieldName();
+    String getJdbcUrl(T targetDataSource);
     
     /**
      * Get JDBC URL properties field name.
-     * 
+     *
      * @return JDBC URL properties field name
      */
     String getJdbcUrlPropertiesFieldName();
     
     /**
+     * Get JDBC URL properties.
+     * 
+     * @param targetDataSource target data source
+     * @return JDBC URL properties
+     */
+    Properties getJdbcUrlProperties(T targetDataSource);
+    
+    /**
+     * Append JDBC URL properties.
+     * 
+     * @param key key
+     * @param value value
+     * @param targetDataSource target data source
+     */
+    void appendJdbcUrlProperties(String key, String value, T targetDataSource);
+    
+    /**
      * Get transient field names.
      * 
      * @return transient field names
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaDataFactory.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaDataFactory.java
index 0986b90..d5e1836 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaDataFactory.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaDataFactory.java
@@ -41,7 +41,7 @@ public final class DataSourcePoolMetaDataFactory {
      * @param dataSourceClassName data source class name
      * @return new instance of data source pool meta data
      */
-    public static DataSourcePoolMetaData newInstance(final String 
dataSourceClassName) {
+    public static DataSourcePoolMetaData<?> newInstance(final String 
dataSourceClassName) {
         return TypedSPIRegistry.findRegisteredService(
                 DataSourcePoolMetaData.class, dataSourceClassName, new 
Properties()).orElse(RequiredSPIRegistry.getRegisteredService(DataSourcePoolMetaData.class));
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/DefaultDataSourcePoolMetaData.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/DBCPDataSourcePoolMetaData.java
similarity index 55%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/DefaultDataSourcePoolMetaData.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/DBCPDataSourcePoolMetaData.java
index 368f664..67a5889 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/DefaultDataSourcePoolMetaData.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/DBCPDataSourcePoolMetaData.java
@@ -15,18 +15,35 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.datasource.pool.metadata.impl;
+package org.apache.shardingsphere.infra.datasource.pool.metadata.type;
 
+import lombok.Getter;
+import lombok.SneakyThrows;
+import org.apache.commons.dbcp2.BasicDataSource;
 import 
org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData;
 
+import java.lang.reflect.Field;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedList;
 import java.util.Map;
+import java.util.Properties;
 
 /**
- * Default data source pool meta data.
+ * Hikari data source pool meta data.
  */
-public final class DefaultDataSourcePoolMetaData implements 
DataSourcePoolMetaData {
+@Getter
+public final class DBCPDataSourcePoolMetaData implements 
DataSourcePoolMetaData<BasicDataSource> {
+    
+    private final Collection<String> transientFieldNames = new LinkedList<>();
+    
+    public DBCPDataSourcePoolMetaData() {
+        buildTransientFieldNames();
+    }
+    
+    private void buildTransientFieldNames() {
+        transientFieldNames.add("closed");
+    }
     
     @Override
     public Map<String, Object> getDefaultProperties() {
@@ -44,27 +61,30 @@ public final class DefaultDataSourcePoolMetaData implements 
DataSourcePoolMetaDa
     }
     
     @Override
-    public String getJdbcUrlFieldName() {
-        return null;
+    public String getJdbcUrl(final BasicDataSource targetDataSource) {
+        return targetDataSource.getUrl();
     }
     
     @Override
     public String getJdbcUrlPropertiesFieldName() {
-        return null;
+        return "connectionProperties";
     }
     
     @Override
-    public Collection<String> getTransientFieldNames() {
-        return Collections.emptyList();
+    @SneakyThrows(ReflectiveOperationException.class)
+    public Properties getJdbcUrlProperties(final BasicDataSource 
targetDataSource) {
+        Field field = 
BasicDataSource.class.getDeclaredField("connectionProperties");
+        field.setAccessible(true);
+        return (Properties) field.get(targetDataSource);
     }
     
     @Override
-    public String getType() {
-        return "Default";
+    public void appendJdbcUrlProperties(final String key, final String value, 
final BasicDataSource targetDataSource) {
+        targetDataSource.addConnectionProperty(key, value);
     }
     
     @Override
-    public boolean isDefault() {
-        return true;
+    public String getType() {
+        return BasicDataSource.class.getName();
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/DefaultDataSourcePoolMetaData.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/DefaultDataSourcePoolMetaData.java
similarity index 81%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/DefaultDataSourcePoolMetaData.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/DefaultDataSourcePoolMetaData.java
index 368f664..77f256c 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/DefaultDataSourcePoolMetaData.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/DefaultDataSourcePoolMetaData.java
@@ -15,18 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.datasource.pool.metadata.impl;
+package org.apache.shardingsphere.infra.datasource.pool.metadata.type;
 
 import 
org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData;
 
+import javax.sql.DataSource;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
+import java.util.Properties;
 
 /**
  * Default data source pool meta data.
  */
-public final class DefaultDataSourcePoolMetaData implements 
DataSourcePoolMetaData {
+public final class DefaultDataSourcePoolMetaData implements 
DataSourcePoolMetaData<DataSource> {
     
     @Override
     public Map<String, Object> getDefaultProperties() {
@@ -44,7 +46,7 @@ public final class DefaultDataSourcePoolMetaData implements 
DataSourcePoolMetaDa
     }
     
     @Override
-    public String getJdbcUrlFieldName() {
+    public String getJdbcUrl(final DataSource targetDataSource) {
         return null;
     }
     
@@ -54,6 +56,15 @@ public final class DefaultDataSourcePoolMetaData implements 
DataSourcePoolMetaDa
     }
     
     @Override
+    public Properties getJdbcUrlProperties(final DataSource targetDataSource) {
+        return null;
+    }
+    
+    @Override
+    public void appendJdbcUrlProperties(final String key, final String value, 
final DataSource targetDataSource) {
+    }
+    
+    @Override
     public Collection<String> getTransientFieldNames() {
         return Collections.emptyList();
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/HikariDataSourcePoolMetaData.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/HikariDataSourcePoolMetaData.java
similarity index 85%
rename from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/HikariDataSourcePoolMetaData.java
rename to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/HikariDataSourcePoolMetaData.java
index 4d8cb6c..a0d1dbb 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/HikariDataSourcePoolMetaData.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/HikariDataSourcePoolMetaData.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.datasource.pool.metadata.impl;
+package org.apache.shardingsphere.infra.datasource.pool.metadata.type;
 
 import com.zaxxer.hikari.HikariDataSource;
 import lombok.Getter;
@@ -25,12 +25,13 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Map;
+import java.util.Properties;
 
 /**
  * Hikari data source pool meta data.
  */
 @Getter
-public final class HikariDataSourcePoolMetaData implements 
DataSourcePoolMetaData {
+public final class HikariDataSourcePoolMetaData implements 
DataSourcePoolMetaData<HikariDataSource> {
     
     private final Map<String, Object> defaultProperties = new HashMap<>(6, 1);
     
@@ -78,8 +79,8 @@ public final class HikariDataSourcePoolMetaData implements 
DataSourcePoolMetaDat
     }
     
     @Override
-    public String getJdbcUrlFieldName() {
-        return "jdbcUrl";
+    public String getJdbcUrl(final HikariDataSource targetDataSource) {
+        return targetDataSource.getJdbcUrl();
     }
     
     @Override
@@ -88,6 +89,16 @@ public final class HikariDataSourcePoolMetaData implements 
DataSourcePoolMetaDat
     }
     
     @Override
+    public Properties getJdbcUrlProperties(final HikariDataSource 
targetDataSource) {
+        return targetDataSource.getDataSourceProperties();
+    }
+    
+    @Override
+    public void appendJdbcUrlProperties(final String key, final String value, 
final HikariDataSource targetDataSource) {
+        targetDataSource.getDataSourceProperties().put(key, value);
+    }
+    
+    @Override
     public String getType() {
         return HikariDataSource.class.getName();
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/DefaultDataSourcePoolMetaData.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/TomcatDBCPDataSourcePoolMetaData.java
similarity index 54%
rename from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/DefaultDataSourcePoolMetaData.java
rename to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/TomcatDBCPDataSourcePoolMetaData.java
index 368f664..4d80f69 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/impl/DefaultDataSourcePoolMetaData.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/pool/metadata/type/TomcatDBCPDataSourcePoolMetaData.java
@@ -15,18 +15,35 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.datasource.pool.metadata.impl;
+package org.apache.shardingsphere.infra.datasource.pool.metadata.type;
 
+import lombok.Getter;
+import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData;
+import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
 
+import java.lang.reflect.Field;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedList;
 import java.util.Map;
+import java.util.Properties;
 
 /**
- * Default data source pool meta data.
+ * Tomcat JDBC data source pool meta data.
  */
-public final class DefaultDataSourcePoolMetaData implements 
DataSourcePoolMetaData {
+@Getter
+public final class TomcatDBCPDataSourcePoolMetaData implements 
DataSourcePoolMetaData<BasicDataSource> {
+    
+    private final Collection<String> transientFieldNames = new LinkedList<>();
+    
+    public TomcatDBCPDataSourcePoolMetaData() {
+        buildTransientFieldNames();
+    }
+    
+    private void buildTransientFieldNames() {
+        transientFieldNames.add("closed");
+    }
     
     @Override
     public Map<String, Object> getDefaultProperties() {
@@ -44,27 +61,30 @@ public final class DefaultDataSourcePoolMetaData implements 
DataSourcePoolMetaDa
     }
     
     @Override
-    public String getJdbcUrlFieldName() {
-        return null;
+    public String getJdbcUrl(final BasicDataSource targetDataSource) {
+        return targetDataSource.getUrl();
     }
     
     @Override
     public String getJdbcUrlPropertiesFieldName() {
-        return null;
+        return "connectionProperties";
     }
     
     @Override
-    public Collection<String> getTransientFieldNames() {
-        return Collections.emptyList();
+    @SneakyThrows(ReflectiveOperationException.class)
+    public Properties getJdbcUrlProperties(final BasicDataSource 
targetDataSource) {
+        Field field = 
BasicDataSource.class.getDeclaredField("connectionProperties");
+        field.setAccessible(true);
+        return (Properties) field.get(targetDataSource);
     }
     
     @Override
-    public String getType() {
-        return "Default";
+    public void appendJdbcUrlProperties(final String key, final String value, 
final BasicDataSource targetDataSource) {
+        targetDataSource.addConnectionProperty(key, value);
     }
     
     @Override
-    public boolean isDefault() {
-        return true;
+    public String getType() {
+        return BasicDataSource.class.getName();
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/props/DataSourceProperties.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/props/DataSourceProperties.java
index 6b254cf..be7ccb4 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/props/DataSourceProperties.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/props/DataSourceProperties.java
@@ -47,7 +47,7 @@ public final class DataSourceProperties {
     
     public DataSourceProperties(final String dataSourceClassName, final 
Map<String, Object> props) {
         this.dataSourceClassName = dataSourceClassName;
-        DataSourcePoolMetaData poolMetaData = 
DataSourcePoolMetaDataFactory.newInstance(dataSourceClassName);
+        DataSourcePoolMetaData<?> poolMetaData = 
DataSourcePoolMetaDataFactory.newInstance(dataSourceClassName);
         Map<String, String> propertySynonyms = 
poolMetaData.getPropertySynonyms();
         connectionPropertySynonyms = new ConnectionPropertySynonyms(props, 
propertySynonyms);
         poolPropertySynonyms = new PoolPropertySynonyms(props, 
propertySynonyms);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/props/DataSourcePropertiesCreator.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/props/DataSourcePropertiesCreator.java
index 1104308..887a48a 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/props/DataSourcePropertiesCreator.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/datasource/props/DataSourcePropertiesCreator.java
@@ -76,7 +76,7 @@ public final class DataSourcePropertiesCreator {
     
     private static Map<String, Object> createProperties(final DataSource 
dataSource) {
         Map<String, Object> result = new LinkedHashMap<>();
-        DataSourcePoolMetaData poolMetaData = 
DataSourcePoolMetaDataFactory.newInstance(dataSource.getClass().getName());
+        DataSourcePoolMetaData<?> poolMetaData = 
DataSourcePoolMetaDataFactory.newInstance(dataSource.getClass().getName());
         for (Entry<String, Object> entry : new 
DataSourceReflection(dataSource).convertToProperties().entrySet()) {
             String propertyName = entry.getKey();
             Object propertyValue = entry.getValue();
@@ -87,7 +87,7 @@ public final class DataSourcePropertiesCreator {
         return result;
     }
     
-    private static boolean isValidProperty(final String key, final Object 
value, final DataSourcePoolMetaData poolMetaData) {
+    private static boolean isValidProperty(final String key, final Object 
value, final DataSourcePoolMetaData<?> poolMetaData) {
         return !poolMetaData.getInvalidProperties().containsKey(key) || null 
== value || !value.equals(poolMetaData.getInvalidProperties().get(key));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData
index 0083f4f..728a397 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData
@@ -15,5 +15,7 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.infra.datasource.pool.metadata.impl.DefaultDataSourcePoolMetaData
-org.apache.shardingsphere.infra.datasource.pool.metadata.impl.HikariDataSourcePoolMetaData
+org.apache.shardingsphere.infra.datasource.pool.metadata.type.DefaultDataSourcePoolMetaData
+org.apache.shardingsphere.infra.datasource.pool.metadata.type.HikariDataSourcePoolMetaData
+org.apache.shardingsphere.infra.datasource.pool.metadata.type.DBCPDataSourcePoolMetaData
+org.apache.shardingsphere.infra.datasource.pool.metadata.type.TomcatDBCPDataSourcePoolMetaData
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreatorTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreatorTest.java
index 6d0796b..a8f129c 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreatorTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreatorTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.infra.datasource.pool.creator;
 
-import com.zaxxer.hikari.HikariDataSource;
 import org.apache.commons.dbcp2.BasicDataSource;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
 import org.apache.shardingsphere.test.mock.MockedDataSource;
@@ -82,18 +81,4 @@ public final class DataSourcePoolCreatorTest {
         result.put("password", "root");
         return result;
     }
-    
-    @Test
-    public void assertCreateHikariDataSource() {
-        assertThat(DataSourcePoolCreator.create(new 
DataSourceProperties(HikariDataSource.class.getName(), 
createHikariProperties())), instanceOf(HikariDataSource.class));
-    }
-    
-    private Map<String, Object> createHikariProperties() {
-        Map<String, Object> result = new HashMap<>();
-        result.put("jdbcUrl", "jdbc:mock://127.0.0.1/foo_ds");
-        result.put("driverClassName", MockedDataSource.class.getName());
-        result.put("username", "root");
-        result.put("password", "root");
-        return result;
-    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/type/DBCPDataSourcePoolCreatorTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/type/DBCPDataSourcePoolCreatorTest.java
new file mode 100644
index 0000000..edff9c2
--- /dev/null
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/type/DBCPDataSourcePoolCreatorTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.datasource.pool.creator.type;
+
+import lombok.SneakyThrows;
+import org.apache.commons.dbcp2.BasicDataSource;
+import 
org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator;
+import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
+import org.apache.shardingsphere.test.mock.MockedDataSource;
+import org.junit.Test;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public final class DBCPDataSourcePoolCreatorTest {
+    
+    @Test
+    public void assertCreateDataSource() {
+        BasicDataSource actual = (BasicDataSource) 
DataSourcePoolCreator.create(new 
DataSourceProperties(BasicDataSource.class.getName(), 
createDataSourceProperties()));
+        assertThat(actual.getUrl(), is("jdbc:mock://127.0.0.1/foo_ds"));
+        assertThat(actual.getDriverClassName(), 
is(MockedDataSource.class.getName()));
+        assertThat(actual.getUsername(), is("root"));
+        assertThat(actual.getPassword(), is("root"));
+        assertThat(getConnectionProperties(actual), 
is(createJdbcUrlProperties()));
+    }
+    
+    private Map<String, Object> createDataSourceProperties() {
+        Map<String, Object> result = new HashMap<>();
+        result.put("url", "jdbc:mock://127.0.0.1/foo_ds");
+        result.put("driverClassName", MockedDataSource.class.getName());
+        result.put("username", "root");
+        result.put("password", "root");
+        result.put("connectionProperties", createJdbcUrlProperties());
+        return result;
+    }
+    
+    private Properties createJdbcUrlProperties() {
+        Properties result = new Properties();
+        result.put("foo", "foo_value");
+        result.put("bar", "bar_value");
+        return result;
+    }
+    
+    @SneakyThrows(ReflectiveOperationException.class)
+    private Properties getConnectionProperties(final BasicDataSource actual) {
+        Field field = 
actual.getClass().getDeclaredField("connectionProperties");
+        field.setAccessible(true);
+        return (Properties) field.get(actual);
+    }
+}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/type/HikariDataSourcePoolCreatorTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/type/HikariDataSourcePoolCreatorTest.java
new file mode 100644
index 0000000..0024949
--- /dev/null
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/type/HikariDataSourcePoolCreatorTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.datasource.pool.creator.type;
+
+import com.zaxxer.hikari.HikariDataSource;
+import 
org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator;
+import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
+import org.apache.shardingsphere.test.mock.MockedDataSource;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public final class HikariDataSourcePoolCreatorTest {
+    
+    @Test
+    public void assertCreateDataSource() {
+        HikariDataSource actual = (HikariDataSource) 
DataSourcePoolCreator.create(new 
DataSourceProperties(HikariDataSource.class.getName(), 
createDataSourceProperties()));
+        assertThat(actual.getJdbcUrl(), is("jdbc:mock://127.0.0.1/foo_ds"));
+        assertThat(actual.getDriverClassName(), 
is(MockedDataSource.class.getName()));
+        assertThat(actual.getUsername(), is("root"));
+        assertThat(actual.getPassword(), is("root"));
+        assertThat(actual.getDataSourceProperties(), 
is(createJdbcUrlProperties()));
+    }
+    
+    private Map<String, Object> createDataSourceProperties() {
+        Map<String, Object> result = new HashMap<>();
+        result.put("jdbcUrl", "jdbc:mock://127.0.0.1/foo_ds");
+        result.put("driverClassName", MockedDataSource.class.getName());
+        result.put("username", "root");
+        result.put("password", "root");
+        result.put("dataSourceProperties", createJdbcUrlProperties());
+        return result;
+    }
+    
+    private Properties createJdbcUrlProperties() {
+        Properties result = new Properties();
+        result.put("foo", "foo_value");
+        result.put("bar", "bar_value");
+        return result;
+    }
+}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/type/TomcatDBCPDataSourcePoolCreatorTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/type/TomcatDBCPDataSourcePoolCreatorTest.java
new file mode 100644
index 0000000..229562d
--- /dev/null
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/creator/type/TomcatDBCPDataSourcePoolCreatorTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.datasource.pool.creator.type;
+
+import lombok.SneakyThrows;
+import 
org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator;
+import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
+import org.apache.shardingsphere.test.mock.MockedDataSource;
+import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
+import org.junit.Test;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public final class TomcatDBCPDataSourcePoolCreatorTest {
+    
+    @Test
+    public void assertCreateDataSource() {
+        BasicDataSource actual = (BasicDataSource) 
DataSourcePoolCreator.create(new 
DataSourceProperties(BasicDataSource.class.getName(), 
createDataSourceProperties()));
+        assertThat(actual.getUrl(), is("jdbc:mock://127.0.0.1/foo_ds"));
+        assertThat(actual.getDriverClassName(), 
is(MockedDataSource.class.getName()));
+        assertThat(actual.getUsername(), is("root"));
+        assertThat(actual.getPassword(), is("root"));
+        assertThat(getConnectionProperties(actual), 
is(createJdbcUrlProperties()));
+    }
+    
+    private Map<String, Object> createDataSourceProperties() {
+        Map<String, Object> result = new HashMap<>();
+        result.put("url", "jdbc:mock://127.0.0.1/foo_ds");
+        result.put("driverClassName", MockedDataSource.class.getName());
+        result.put("username", "root");
+        result.put("password", "root");
+        result.put("connectionProperties", createJdbcUrlProperties());
+        return result;
+    }
+    
+    private Properties createJdbcUrlProperties() {
+        Properties result = new Properties();
+        result.put("foo", "foo_value");
+        result.put("bar", "bar_value");
+        return result;
+    }
+    
+    @SneakyThrows(ReflectiveOperationException.class)
+    private Properties getConnectionProperties(final BasicDataSource actual) {
+        Field field = 
actual.getClass().getDeclaredField("connectionProperties");
+        field.setAccessible(true);
+        return (Properties) field.get(actual);
+    }
+}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaDataFactoryTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaDataFactoryTest.java
index 1cb4b38..b3b7db1 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaDataFactoryTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/metadata/DataSourcePoolMetaDataFactoryTest.java
@@ -18,8 +18,8 @@
 package org.apache.shardingsphere.infra.datasource.pool.metadata;
 
 import com.zaxxer.hikari.HikariDataSource;
-import 
org.apache.shardingsphere.infra.datasource.pool.metadata.impl.DefaultDataSourcePoolMetaData;
-import 
org.apache.shardingsphere.infra.datasource.pool.metadata.impl.HikariDataSourcePoolMetaData;
+import 
org.apache.shardingsphere.infra.datasource.pool.metadata.type.DefaultDataSourcePoolMetaData;
+import 
org.apache.shardingsphere.infra.datasource.pool.metadata.type.HikariDataSourcePoolMetaData;
 import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/metadata/fixture/MockedDataSourcePoolMetaData.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/metadata/fixture/MockedDataSourcePoolMetaData.java
index 71eb71f..fa230a6 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/metadata/fixture/MockedDataSourcePoolMetaData.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/pool/metadata/fixture/MockedDataSourcePoolMetaData.java
@@ -24,8 +24,9 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Properties;
 
-public final class MockedDataSourcePoolMetaData implements 
DataSourcePoolMetaData {
+public final class MockedDataSourcePoolMetaData implements 
DataSourcePoolMetaData<MockedDataSource> {
     
     @Override
     public Map<String, Object> getDefaultProperties() {
@@ -51,13 +52,22 @@ public final class MockedDataSourcePoolMetaData implements 
DataSourcePoolMetaDat
     }
     
     @Override
-    public String getJdbcUrlFieldName() {
-        return "url";
+    public String getJdbcUrl(final MockedDataSource targetDataSource) {
+        return targetDataSource.getUrl();
     }
     
     @Override
     public String getJdbcUrlPropertiesFieldName() {
-        return "jdbcUrlProperties";
+        return null;
+    }
+    
+    @Override
+    public Properties getJdbcUrlProperties(final MockedDataSource 
targetDataSource) {
+        return new Properties();
+    }
+    
+    @Override
+    public void appendJdbcUrlProperties(final String key, final String value, 
final MockedDataSource targetDataSource) {
     }
     
     @Override
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/props/DataSourcePropertiesTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/props/DataSourcePropertiesTest.java
index 434599b..805db92 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/props/DataSourcePropertiesTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/datasource/props/DataSourcePropertiesTest.java
@@ -67,7 +67,7 @@ public final class DataSourcePropertiesTest {
     }
 
     @Test
-    public void assertgetAllLocalProperties() {
+    public void assertGetAllLocalProperties() {
         DataSourceProperties originalDataSourceProps = new 
DataSourceProperties(MockedDataSource.class.getName(), getProperties());
         Map<String, Object> actualAllProperties = 
originalDataSourceProps.getAllLocalProperties();
         assertNotNull(actualAllProperties);
diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-core/pom.xml 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/pom.xml
index 1acc265..ae5580c 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-core/pom.xml
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-core/pom.xml
@@ -155,6 +155,10 @@
             <artifactId>commons-dbcp2</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-dbcp</artifactId>
+        </dependency>
+        <dependency>
             <groupId>commons-pool</groupId>
             <artifactId>commons-pool</artifactId>
         </dependency>
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/pom.xml
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/pom.xml
index d1b8ec2..ee043ce 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/pom.xml
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/pom.xml
@@ -89,5 +89,14 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-dbcp2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-dbcp</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-namespace/pom.xml
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-namespace/pom.xml
index 20505fa..51d5582 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-namespace/pom.xml
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-namespace/pom.xml
@@ -95,6 +95,15 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-dbcp2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-dbcp</artifactId>
+        </dependency>
         
         <dependency>
             <groupId>org.springframework</groupId>
diff --git a/shardingsphere-mode/shardingsphere-mode-core/pom.xml 
b/shardingsphere-mode/shardingsphere-mode-core/pom.xml
index 1ee569f..7ea582d 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/pom.xml
+++ b/shardingsphere-mode/shardingsphere-mode-core/pom.xml
@@ -51,5 +51,15 @@
             <artifactId>h2</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-dbcp2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-dbcp</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/pom.xml
 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/pom.xml
index c80497b..5099d54 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/pom.xml
+++ 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/pom.xml
@@ -56,5 +56,16 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+        
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-dbcp2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-dbcp</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/pom.xml
 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/pom.xml
index 7ea2339..b61fb92 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/pom.xml
+++ 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/pom.xml
@@ -46,5 +46,16 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+        
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-dbcp2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-dbcp</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/pom.xml 
b/shardingsphere-proxy/shardingsphere-proxy-backend/pom.xml
index 6f1cc45..dfb8240 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/pom.xml
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/pom.xml
@@ -177,6 +177,14 @@
             <scope>compile</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-dbcp2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-dbcp</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>
             <scope>runtime</scope>

Reply via email to