Browse Source

add Microsoft SQL Server support

pull/1/MERGE
Baoqi 6 years ago
parent
commit
9ed962a35f
  1. 12
      escheduler-api/src/main/java/cn/escheduler/api/service/DataSourceService.java
  2. 3
      escheduler-api/src/main/java/cn/escheduler/api/utils/Constants.java
  3. 11
      escheduler-common/pom.xml
  4. 5
      escheduler-common/src/main/java/cn/escheduler/common/Constants.java
  5. 3
      escheduler-common/src/main/java/cn/escheduler/common/enums/DbType.java
  6. 2
      escheduler-common/src/main/java/cn/escheduler/common/job/db/DataSourceFactory.java
  7. 71
      escheduler-common/src/main/java/cn/escheduler/common/job/db/SQLServerDataSource.java
  8. 4
      escheduler-server/src/main/java/cn/escheduler/server/worker/task/processdure/ProcedureTask.java
  9. 3
      escheduler-server/src/main/java/cn/escheduler/server/worker/task/sql/SqlTask.java
  10. 9
      escheduler-server/src/test/java/cn/escheduler/server/worker/sql/SqlExecutorTest.java
  11. 2
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/procedure.vue
  12. 1
      escheduler-ui/src/js/conf/home/pages/datasource/pages/list/_source/createDataSource.vue
  13. 5
      escheduler-ui/src/js/conf/home/store/dag/state.js
  14. 4
      escheduler-ui/src/js/conf/home/store/datasource/actions.js
  15. 6
      pom.xml

12
escheduler-api/src/main/java/cn/escheduler/api/service/DataSourceService.java

@ -210,6 +210,7 @@ public class DataSourceService extends BaseService{
switch (dataSource.getType()) { switch (dataSource.getType()) {
case HIVE: case HIVE:
case SQLSERVER:
separator = ";"; separator = ";";
break; break;
case MYSQL: case MYSQL:
@ -376,6 +377,10 @@ public class DataSourceService extends BaseService{
datasource = JSONObject.parseObject(parameter, OracleDataSource.class); datasource = JSONObject.parseObject(parameter, OracleDataSource.class);
Class.forName(Constants.COM_ORACLE_JDBC_DRIVER); Class.forName(Constants.COM_ORACLE_JDBC_DRIVER);
break; break;
case SQLSERVER:
datasource = JSONObject.parseObject(parameter, SQLServerDataSource.class);
Class.forName(Constants.COM_SQLSERVER_JDBC_DRIVER);
break;
default: default:
break; break;
} }
@ -447,7 +452,9 @@ public class DataSourceService extends BaseService{
|| Constants.CLICKHOUSE.equals(type.name()) || Constants.CLICKHOUSE.equals(type.name())
|| Constants.ORACLE.equals(type.name())) { || Constants.ORACLE.equals(type.name())) {
separator = "&"; separator = "&";
} else if (Constants.HIVE.equals(type.name()) || Constants.SPARK.equals(type.name())) { } else if (Constants.HIVE.equals(type.name())
|| Constants.SPARK.equals(type.name())
|| Constants.SQLSERVER.equals(type.name())) {
separator = ";"; separator = ";";
} }
@ -502,6 +509,9 @@ public class DataSourceService extends BaseService{
} else if (Constants.ORACLE.equals(type.name())) { } else if (Constants.ORACLE.equals(type.name())) {
sb.append(Constants.JDBC_ORACLE); sb.append(Constants.JDBC_ORACLE);
sb.append(host).append(":").append(port); sb.append(host).append(":").append(port);
} else if (Constants.SQLSERVER.equals(type.name())) {
sb.append(Constants.JDBC_SQLSERVER);
sb.append(host).append(":").append(port);
} }
return sb.toString(); return sb.toString();

3
escheduler-api/src/main/java/cn/escheduler/api/utils/Constants.java

@ -84,6 +84,7 @@ public class Constants {
public static final String ORG_APACHE_HIVE_JDBC_HIVE_DRIVER = "org.apache.hive.jdbc.HiveDriver"; public static final String ORG_APACHE_HIVE_JDBC_HIVE_DRIVER = "org.apache.hive.jdbc.HiveDriver";
public static final String COM_CLICKHOUSE_JDBC_DRIVER = "ru.yandex.clickhouse.ClickHouseDriver"; public static final String COM_CLICKHOUSE_JDBC_DRIVER = "ru.yandex.clickhouse.ClickHouseDriver";
public static final String COM_ORACLE_JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String COM_ORACLE_JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
public static final String COM_SQLSERVER_JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
/** /**
* database type * database type
@ -94,6 +95,7 @@ public class Constants {
public static final String SPARK = "SPARK"; public static final String SPARK = "SPARK";
public static final String CLICKHOUSE = "CLICKHOUSE"; public static final String CLICKHOUSE = "CLICKHOUSE";
public static final String ORACLE = "ORACLE"; public static final String ORACLE = "ORACLE";
public static final String SQLSERVER = "SQLSERVER";
/** /**
* jdbc url * jdbc url
@ -103,6 +105,7 @@ public class Constants {
public static final String JDBC_HIVE_2 = "jdbc:hive2://"; public static final String JDBC_HIVE_2 = "jdbc:hive2://";
public static final String JDBC_CLICKHOUSE = "jdbc:clickhouse://"; public static final String JDBC_CLICKHOUSE = "jdbc:clickhouse://";
public static final String JDBC_ORACLE = "jdbc:oracle:thin:@//"; public static final String JDBC_ORACLE = "jdbc:oracle:thin:@//";
public static final String JDBC_SQLSERVER = "jdbc:sqlserver://";
public static final String ADDRESS = "address"; public static final String ADDRESS = "address";

11
escheduler-common/pom.xml

@ -386,6 +386,17 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<exclusions>
<exclusion>
<artifactId>com.microsoft.azure</artifactId>
<groupId>azure-keyvault</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies> </dependencies>

5
escheduler-common/src/main/java/cn/escheduler/common/Constants.java

@ -621,6 +621,11 @@ public final class Constants {
*/ */
public static final String JDBC_ORACLE_CLASS_NAME = "oracle.jdbc.driver.OracleDriver"; public static final String JDBC_ORACLE_CLASS_NAME = "oracle.jdbc.driver.OracleDriver";
/**
* Oracle
*/
public static final String JDBC_SQLSERVER_CLASS_NAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
/** /**
* spark params constant * spark params constant
*/ */

3
escheduler-common/src/main/java/cn/escheduler/common/enums/DbType.java

@ -27,6 +27,7 @@ public enum DbType {
* 3 spark * 3 spark
* 4 clickhouse * 4 clickhouse
* 5 oracle * 5 oracle
* 6 sqlserver
*/ */
MYSQL, POSTGRESQL, HIVE, SPARK, CLICKHOUSE, ORACLE MYSQL, POSTGRESQL, HIVE, SPARK, CLICKHOUSE, ORACLE, SQLSERVER
} }

2
escheduler-common/src/main/java/cn/escheduler/common/job/db/DataSourceFactory.java

@ -43,6 +43,8 @@ public class DataSourceFactory {
return JSONUtils.parseObject(parameter, ClickHouseDataSource.class); return JSONUtils.parseObject(parameter, ClickHouseDataSource.class);
case ORACLE: case ORACLE:
return JSONUtils.parseObject(parameter, OracleDataSource.class); return JSONUtils.parseObject(parameter, OracleDataSource.class);
case SQLSERVER:
return JSONUtils.parseObject(parameter, SQLServerDataSource.class);
default: default:
return null; return null;
} }

71
escheduler-common/src/main/java/cn/escheduler/common/job/db/SQLServerDataSource.java

@ -0,0 +1,71 @@
/*
* 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 cn.escheduler.common.job.db;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* data source of SQL Server
*/
public class SQLServerDataSource extends BaseDataSource {
private static final Logger logger = LoggerFactory.getLogger(SQLServerDataSource.class);
/**
* gets the JDBC url for the data source connection
* @return
*/
@Override
public String getJdbcUrl() {
String jdbcUrl = getAddress();
jdbcUrl += ";databaseName=" + getDatabase();
if (StringUtils.isNotEmpty(getOther())) {
jdbcUrl += ";" + getOther();
}
return jdbcUrl;
}
/**
* test whether the data source can be connected successfully
* @throws Exception
*/
@Override
public void isConnectable() throws Exception {
Connection con = null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(getJdbcUrl(), getUser(), getPassword());
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.error("SQL Server datasource try conn close conn error", e);
throw e;
}
}
}
}
}

4
escheduler-server/src/main/java/cn/escheduler/server/worker/task/processdure/ProcedureTask.java

@ -26,6 +26,7 @@ import cn.escheduler.common.job.db.ClickHouseDataSource;
import cn.escheduler.common.job.db.MySQLDataSource; import cn.escheduler.common.job.db.MySQLDataSource;
import cn.escheduler.common.job.db.OracleDataSource; import cn.escheduler.common.job.db.OracleDataSource;
import cn.escheduler.common.job.db.PostgreDataSource; import cn.escheduler.common.job.db.PostgreDataSource;
import cn.escheduler.common.job.db.SQLServerDataSource;
import cn.escheduler.common.process.Property; import cn.escheduler.common.process.Property;
import cn.escheduler.common.task.AbstractParameters; import cn.escheduler.common.task.AbstractParameters;
import cn.escheduler.common.task.procedure.ProcedureParameters; import cn.escheduler.common.task.procedure.ProcedureParameters;
@ -121,6 +122,9 @@ public class ProcedureTask extends AbstractTask {
}else if (DbType.ORACLE.name().equals(dataSource.getType().name())){ }else if (DbType.ORACLE.name().equals(dataSource.getType().name())){
baseDataSource = JSONObject.parseObject(dataSource.getConnectionParams(), OracleDataSource.class); baseDataSource = JSONObject.parseObject(dataSource.getConnectionParams(), OracleDataSource.class);
Class.forName(Constants.JDBC_ORACLE_CLASS_NAME); Class.forName(Constants.JDBC_ORACLE_CLASS_NAME);
}else if (DbType.SQLSERVER.name().equals(dataSource.getType().name())){
baseDataSource = JSONObject.parseObject(dataSource.getConnectionParams(), SQLServerDataSource.class);
Class.forName(Constants.JDBC_SQLSERVER_CLASS_NAME);
} }
// get jdbc connection // get jdbc connection

3
escheduler-server/src/main/java/cn/escheduler/server/worker/task/sql/SqlTask.java

@ -126,6 +126,9 @@ public class SqlTask extends AbstractTask {
}else if (DbType.ORACLE.name().equals(dataSource.getType().name())){ }else if (DbType.ORACLE.name().equals(dataSource.getType().name())){
baseDataSource = JSONObject.parseObject(dataSource.getConnectionParams(),OracleDataSource.class); baseDataSource = JSONObject.parseObject(dataSource.getConnectionParams(),OracleDataSource.class);
Class.forName(Constants.JDBC_ORACLE_CLASS_NAME); Class.forName(Constants.JDBC_ORACLE_CLASS_NAME);
}else if (DbType.SQLSERVER.name().equals(dataSource.getType().name())){
baseDataSource = JSONObject.parseObject(dataSource.getConnectionParams(),SQLServerDataSource.class);
Class.forName(Constants.JDBC_SQLSERVER_CLASS_NAME);
} }
Map<Integer,Property> sqlParamMap = new HashMap<Integer,Property>(); Map<Integer,Property> sqlParamMap = new HashMap<Integer,Property>();

9
escheduler-server/src/test/java/cn/escheduler/server/worker/sql/SqlExecutorTest.java

@ -77,6 +77,15 @@ public class SqlExecutorTest {
sharedTestSqlTask(nodeName, taskAppId, tenantCode, taskInstId); sharedTestSqlTask(nodeName, taskAppId, tenantCode, taskInstId);
} }
@Test
public void testSQLServer() throws Exception {
String nodeName = "SQL Server sql test";
String taskAppId = "3_14_27";
String tenantCode = "demo";
int taskInstId = 27;
sharedTestSqlTask(nodeName, taskAppId, tenantCode, taskInstId);
}
/** /**
* Basic test template for SQLTasks, mainly test different types of DBMS types * Basic test template for SQLTasks, mainly test different types of DBMS types
* @param nodeName node name for selected task * @param nodeName node name for selected task

2
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/procedure.vue

@ -6,7 +6,7 @@
<m-datasource <m-datasource
ref="refDs" ref="refDs"
@on-dsData="_onDsData" @on-dsData="_onDsData"
:supportType="['MYSQL','POSTGRESQL','CLICKHOUSE', 'ORACLE']" :supportType="['MYSQL','POSTGRESQL','CLICKHOUSE', 'ORACLE', 'SQLSERVER']"
:data="{ type:type,datasource:datasource }"> :data="{ type:type,datasource:datasource }">
</m-datasource> </m-datasource>
</div> </div>

1
escheduler-ui/src/js/conf/home/pages/datasource/pages/list/_source/createDataSource.vue

@ -15,6 +15,7 @@
<x-radio :label="'SPARK'">SPARK</x-radio> <x-radio :label="'SPARK'">SPARK</x-radio>
<x-radio :label="'CLICKHOUSE'">CLICKHOUSE</x-radio> <x-radio :label="'CLICKHOUSE'">CLICKHOUSE</x-radio>
<x-radio :label="'ORACLE'">ORACLE</x-radio> <x-radio :label="'ORACLE'">ORACLE</x-radio>
<x-radio :label="'SQLSERVER'">SQLSERVER</x-radio>
</x-radio-group> </x-radio-group>
</template> </template>
</m-list-box-f> </m-list-box-f>

5
escheduler-ui/src/js/conf/home/store/dag/state.js

@ -76,6 +76,11 @@ export default {
id: 5, id: 5,
code: 'ORACLE', code: 'ORACLE',
disabled: false disabled: false
},
{
id: 6,
code: 'SQLSERVER',
disabled: false
} }
], ],
// Alarm interface // Alarm interface

4
escheduler-ui/src/js/conf/home/store/datasource/actions.js

@ -20,7 +20,7 @@ import io from '@/module/io'
export default { export default {
/** /**
* Data source creation * Data source creation
* @param "type": string,//MYSQL, POSTGRESQL, HIVE, SPARK, CLICKHOUSE, ORACLE * @param "type": string,//MYSQL, POSTGRESQL, HIVE, SPARK, CLICKHOUSE, ORACLE, SQLSERVER
* @param "name": string, * @param "name": string,
* @param "desc": string, * @param "desc": string,
* @param "parameter":string //{"address":"jdbc:hive2://192.168.220.189:10000","autoReconnect":"true","characterEncoding":"utf8","database":"default","initialTimeout":3000,"jdbcUrl":"jdbc:hive2://192.168.220.189:10000/default","maxReconnect":10,"password":"","useUnicode":true,"user":"hive"} * @param "parameter":string //{"address":"jdbc:hive2://192.168.220.189:10000","autoReconnect":"true","characterEncoding":"utf8","database":"default","initialTimeout":3000,"jdbcUrl":"jdbc:hive2://192.168.220.189:10000/default","maxReconnect":10,"password":"","useUnicode":true,"user":"hive"}
@ -49,7 +49,7 @@ export default {
}, },
/** /**
* Query data source list - no paging * Query data source list - no paging
* @param "type": string//MYSQL, POSTGRESQL, HIVE, SPARK, CLICKHOUSE, ORACLE * @param "type": string//MYSQL, POSTGRESQL, HIVE, SPARK, CLICKHOUSE, ORACLE, SQLSERVER
*/ */
getDatasourcesList ({ state }, payload) { getDatasourcesList ({ state }, payload) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {

6
pom.xml

@ -372,6 +372,12 @@
<version>0.1.52</version> <version>0.1.52</version>
</dependency> </dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>6.1.0.jre8</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>

Loading…
Cancel
Save