AE86 3 rokov pred
rodič
commit
d89b1d8e05

+ 0 - 10
dbsyncer-connector/pom.xml

@@ -25,16 +25,6 @@
             <artifactId>spring-jdbc</artifactId>
         </dependency>
 
-        <!-- 数据源 -->
-        <dependency>
-            <groupId>commons-dbcp</groupId>
-            <artifactId>commons-dbcp</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-pool</groupId>
-            <artifactId>commons-pool</artifactId>
-        </dependency>
-
         <!-- mysql-driver -->
         <dependency>
             <groupId>mysql</groupId>

+ 5 - 7
dbsyncer-connector/src/main/java/org/dbsyncer/connector/ConnectorFactory.java

@@ -33,10 +33,9 @@ public class ConnectorFactory implements DisposableBean {
      *
      * @param config
      */
-    public synchronized ConnectorMapper connect(ConnectorConfig config) {
+    public ConnectorMapper connect(ConnectorConfig config) {
         Assert.notNull(config, "ConnectorConfig can not be null.");
-        String type = config.getConnectorType();
-        Connector connector = getConnector(type);
+        Connector connector = getConnector(config.getConnectorType());
         String cacheKey = connector.getConnectorMapperCacheKey(config);
         if (!connectorCache.containsKey(cacheKey)) {
             connectorCache.putIfAbsent(cacheKey, connector.connect(config));
@@ -50,10 +49,9 @@ public class ConnectorFactory implements DisposableBean {
      * @param config
      * @return
      */
-    public synchronized boolean refresh(ConnectorConfig config) {
+    public boolean refresh(ConnectorConfig config) {
         Assert.notNull(config, "ConnectorConfig can not be null.");
-        String type = config.getConnectorType();
-        Connector connector = getConnector(type);
+        Connector connector = getConnector(config.getConnectorType());
         String cacheKey = connector.getConnectorMapperCacheKey(config);
         if (connectorCache.containsKey(cacheKey)) {
             ConnectorMapper mapper = connectorCache.get(cacheKey);
@@ -153,7 +151,7 @@ public class ConnectorFactory implements DisposableBean {
         return result;
     }
 
-    private Connector getConnector(ConnectorMapper connectorMapper) {
+    public Connector getConnector(ConnectorMapper connectorMapper) {
         return getConnector(connectorMapper.getConfig().getConnectorType());
     }
 

+ 4 - 1
dbsyncer-connector/src/main/java/org/dbsyncer/connector/ConnectorMapper.java

@@ -2,6 +2,7 @@ package org.dbsyncer.connector;
 
 import org.dbsyncer.connector.config.ConnectorConfig;
 import org.dbsyncer.connector.database.DatabaseTemplate;
+import org.springframework.dao.EmptyResultDataAccessException;
 
 import java.sql.Connection;
 
@@ -25,7 +26,9 @@ public class ConnectorMapper {
     public <T> T execute(HandleCallback callback) {
         try {
             return (T) callback.apply(new DatabaseTemplate(connection));
-        } catch (Exception e) {
+        } catch (EmptyResultDataAccessException e) {
+            throw e;
+        }catch (Exception e) {
             throw new ConnectorException(e.getMessage());
         }
     }

+ 5 - 3
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sqlserver/SqlServerConnectorMapper.java

@@ -7,6 +7,7 @@ import org.dbsyncer.connector.config.ConnectorConfig;
 import org.dbsyncer.connector.database.DatabaseTemplate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.dao.EmptyResultDataAccessException;
 
 import java.sql.Connection;
 import java.util.concurrent.locks.Lock;
@@ -15,7 +16,7 @@ import java.util.concurrent.locks.ReentrantLock;
 public final class SqlServerConnectorMapper extends ConnectorMapper {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
-    private final Lock lock = new ReentrantLock(true);
+    private final Lock   lock   = new ReentrantLock(true);
 
     public SqlServerConnectorMapper(ConnectorConfig config, Connection connection) {
         super(config, connection);
@@ -23,7 +24,6 @@ public final class SqlServerConnectorMapper extends ConnectorMapper {
 
     /**
      * 使用连接时加锁(SqlServer 2008以下版本连接未释放问题)
-     * TODO 判断版本,是否加锁
      *
      * @param callback
      * @return
@@ -38,6 +38,8 @@ public final class SqlServerConnectorMapper extends ConnectorMapper {
             if (locked) {
                 apply = callback.apply(new DatabaseTemplate(connection));
             }
+        } catch (EmptyResultDataAccessException e) {
+            throw e;
         } catch (Exception e) {
             logger.error(e.getMessage());
             throw new ConnectorException(e.getMessage());
@@ -48,4 +50,4 @@ public final class SqlServerConnectorMapper extends ConnectorMapper {
         }
         return (T) apply;
     }
-}
+}

+ 1 - 52
dbsyncer-connector/src/main/java/org/dbsyncer/connector/util/DatabaseUtil.java

@@ -1,6 +1,5 @@
 package org.dbsyncer.connector.util;
 
-import org.apache.commons.dbcp.DelegatingDatabaseMetaData;
 import org.apache.commons.lang.StringUtils;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.connector.ConnectorException;
@@ -12,7 +11,6 @@ import org.dbsyncer.connector.database.DatabaseTemplate;
 import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSet;
 import org.springframework.jdbc.support.rowset.SqlRowSet;
 import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
-import org.springframework.util.Assert;
 
 import java.sql.*;
 import java.util.ArrayList;
@@ -38,7 +36,7 @@ public abstract class DatabaseUtil {
             try {
                 rs.close();
             } catch (Exception e) {
-                e.printStackTrace();
+                throw new ConnectorException(e.getMessage());
             }
         }
     }
@@ -62,7 +60,6 @@ public abstract class DatabaseUtil {
             throw new ConnectorException("查询表字段不能为空.");
         }
         List<Field> fields = new ArrayList<>(columnCount);
-        // <表名,[主键, ...]>
         Map<String, List<String>> tables = new HashMap<>();
         try {
             DatabaseMetaData md = databaseTemplate.getConnection().getMetaData();
@@ -90,30 +87,6 @@ public abstract class DatabaseUtil {
         return new MetaInfo().setColumn(fields);
     }
 
-    /**
-     * 获取数据库名称
-     *
-     * @param conn
-     * @return
-     * @throws NoSuchFieldException
-     * @throws SQLException
-     * @throws IllegalAccessException
-     */
-    public static String getDataBaseName(Connection conn) throws NoSuchFieldException, SQLException, IllegalAccessException {
-        DelegatingDatabaseMetaData md = (DelegatingDatabaseMetaData) conn.getMetaData();
-        DatabaseMetaData delegate = md.getDelegate();
-        String driverVersion = delegate.getDriverVersion();
-        boolean driverThanMysql8 = isDriverVersionMoreThanMysql8(driverVersion);
-        String databaseProductVersion = delegate.getDatabaseProductVersion();
-        boolean dbThanMysql8 = isDatabaseProductVersionMoreThanMysql8(databaseProductVersion);
-        Assert.isTrue(driverThanMysql8 == dbThanMysql8, String.format("当前驱动%s和数据库%s版本不一致.", driverVersion, databaseProductVersion));
-
-        Class clazz = delegate.getClass().getSuperclass();
-        java.lang.reflect.Field field = clazz.getDeclaredField("database");
-        field.setAccessible(true);
-        return (String) field.get(delegate);
-    }
-
     /**
      * 返回主键名称
      *
@@ -135,30 +108,6 @@ public abstract class DatabaseUtil {
         throw new ConnectorException("Table primary key can not be empty.");
     }
 
-    /**
-     * Mysql 8.0
-     * <p>mysql-connector-java-8.0.11</p>
-     * <p>mysql-connector-java-5.1.40</p>
-     *
-     * @param driverVersion
-     * @return
-     */
-    private static boolean isDriverVersionMoreThanMysql8(String driverVersion) {
-        return StringUtils.startsWith(driverVersion, "mysql-connector-java-8");
-    }
-
-    /**
-     * Mysql 8.0
-     * <p>8.0.0-log</p>
-     * <p>5.7.26-log</p>
-     *
-     * @param databaseProductVersion
-     * @return
-     */
-    private static boolean isDatabaseProductVersionMoreThanMysql8(String databaseProductVersion) {
-        return StringUtils.startsWith(databaseProductVersion, "8");
-    }
-
     private static boolean isPk(Map<String, List<String>> tables, String tableName, String name) {
         List<String> pk = tables.get(tableName);
         return !CollectionUtils.isEmpty(pk) && pk.contains(name);

+ 19 - 5
dbsyncer-storage/src/main/java/org/dbsyncer/storage/support/MysqlStorageServiceImpl.java

@@ -11,7 +11,6 @@ import org.dbsyncer.connector.database.Database;
 import org.dbsyncer.connector.enums.ConnectorEnum;
 import org.dbsyncer.connector.enums.SetterEnum;
 import org.dbsyncer.connector.enums.SqlBuilderEnum;
-import org.dbsyncer.connector.mysql.MysqlConnector;
 import org.dbsyncer.connector.util.DatabaseUtil;
 import org.dbsyncer.storage.AbstractStorageService;
 import org.dbsyncer.storage.StorageException;
@@ -30,6 +29,8 @@ import org.springframework.util.Assert;
 
 import javax.annotation.PostConstruct;
 import java.io.*;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -74,13 +75,26 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
     @PostConstruct
     private void init() {
         logger.info("url:{}", config.getUrl());
-        ConnectorConfig cfg = config;
-        cfg.setConnectorType(ConnectorEnum.MYSQL.getType());
-        connector = new MysqlConnector();
+        config.setConnectorType(ConnectorEnum.MYSQL.getType());
         connectorMapper = connectorFactory.connect(config);
+        connector = (Database) connectorFactory.getConnector(connectorMapper);
 
         // 获取数据库名称
-        database = connectorMapper.execute((databaseTemplate) -> DatabaseUtil.getDataBaseName(databaseTemplate.getConnection()));
+        database = connectorMapper.execute((databaseTemplate) -> {
+            Connection conn = databaseTemplate.getConnection();
+            DatabaseMetaData metaData = conn.getMetaData();
+            String driverVersion = metaData.getDriverVersion();
+            String databaseProductVersion = metaData.getDatabaseProductVersion();
+            boolean driverThanMysql8 = StringUtils.startsWith(driverVersion, "mysql-connector-java-8");
+            boolean dbThanMysql8 = StringUtils.startsWith(databaseProductVersion, "8");
+            Assert.isTrue(driverThanMysql8 == dbThanMysql8, String.format("当前驱动%s和数据库%s版本不一致.", driverVersion, databaseProductVersion));
+
+            Class clazz = conn.getClass();
+            java.lang.reflect.Field field = clazz.getDeclaredField("database");
+            field.setAccessible(true);
+            Object value = field.get(conn);
+            return String.valueOf(value);
+        });
 
         // 初始化表
         initTable();

+ 0 - 15
pom.xml

@@ -41,8 +41,6 @@
         <commons-lang.version>2.6</commons-lang.version>
         <commons-fileupload.version>1.4</commons-fileupload.version>
         <commons-io.version>2.5</commons-io.version>
-        <commons-dbcp.version>1.4</commons-dbcp.version>
-        <commons-pool.version>1.6</commons-pool.version>
         <lucene.version>7.6.0</lucene.version>
         <ojdbc6.version>11.2.0.4.0-atlassian-hosted</ojdbc6.version>
         <mysql.version>5.1.40</mysql.version>
@@ -157,19 +155,6 @@
                 <version>${lucene.version}</version>
             </dependency>
 
-            <!-- 连接池 -->
-            <dependency>
-                <groupId>commons-pool</groupId>
-                <artifactId>commons-pool</artifactId>
-                <version>${commons-pool.version}</version>
-            </dependency>
-            <!-- 数据源 -->
-            <dependency>
-                <groupId>commons-dbcp</groupId>
-                <artifactId>commons-dbcp</artifactId>
-                <version>${commons-dbcp.version}</version>
-            </dependency>
-
             <!-- mysql-driver -->
             <dependency>
                 <groupId>mysql</groupId>