diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f16cdb5..aac6fa1 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -38,10 +38,10 @@
 
     services:
       mysql:
-        image: mysql:8
+        image: mysql:8.0
         env:
           # The MySQL docker container requires these environment variables to be set, so we can create and migrate the test database.
-          MYSQL_DATABASE: EVENTMESH_DASHBOARD
+          MYSQL_DATABASE: eventmesh_dashboard_test
           MYSQL_ROOT_PASSWORD: password
         ports:
           # https://docs.github.com/en/actions/using-containerized-services/about-service-containers
diff --git a/eventmesh-dashboard-console/pom.xml b/eventmesh-dashboard-console/pom.xml
index ddf6595..ac0bc7c 100644
--- a/eventmesh-dashboard-console/pom.xml
+++ b/eventmesh-dashboard-console/pom.xml
@@ -29,6 +29,12 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <!-- ASP dependency -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aspects</artifactId>
+            <version>5.1.2.RELEASE</version>
+        </dependency>
 
         <!-- swagger -->
         <dependency>
@@ -70,19 +76,38 @@
             <scope>runtime</scope>
         </dependency>
 
+        <!-- health check client -->
+        <!-- Eventmesh SDK -->
         <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-aspects</artifactId>
-            <version>5.1.2.RELEASE</version>
+            <groupId>org.apache.eventmesh</groupId>
+            <artifactId>eventmesh-sdk-java</artifactId>
+            <version>1.10.0-release</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>junit</groupId>
+                    <artifactId>junit</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>junit</groupId>
+                    <artifactId>junit-dep</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
+        <!-- storage redis client -->
+        <dependency>
+            <groupId>io.lettuce</groupId>
+            <artifactId>lettuce-core</artifactId>
+        </dependency>
+        <!-- health check client end -->
+
+
+        <!-- TODO: remove junit4 dependency -->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.13.2</version>
             <scope>test</scope>
         </dependency>
-
-
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connection/ConnectionEntity.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connection/ConnectionEntity.java
index d4d21c5..0a451cf 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connection/ConnectionEntity.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connection/ConnectionEntity.java
@@ -25,13 +25,17 @@
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 
 /**
  * A Connection is a link from a source to a sink.
  */
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
 public class ConnectionEntity extends BaseEntity {
 
     private static final long serialVersionUID = 6565578252656944905L;
@@ -43,6 +47,12 @@
     private Long id;
 
     /**
+     * Runtime cluster id
+     */
+    @Schema(name = "clusterId", description = "runtime cluster id")
+    private Long clusterId;
+
+    /**
      * The type of source. Possible values are "connector" or "client".
      */
     @Schema(name = "sourceType", defaultValue = "connector", allowableValues = {"connector", "client"})
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connector/ConnectorEntity.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connector/ConnectorEntity.java
index 1e7cb07..1681ac2 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connector/ConnectorEntity.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connector/ConnectorEntity.java
@@ -37,6 +37,8 @@
     @Schema(name = "id", description = "primary key")
     private Long id;
 
+    private Long clusterId;
+
     private String name;
 
     private String className;
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/health/HealthCheckResultEntity.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/health/HealthCheckResultEntity.java
new file mode 100644
index 0000000..e8578eb
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/health/HealthCheckResultEntity.java
@@ -0,0 +1,52 @@
+/*
+ * 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.eventmesh.dashboard.console.entity.health;
+
+import org.apache.eventmesh.dashboard.console.entity.base.BaseEntity;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(name = "HealthCheckResultEntity", description = "Health check result entity")
+public class HealthCheckResultEntity extends BaseEntity {
+
+    private static final long serialVersionUID = -7350585209577598040L;
+    @Schema(name = "id", description = "primary key")
+    private Long id;
+
+    private Long clusterId;
+
+    @Schema(description = "Type of Health Check;0:Unknown, 1:Cluster, 2:Runtime, 3:Topic, 4:Storage", defaultValue = "0", allowableValues = {"0",
+        "1", "2", "3", "4"})
+    private Integer type;
+
+    @Schema(description = "Instance id(database schema) of the health check object")
+    private Long typeId;
+
+    private String resultDesc;
+
+    @Schema(description = "status of a health check, 0: failed, 1: passed, 2: doing check, 3: out of time")
+    private Integer status;
+
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckStatus.java
similarity index 69%
copy from eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
copy to eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckStatus.java
index 7263f7c..fd5bc12 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckStatus.java
@@ -15,14 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.dashboard.console.scheduler.health;
+package org.apache.eventmesh.dashboard.console.enums.health;
 
-import org.springframework.stereotype.Component;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
 
-import lombok.extern.slf4j.Slf4j;
+@Getter
+@AllArgsConstructor
+public enum HealthCheckStatus {
+    FAILED(0, "failed"),
+    PASSED(1, "passed"),
+    CHECKING(2, "checking"),
+    TIMEOUT(3, "timeout");
 
-@Slf4j
-@Component
-public class HealthCheckScheduler {
-
+    private final Integer number;
+    private final String name;
 }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckType.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckType.java
new file mode 100644
index 0000000..3ee990b
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckType.java
@@ -0,0 +1,57 @@
+/*
+ * 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.eventmesh.dashboard.console.enums.health;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+public enum HealthCheckType {
+    UNKNOWN(0, "unknown"),
+
+    CLUSTER(1, "cluster"),
+
+    RUNTIME(2, "runtime"),
+
+    TOPIC(3, "topic"),
+
+    STORAGE(4, "storage");
+
+    @Getter
+    private final Integer number;
+    @Getter
+    private final String name;
+
+    public static Integer toNumber(String name) {
+        for (HealthCheckType healthCheckTypeEnum : HealthCheckType.values()) {
+            if (healthCheckTypeEnum.name.equals(name)) {
+                return healthCheckTypeEnum.number;
+            }
+        }
+        return UNKNOWN.number;
+    }
+
+    public static String toName(Integer number) {
+        for (HealthCheckType healthCheckTypeEnum : HealthCheckType.values()) {
+            if (healthCheckTypeEnum.number.equals(number)) {
+                return healthCheckTypeEnum.name;
+            }
+        }
+        return UNKNOWN.name;
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapper.java
index 671bd81..3adab3b 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapper.java
@@ -19,13 +19,14 @@
 
 import org.apache.eventmesh.dashboard.console.entity.client.ClientEntity;
 
-import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Options;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
+import java.util.List;
+
 /**
  * Mybatis Mapper for the table of client.
  */
@@ -33,27 +34,22 @@
 public interface ClientMapper {
 
     @Select("SELECT * FROM `client` WHERE `id` = #{id}")
-    ClientEntity selectById(Long id);
+    ClientEntity selectById(ClientEntity clientEntity);
 
     @Select("SELECT * FROM `client` WHERE `cluster_id` = #{clusterId}")
-    ClientEntity selectByClusterId(Long clusterId);
+    List<ClientEntity> selectByClusterId(ClientEntity clientEntity);
 
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     @Insert(
         "INSERT INTO `client` (`cluster_id`, `name`, `platform`,"
-            + " `language`, `pid`, `host`, `port`, `protocol`,"
-            + " `status`, `config_ids`, `description`, `end_time`) "
+            + "`language`, `pid`, `host`, `port`, `protocol`,"
+            + "`status`, `config_ids`, `description`) "
             + "VALUES (#{clusterId}, #{name}, #{platform},"
-            + " #{language}, #{pid}, #{host}, #{port}, #{protocol},"
-            + " #{status}, #{configIds}, #{description}, #{endTime})")
+            + "#{language}, #{pid}, #{host}, #{port}, #{protocol},"
+            + "#{status}, #{configIds}, #{description})")
     void insert(ClientEntity clientEntity);
 
-    @Update("UPDATE `client` SET status = #{status}, end_time = NOW() WHERE id = #{id}")
+    @Update("UPDATE `client` SET status = 0, end_time = NOW() WHERE id = #{id}")
     void deActive(ClientEntity clientEntity);
 
-    @Update("UPDATE `client` SET status = #{status} WHERE id = #{id}")
-    void updateStatus(ClientEntity clientEntity);
-
-    @Delete("DELETE FROM `client` WHERE id = #{id}")
-    void deleteById(Long id);
 }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapper.java
index af0a2ac..fc6756a 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapper.java
@@ -19,13 +19,14 @@
 
 import org.apache.eventmesh.dashboard.console.entity.connection.ConnectionEntity;
 
-import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
+import java.sql.Timestamp;
 import java.util.List;
 
 /**
@@ -34,51 +35,57 @@
 @Mapper
 public interface ConnectionMapper {
 
-    @Select("SELECT * FROM connection WHERE id = #{id}")
-    ConnectionEntity selectById(ConnectionEntity connectionEntity);
-
     @Select("SELECT * FROM connection")
     List<ConnectionEntity> selectAll();
 
     @Select("SELECT * FROM connection WHERE cluster_id = #{clusterId}")
     List<ConnectionEntity> selectByClusterId(ConnectionEntity connectionEntity);
 
+    @Select("SELECT * FROM connection WHERE cluster_id = #{clusterId} AND source_id = #{sourceId} AND source_type = #{sourceType}")
+    public List<ConnectionEntity> selectByClusterIdSourceTypeAndSourceId(ConnectionEntity connectionEntity);
+
+    @Select("SELECT * FROM connection WHERE cluster_id = #{clusterId} AND sink_id = #{sinkId} AND sink_type = #{sinkType}")
+    public List<ConnectionEntity> selectByClusterIdSinkTypeAndSinkId(ConnectionEntity connectionEntity);
+
+    @Select("SELECT * FROM connection WHERE cluster_id = #{clusterId} AND source_id = #{sourceId} AND source_type = #{sourceType} "
+        + "AND create_time > #{startTime} AND create_time < #{endTime}")
+    public List<ConnectionEntity> selectByClusterIdSourceTypeAndSourceIdAndCreateTimeRange(ConnectionEntity connectionEntity,
+        @Param("startTime") Timestamp startTime, @Param("endTime") Timestamp endTime);
+
+    @Select("SELECT * FROM connection WHERE cluster_id = #{clusterId} AND sink_id = #{sinkId} AND sink_type = #{sinkType} "
+        + "AND create_time > #{startTime} AND create_time < #{endTime}")
+    public List<ConnectionEntity> selectByClusterIdSinkTypeAndSinkIdAndCreateTimeRange(ConnectionEntity connectionEntity,
+        @Param("startTime") Timestamp startTime, @Param("endTime") Timestamp endTime);
+
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
-    @Insert("INSERT INTO connection (cluster_id, source_type, source_id,"
-        + " sink_type, sink_id, runtime_id, status, topic, group_id, description)"
+    @Insert("INSERT INTO connection (cluster_id, source_type, source_id," + " sink_type, sink_id, runtime_id, status, topic, group_id, description)"
         + " VALUES ( #{clusterId}, #{sourceType}, #{sourceId}, "
         + " #{sinkType}, #{sinkId},  #{runtimeId}, #{status}, #{topic}, #{groupId}, #{description})")
     void insert(ConnectionEntity connectionEntity);
 
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
-    @Insert("<script>"
-        + "INSERT INTO connection (cluster_id, source_type, source_id,"
-        + " sink_type, sink_id, runtime_id, status,"
-        + " topic, group_id, description) VALUES "
-        +
-        "<foreach collection='list' item='connectionEntity' index='index' separator=','>"
-        + "(#{connectionEntity.clusterId}, #{connectionEntity.sourceType}, #{connectionEntity.sourceId},"
-        + " #{connectionEntity.sinkType}, #{connectionEntity.sinkId}, #{connectionEntity.runtimeId}, #{connectionEntity.status},"
-        + " #{connectionEntity.topic}, #{connectionEntity.groupId}, #{connectionEntity.description})"
-        + "</foreach>"
-        + "</script>")
+    @Insert({
+        "<script>",
+        "   INSERT INTO connection (cluster_id, source_type, source_id," + " sink_type, sink_id, runtime_id, status,",
+        "   topic, group_id, description) VALUES ",
+        "   <foreach collection='list' item='connectionEntity' index='index' separator=','>",
+        "       (#{connectionEntity.clusterId}, #{connectionEntity.sourceType}, #{connectionEntity.sourceId},",
+        "       #{connectionEntity.sinkType}, #{connectionEntity.sinkId}, #{connectionEntity.runtimeId}, #{connectionEntity.status},",
+        "       #{connectionEntity.topic}, #{connectionEntity.groupId}, #{connectionEntity.description})",
+        "   </foreach>",
+        "</script>"})
     void batchInsert(List<ConnectionEntity> connectionEntityList);
 
-    @Update("UPDATE connection SET status = #{status}, end_time = NOW() WHERE id = #{id}")
+    @Update("UPDATE connection SET status = 1, end_time = NOW() WHERE id = #{id}")
     void endConnectionById(ConnectionEntity connectionEntity);
 
-    @Delete("DELETE FROM connection WHERE cluster_id = #{clusterId}")
-    void deleteAllByClusterId(ConnectionEntity connectionEntity);
-
-    @Delete("DELETE FROM connection WHERE id = #{id}")
-    void deleteById(ConnectionEntity connectionEntity);
-
-    @Delete("<script>"
-        + "DELETE FROM connection WHERE id IN "
-        + "<foreach item='item' index='index' collection='list' open='(' separator=',' close=')'>"
-        + "#{item.id}"
-        + "</foreach>"
-        + "</script>")
-    void batchDelete(List<ConnectionEntity> connectionEntityList);
+    //batch end
+    @Update({
+        "<script>",
+        "   <foreach collection='list' item='connectionEntity' index='index' separator=';'>",
+        "       UPDATE connection SET status = 1, end_time = NOW() WHERE id = #{connectionEntity.id}",
+        "   </foreach>",
+        "</script>"})
+    void batchEndConnectionById(List<ConnectionEntity> connectionEntityList);
 
 }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapper.java
index 0791327..2f5101a 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapper.java
@@ -19,7 +19,6 @@
 
 import org.apache.eventmesh.dashboard.console.entity.connector.ConnectorEntity;
 
-import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Options;
@@ -38,22 +37,22 @@
     ConnectorEntity selectById(ConnectorEntity connectorEntity);
 
     @Select("SELECT * FROM connector WHERE cluster_id = #{clusterId}")
-    ConnectorEntity selectByClusterId(ConnectorEntity connectorEntity);
+    List<ConnectorEntity> selectByClusterId(ConnectorEntity connectorEntity);
 
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
-    @Insert("INSERT INTO connector (cluster_id, name, class_name, type, status, pod_state, config_ids) "
-        + "VALUES (#{connectClusterId}, #{name}, #{className}, #{type}, #{status}, #{podState}, #{configIds})")
+    @Insert("INSERT INTO connector (cluster_id,name, class_name, type, status, pod_state, config_ids) "
+        + "VALUES (#{clusterId}, #{name}, #{className}, #{type}, #{status}, #{podState}, #{configIds})")
     void insert(ConnectorEntity connectorEntity);
 
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
-    @Insert("<script>"
-        + "INSERT INTO connector (cluster_id, name, class_name, type, status, pod_state, config_ids) VALUES "
-        +
-        "<foreach collection='list' item='connectorEntity' index='index' separator=','>"
-        + "(#{connectorEntity.connectClusterId}, #{connectorEntity.name}, #{connectorEntity.className},"
-        + " #{connectorEntity.type}, #{connectorEntity.status}, #{connectorEntity.podState}, #{connectorEntity.configIds})"
-        + "</foreach>"
-        + "</script>")
+    @Insert({
+        "<script>",
+        "   INSERT INTO connector (cluster_id, name, class_name, type, status, pod_state, config_ids) VALUES ",
+        "   <foreach collection='list' item='connectorEntity' index='index' separator=','>",
+        "       (#{connectorEntity.clusterId}, #{connectorEntity.name}, #{connectorEntity.className},",
+        "       #{connectorEntity.type}, #{connectorEntity.status}, #{connectorEntity.podState}, #{connectorEntity.configIds})",
+        "   </foreach>",
+        "</script>"})
     void batchInsert(List<ConnectorEntity> connectorEntityList);
 
     @Update("UPDATE connector SET status = #{status} WHERE id = #{id}")
@@ -65,18 +64,17 @@
     @Update("UPDATE connector SET config_ids = #{configIds} WHERE id = #{id}")
     void updateConfigIds(ConnectorEntity connectorEntity);
 
-    @Delete("DELETE FROM connector WHERE id = #{id}")
-    void deleteById(ConnectorEntity connectorEntity);
+    @Update("UPDATE connector SET status = 0 WHERE cluster_id = #{clusterId}")
+    void deActiveById(ConnectorEntity connectorEntity);
 
-    @Delete("DELETE FROM connector WHERE cluster_id = #{clusterId}")
-    void deleteByClusterId(ConnectorEntity connectorEntity);
-
-    @Delete("<script>"
-        + "DELETE FROM connector WHERE id IN "
-        +
-        "<foreach collection='list' item='connectorEntity' index='index' open='(' separator=',' close=')'>"
-        + "#{connectorEntity.id}"
-        + "</foreach>"
-        + "</script>")
-    void batchDelete(List<ConnectorEntity> connectorEntities);
+    @Update({
+        "<script>",
+        "   update connector set status = 0 ",
+        "   where id in ",
+        "   <foreach collection='list' item='item' index='index' open='(' separator=',' close=')'>",
+        "       #{item.id}",
+        "   </foreach>",
+        "</script>"
+    })
+    void batchDeActive(List<ConnectorEntity> connectorEntities);
 }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/group/OprGroupMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/group/OprGroupMapper.java
index f1a91ed..7812861 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/group/OprGroupMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/group/OprGroupMapper.java
@@ -55,19 +55,19 @@
     @Select("select * from `group` where id=#{id} and is_delete=0")
     GroupEntity selectGroupById(GroupEntity groupEntity);
 
-    @Select("<script>"
-        + "select * from `group`"
-        + "<where>"
-        + "<if test='clusterId != null'>"
-        + "cluster_id=#{clusterId}"
-        + "</if>"
-        + "<if test='name != null'>"
-        + "and name like concat('%',#{name},'%')"
-        + "</if>"
-        + "and is_delete=0"
-        + "</where>"
-        + "</script>")
+    @Select({
+        "<script>",
+        "   select * from `group`",
+        "   <where>",
+        "       <if test='clusterId != null'>",
+        "           cluster_id=#{clusterId}",
+        "       </if>",
+        "       <if test='name != null'>",
+        "           and name like concat('%',#{name},'%')",
+        "       </if>",
+        "       and is_delete=0",
+        "   </where>",
+        "</script>"})
     List<GroupEntity> selectGroup(GroupEntity groupEntity);
 
-
 }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/groupmember/OprGroupMemberMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/groupmember/OprGroupMemberMapper.java
index 3179eff..aac0a59 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/groupmember/OprGroupMemberMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/groupmember/OprGroupMemberMapper.java
@@ -59,21 +59,22 @@
     @Select("select * from group_member where id=#{id} and is_delete=0")
     GroupMemberEntity selectGroupMemberById(GroupMemberEntity groupMemberEntity);
 
-    @Select("<script>"
-        + "select * from group_member"
-        + "<where>"
-        + "<if test='clusterId != null'>"
-        + "cluster_id=#{clusterId}"
-        + "</if>"
-        + "<if test='groupName != null'>"
-        + "and group_name=#{groupName}"
-        + "</if>"
-        + "<if test='topicName != null'>"
-        + "and topic_name=#{topicName}"
-        + "</if>"
-        + "</where>"
-        + "and is_delete=0"
-        + "</script>")
+    @Select({
+        "<script>",
+        "   select * from group_member",
+        "   <where>",
+        "       <if test='clusterId != null'>",
+        "           cluster_id=#{clusterId}",
+        "       </if>",
+        "       <if test='groupName != null'>",
+        "           and group_name=#{groupName}",
+        "       </if>",
+        "       <if test='topicName != null'>",
+        "           and topic_name=#{topicName}",
+        "       </if>",
+        "    </where>",
+        "   and is_delete=0",
+        "</script>"})
     List<GroupMemberEntity> selectMember(GroupMemberEntity groupMemberEntity);
 
     @Update("update group_member set state=#{state} where topic_name=#{topicName}")
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapper.java
new file mode 100644
index 0000000..d5d5aab
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapper.java
@@ -0,0 +1,91 @@
+/*
+ * 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.eventmesh.dashboard.console.mapper.health;
+
+import org.apache.eventmesh.dashboard.console.entity.health.HealthCheckResultEntity;
+
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * Mapper for health check result
+ */
+@Mapper
+public interface HealthCheckResultMapper {
+
+    @Select("SELECT * FROM health_check_result WHERE id = #{id}")
+    HealthCheckResultEntity selectById(HealthCheckResultEntity healthCheckResultEntity);
+
+    @Select("SELECT * FROM health_check_result WHERE cluster_id = #{clusterId} AND type = #{type} AND type_id = #{typeId}")
+    List<HealthCheckResultEntity> selectByClusterIdAndTypeAndTypeId(HealthCheckResultEntity healthCheckResultEntity);
+
+    @Select("SELECT * FROM health_check_result WHERE cluster_id = #{clusterId} AND type = #{type}")
+    List<HealthCheckResultEntity> selectByClusterIdAndType(HealthCheckResultEntity healthCheckResultEntity);
+
+    @Select("SELECT * FROM health_check_result WHERE cluster_id = #{clusterId} AND create_time > #{startTime} AND create_time < #{endTime}")
+    List<HealthCheckResultEntity> selectByClusterIdAndCreateTimeRange(@Param("clusterId") Long clusterId,
+        @Param("startTime") Timestamp startTime, @Param("endTime") Timestamp endTime);
+
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    @Insert("INSERT INTO health_check_result(type,type_id, cluster_id, status,result_desc)"
+        + " VALUES( #{type}, #{typeId}, #{clusterId}, #{status}, #{resultDesc})")
+    void insert(HealthCheckResultEntity healthCheckResultEntity);
+
+    @Insert({
+        "<script>",
+        "   INSERT INTO health_check_result(type, type_id, cluster_id, status, result_desc) VALUES ",
+        "   <foreach collection='list' item='healthCheckResultEntity' index='index' separator=','>",
+        "       (#{healthCheckResultEntity.type}, #{healthCheckResultEntity.typeId}, #{healthCheckResultEntity.clusterId},",
+        "       #{healthCheckResultEntity.status}, #{healthCheckResultEntity.resultDesc})",
+        "   </foreach>",
+        "</script>"
+    })
+    void batchInsert(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+    @Update("UPDATE health_check_result SET status = #{status}, result_desc = #{resultDesc} WHERE id = #{id}")
+    void update(HealthCheckResultEntity healthCheckResultEntity);
+
+    @Update({
+        "<script>",
+        "   <foreach collection='list' item='healthCheckResultEntity' index='index' separator=';'>",
+        "       UPDATE health_check_result SET status = #{healthCheckResultEntity.status},",
+        "       result_desc = #{healthCheckResultEntity.resultDesc} WHERE id = #{healthCheckResultEntity.id}",
+        "   </foreach>",
+        "</script>"})
+    void batchUpdate(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+    @Select({
+        "<script>",
+        "   SELECT * FROM health_check_result",
+        "   WHERE (cluster_id, type, type_id, status) IN",
+        "   <foreach collection='list' item='item' open='(' separator=',' close=')'>",
+        "       (#{item.clusterId}, #{item.type}, #{item.typeId}, 2)",
+        "   </foreach>",
+        "   ORDER BY create_time DESC",
+        "</script>"
+    })
+    List<HealthCheckResultEntity> getIdsNeedToBeUpdateByClusterIdAndTypeAndTypeId(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/log/OprLogMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/log/OprLogMapper.java
index d6c96f7..8f2dbf4 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/log/OprLogMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/log/OprLogMapper.java
@@ -33,21 +33,22 @@
 @Mapper
 public interface OprLogMapper {
 
-    @Select("<script>"
-        + "select * from operation_log"
-        + "<where>"
-        + "<if test='targetType!=null'>"
-        + "target_type=#{targetType}"
-        + "</if>"
-        + "<if test='operationUser!=null'>"
-        + "and operation_user=#{operationUser}"
-        + "</if>"
-        + "<if test='clusterId!=null'>"
-        + "and cluster_id=#{clusterId} "
-        + "</if>"
-        + "and is_delete=0"
-        + "</where>"
-        + "</script>")
+    @Select({
+        "<script>",
+        "   select * from operation_log",
+        "   <where>",
+        "       <if test='targetType!=null'>",
+        "           target_type=#{targetType}",
+        "       </if>",
+        "       <if test='operationUser!=null'>",
+        "           and operation_user=#{operationUser}",
+        "       </if>",
+        "       <if test='clusterId!=null'>",
+        "           and cluster_id=#{clusterId} ",
+        "       </if>",
+        "       and is_delete=0",
+        "   </where>",
+        "</script>"})
     List<LogEntity> getLogList(LogEntity logEntity);
 
     @Insert("insert into operation_log ( cluster_id, operation_type,target_Type, description,operation_user,result_content)"
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapper.java
index f22bf74..ab57fc1 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapper.java
@@ -34,7 +34,7 @@
     @Select("SELECT * FROM meta WHERE id = #{id}")
     MetaEntity selectById(MetaEntity metaEntity);
 
-    @Select("SELECT * FROM meta WHERE cluster_id = #{clusterId}")
+    @Select("SELECT * FROM meta WHERE cluster_id = #{clusterId} LIMIT 1")
     MetaEntity selectByClusterId(MetaEntity metaEntity);
 
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/topic/TopicMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/topic/TopicMapper.java
index 8a396be..42d68d0 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/topic/TopicMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/topic/TopicMapper.java
@@ -35,18 +35,19 @@
 @Mapper
 public interface TopicMapper {
 
-    @Select("<script>"
-        + "select * from topic"
-        + "<where>"
-        + "<if test='topicName!=null'>"
-        + "and topic_name=#{topicName}"
-        + "</if>"
-        + "<if test='clusterId!=null'>"
-        + "and cluster_id=#{clusterId} "
-        + "</if>"
-        + "and is_delete=0"
-        + "</where>"
-        + "</script>")
+    @Select({
+        "<script>",
+        "   select * from topic",
+        "   <where>",
+        "       <if test='topicName!=null'>",
+        "           and topic_name=#{topicName}",
+        "       </if>",
+        "       <if test='clusterId!=null'>",
+        "           and cluster_id=#{clusterId} ",
+        "       </if>",
+        "       and is_delete=0",
+        "   </where>",
+        "</script>"})
     List<TopicEntity> getTopicList(TopicEntity topicEntity);
 
     @Insert("INSERT INTO topic (cluster_id, topic_name, runtime_id, storage_id, retention_ms, type, description) "
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImpl.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImpl.java
index 780ee99..cf22a83 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImpl.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImpl.java
@@ -61,7 +61,7 @@
             List<ConnectionEntity> existingConnections = connectionMapper.selectByClusterId(connectionEntity);
 
             // Collect connections that are not in the new list
-            List<ConnectionEntity> connectionsToDelete = existingConnections.stream()
+            List<ConnectionEntity> connectionsToInactive = existingConnections.stream()
                 .filter(existingConnection -> !newConnections.contains(existingConnection))
                 .collect(Collectors.toList());
 
@@ -71,8 +71,8 @@
                 .collect(Collectors.toList());
 
             // Delete connections in batch
-            if (!connectionsToDelete.isEmpty()) {
-                connectionMapper.batchDelete(connectionsToDelete);
+            if (!connectionsToInactive.isEmpty()) {
+                connectionMapper.batchEndConnectionById(connectionsToInactive);
             }
 
             // Insert new connections in batch
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataService.java
new file mode 100644
index 0000000..19e3715
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataService.java
@@ -0,0 +1,40 @@
+/*
+ * 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.eventmesh.dashboard.console.service.health;
+
+import org.apache.eventmesh.dashboard.console.entity.health.HealthCheckResultEntity;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * Service providing data of HealthCheckResult.
+ */
+public interface HealthDataService {
+    HealthCheckResultEntity insertHealthCheckResult(HealthCheckResultEntity healthCheckResultEntity);
+
+    void batchInsertHealthCheckResult(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+    List<HealthCheckResultEntity> queryHealthCheckResultByClusterIdAndTypeAndTypeId(HealthCheckResultEntity entity);
+
+    void batchUpdateCheckResult(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+    void batchUpdateCheckResultByClusterIdAndTypeAndTypeId(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+    List<HealthCheckResultEntity> queryHealthCheckResultByClusterIdAndTimeRange(Long clusterId, Timestamp startTime, Timestamp endTime);
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataServiceMemoryStorage.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataServiceMemoryStorage.java
new file mode 100644
index 0000000..85a2667
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataServiceMemoryStorage.java
@@ -0,0 +1,86 @@
+/*
+ * 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.eventmesh.dashboard.console.service.health;
+
+import org.apache.eventmesh.dashboard.console.entity.health.HealthCheckResultEntity;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class HealthDataServiceMemoryStorage {
+
+    private static final List<HealthCheckResultEntity> cache = new ArrayList<>();
+    private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+
+
+    public HealthCheckResultEntity insertHealthCheckResult(HealthCheckResultEntity healthCheckResultEntity) {
+        lock.writeLock().lock();
+        try {
+            healthCheckResultEntity.setCreateTime(new Timestamp(System.currentTimeMillis()));
+            cache.add(healthCheckResultEntity);
+            return healthCheckResultEntity;
+        } finally {
+            lock.writeLock().unlock();
+        }
+    }
+
+
+    public void batchInsertHealthCheckResult(List<HealthCheckResultEntity> healthCheckResultEntityList) {
+        lock.writeLock().lock();
+        try {
+            for (HealthCheckResultEntity entity : healthCheckResultEntityList) {
+                entity.setCreateTime(new Timestamp(System.currentTimeMillis()));
+                cache.add(entity);
+            }
+        } finally {
+            lock.writeLock().unlock();
+        }
+    }
+
+
+    public List<HealthCheckResultEntity> queryHealthCheckResultByClusterIdAndTimeRange(Long clusterId, Timestamp startTime, Timestamp endTime) {
+        lock.readLock().lock();
+        try {
+            List<HealthCheckResultEntity> result = new ArrayList<>();
+            for (HealthCheckResultEntity entity : cache) {
+                if (entity.getClusterId().equals(clusterId) && entity.getCreateTime().after(startTime) && entity.getCreateTime().before(endTime)) {
+                    result.add(entity);
+                }
+            }
+            return result;
+        } finally {
+            lock.readLock().unlock();
+        }
+    }
+
+    public List<HealthCheckResultEntity> popAll() {
+        lock.writeLock().lock();
+        try {
+            List<HealthCheckResultEntity> result = new ArrayList<>(cache);
+            cache.clear();
+            return result;
+        } finally {
+            lock.writeLock().unlock();
+        }
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/impl/HealthDataServiceDatabaseImpl.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/impl/HealthDataServiceDatabaseImpl.java
new file mode 100644
index 0000000..f1593cc
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/impl/HealthDataServiceDatabaseImpl.java
@@ -0,0 +1,77 @@
+/*
+ * 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.eventmesh.dashboard.console.service.health.impl;
+
+import org.apache.eventmesh.dashboard.console.entity.health.HealthCheckResultEntity;
+import org.apache.eventmesh.dashboard.console.mapper.health.HealthCheckResultMapper;
+import org.apache.eventmesh.dashboard.console.service.health.HealthDataService;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class HealthDataServiceDatabaseImpl implements HealthDataService {
+
+    @Autowired
+    private HealthCheckResultMapper healthCheckResultMapper;
+
+    @Override
+    public HealthCheckResultEntity insertHealthCheckResult(HealthCheckResultEntity healthCheckResultEntity) {
+        healthCheckResultMapper.insert(healthCheckResultEntity);
+        return healthCheckResultEntity;
+    }
+
+    @Override
+    public void batchInsertHealthCheckResult(List<HealthCheckResultEntity> healthCheckResultEntityList) {
+        healthCheckResultMapper.batchInsert(healthCheckResultEntityList);
+    }
+
+    @Override
+    public List<HealthCheckResultEntity> queryHealthCheckResultByClusterIdAndTypeAndTypeId(HealthCheckResultEntity entity) {
+        return healthCheckResultMapper.selectByClusterIdAndTypeAndTypeId(entity);
+    }
+
+    @Override
+    public void batchUpdateCheckResult(List<HealthCheckResultEntity> healthCheckResultEntityList) {
+        healthCheckResultMapper.batchUpdate(healthCheckResultEntityList);
+    }
+
+    @Override
+    public void batchUpdateCheckResultByClusterIdAndTypeAndTypeId(List<HealthCheckResultEntity> healthCheckResultEntityList) {
+        List<HealthCheckResultEntity> idsNeedToBeUpdate = healthCheckResultMapper.getIdsNeedToBeUpdateByClusterIdAndTypeAndTypeId(
+            healthCheckResultEntityList);
+        idsNeedToBeUpdate.forEach(entity -> {
+            healthCheckResultEntityList.forEach(updateEntity -> {
+                if (entity.getClusterId().equals(updateEntity.getClusterId()) && entity.getType().equals(updateEntity.getType())
+                    && entity.getTypeId().equals(updateEntity.getTypeId())) {
+                    updateEntity.setId(entity.getId());
+                }
+            });
+        });
+        healthCheckResultMapper.batchUpdate(healthCheckResultEntityList);
+    }
+
+
+    @Override
+    public List<HealthCheckResultEntity> queryHealthCheckResultByClusterIdAndTimeRange(Long clusterId, Timestamp startTime, Timestamp endTime) {
+        return healthCheckResultMapper.selectByClusterIdAndCreateTimeRange(clusterId, startTime, endTime);
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/resources/application-dev.yml b/eventmesh-dashboard-console/src/main/resources/application-dev.yml
index 0ff18a1..d411315 100644
--- a/eventmesh-dashboard-console/src/main/resources/application-dev.yml
+++ b/eventmesh-dashboard-console/src/main/resources/application-dev.yml
@@ -30,9 +30,9 @@
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
-      url: jdbc:mysql://localhost:3306/eventmesh-dashboard?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
-      username: root
-      password: 123456
+      url: jdbc:mysql://localhost:3306/eventmesh_dashboard?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+      username: ${DB_USERNAME}
+      password: ${DB_PASSWORD}
 
       initial-size: 1
       max-active: 50
diff --git a/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql b/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql
index 96cf1e3..96d4a84 100644
--- a/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql
+++ b/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql
@@ -14,13 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+DROP TABLE IF EXISTS `group`;
 CREATE TABLE `group`
 (
     `id`           bigint unsigned                                  NOT NULL AUTO_INCREMENT COMMENT 'id',
     `cluster_id`   bigint                                           NOT NULL DEFAULT '-1' COMMENT '集群id',
     `name`         varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group名称',
     `member_count` int unsigned                                     NOT NULL DEFAULT '0' COMMENT '成员数',
-    `members`      text COMMENT 'group的member列表',
+    `members`      varchar(1024) COMMENT 'group的member列表',
     `type`         tinyint                                          NOT NULL COMMENT 'group类型 0：consumer 1：producer',
     `state`        varchar(64)                                      NOT NULL DEFAULT '' COMMENT '状态',
     `create_time`  timestamp                                        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
@@ -31,10 +32,10 @@
     KEY `cluster_id` (`cluster_id`, `name`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 322
-  DEFAULT CHARSET = utf8mb3 COMMENT ='Group信息表'
+  DEFAULT CHARSET = utf8mb3 COMMENT ='Group信息表';
 
 
-
+DROP TABLE IF EXISTS `group_member`;
 CREATE TABLE `group_member`
 (
     `id`             bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
@@ -51,21 +52,21 @@
     KEY `cluster_id` (`cluster_id`, `topic_name`, `group_name`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 257
-  DEFAULT CHARSET = utf8mb3 COMMENT ='GroupMember信息表'
+  DEFAULT CHARSET = utf8mb3 COMMENT ='GroupMember信息表';
 
 
-
+DROP TABLE IF EXISTS `operation_log`;
 CREATE TABLE `operation_log`
 (
     `id`             bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
     `cluster_id`     bigint          NOT NULL DEFAULT '-1' COMMENT '物理集群ID',
     `operation_type` varchar(192)    NOT NULL DEFAULT '' COMMENT '操作类型,如:启动，停止，重启，添加，删除，修改',
     `status`         int             NOT NULL DEFAULT '0' COMMENT '操作状态 0:未知，1:执行中，2:成功，3:失败',
-    `content`    text COMMENT '备注信息',
+    `content`        varchar(1024) COMMENT '备注信息',
     `create_time`    timestamp       NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `end_time`       timestamp       NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '结束时间',
     `operation_user` varchar(192)             DEFAULT NULL,
-    `result` text,
+    `result`         varchar(1024),
     `target_type`    varchar(192)    NOT NULL,
     `is_delete`      int             NOT NULL DEFAULT '0',
     PRIMARY KEY (`id`),
@@ -73,10 +74,10 @@
     KEY `idx_status` (`status`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 68
-  DEFAULT CHARSET = utf8mb3 COMMENT ='操作记录信息表'
+  DEFAULT CHARSET = utf8mb3 COMMENT ='操作记录信息表';
 
 
-
+DROP TABLE IF EXISTS `topic`;
 CREATE TABLE `topic`
 (
     `id`           bigint unsigned                                  NOT NULL AUTO_INCREMENT COMMENT 'id',
@@ -86,7 +87,7 @@
     `storage_id`   varchar(2048)                                    NOT NULL DEFAULT '' COMMENT 'StorageId',
     `retention_ms` bigint                                           NOT NULL DEFAULT '-2' COMMENT '保存时间，-2：未知，-1：无限制，>=0对应时间，单位ms',
     `type`         tinyint                                          NOT NULL DEFAULT '0' COMMENT 'Topic类型，默认0，0:普通，1:EventMesh内部',
-    `description`  text COMMENT '备注信息',
+    `description`  varchar(1024)                                             DEFAULT '' COMMENT '备注信息',
     `create_time`  timestamp                                        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(尽量与Topic实际创建时间一致)',
     `update_time`  timestamp                                        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间(尽量与Topic实际创建时间一致)',
     `is_delete`    int                                              NOT NULL DEFAULT '0',
@@ -95,8 +96,7 @@
     KEY `cluster_id` (`cluster_id`, `topic_name`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 562
-  DEFAULT CHARSET = utf8mb3 COMMENT ='Topic信息表'
-
+  DEFAULT CHARSET = utf8mb3 COMMENT ='Topic信息表';
 
 
 DROP TABLE IF EXISTS `client`;
@@ -112,8 +112,8 @@
     `port`        int(16)             NOT NULL DEFAULT '-1' COMMENT '客户端端口',
     `protocol`    varchar(192)        NOT NULL DEFAULT '' COMMENT '协议类型',
     `status`      tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '状态: 1启用，0未启用',
-    `config_ids`  text                NOT NULL DEFAULT '' COMMENT 'csv config id list, like:1,3,7',
-    `description` text                NOT NULL DEFAULT '' COMMENT '客户端描述',
+    `config_ids`  varchar(1024)       NOT NULL DEFAULT '' COMMENT 'csv config id list, like:1,3,7',
+    `description` varchar(1024)       NOT NULL DEFAULT '' COMMENT '客户端描述',
     `create_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `end_time`    timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '结束时间',
     `update_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
@@ -121,7 +121,7 @@
     PRIMARY KEY (`id`),
     INDEX `idx_cluster_id` (`cluster_id`)
 ) ENGINE = InnoDB
-  DEFAULT CHARSET = utf8 COMMENT ='客户端信息表';
+  DEFAULT CHARSET = utf8 COMMENT ='client is an SDK application that can produce or consume events.';
 
 
 
@@ -135,7 +135,7 @@
     `type`        varchar(32)         NOT NULL DEFAULT '' COMMENT 'Connector类型',
     `status`      tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '状态: 1启用，0未启用',
     `pod_state`   tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT 'k8s pod状态。0: pending;1: running;2: success;3: failed;4: unknown',
-    `config_ids`  text                NOT NULL DEFAULT '' COMMENT 'csv config id list, like:1,3,7',
+    `config_ids`  varchar(1024)       NOT NULL DEFAULT '' COMMENT 'csv config id list, like:1,3,7',
     `create_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `update_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
     PRIMARY KEY (`id`),
@@ -156,7 +156,7 @@
     `status`      tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '状态: 1启用，0未启用',
     `topic`       varchar(192)        NOT NULL DEFAULT '' COMMENT 'topic name',
     `group_id`    bigint(20)          NOT NULL DEFAULT '-1' COMMENT 'GroupID',
-    `description` text                NOT NULL DEFAULT '' COMMENT '客户端描述',
+    `description` varchar(1024)       NOT NULL DEFAULT '' COMMENT '客户端描述',
     `create_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `end_time`    timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '结束时间',
     `update_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
@@ -168,22 +168,22 @@
     INDEX `idx_source_id` (`source_id`),
     INDEX `idx_sink_id` (`sink_id`)
 ) ENGINE = InnoDB
-  DEFAULT CHARSET = utf8 COMMENT ='client和connector连接关系，这里的client包括runtime';
+  DEFAULT CHARSET = utf8 COMMENT ='connection from event source to event sink. event source can be a source connector or a producer client.';
 
 DROP TABLE IF EXISTS `health_check_result`;
 CREATE TABLE `health_check_result`
 (
     `id`          bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
-    `dimension`   int(11)             NOT NULL DEFAULT '0' COMMENT '检查维度(0:未知，1:Cluster，2:Runtime，3:Topic，4:Group)',
-    `config_name` varchar(192)        NOT NULL DEFAULT '' COMMENT '配置名',
+    `type`        tinyint(4)          NOT NULL DEFAULT '0' COMMENT '检查维度(0:未知, 1:Cluster, 2:Runtime, 3:Topic, 4:Storage)',
+    `type_id`     bigint(20) unsigned NOT NULL COMMENT '对应检查维度的实例id',
     `cluster_id`  bigint(20)          NOT NULL DEFAULT '0' COMMENT '集群ID',
-    `res_name`    varchar(192)        NOT NULL DEFAULT '' COMMENT '资源名称',
-    `passed`      tinyint(4)          NOT NULL DEFAULT '0' COMMENT '检查通过(0:未通过，1:通过)',
+    `status`      tinyint(4)          NOT NULL DEFAULT '0' COMMENT '检查状态(0:未通过，1:通过,2:正在检查,3:超时)',
+    `result_desc` varchar(1024)       NOT NULL DEFAULT '' COMMENT '检查结果描述',
     `create_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `update_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
     PRIMARY KEY (`id`),
     INDEX `idx_cluster_id` (`cluster_id`),
-    UNIQUE KEY `uniq_dimension_config_cluster_res` (`dimension`, `config_name`, `cluster_id`, `res_name`)
+    INDEX `idx_type` (`type`)
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8 COMMENT ='健康检查结果';
 
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapperTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapperTest.java
new file mode 100644
index 0000000..8388de6
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapperTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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.eventmesh.dashboard.console.mapper.client;
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.client.ClientEntity;
+import org.apache.eventmesh.dashboard.console.enums.StatusEnum;
+
+import java.util.List;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:use-test-schema.sql", "classpath:eventmesh-dashboard.sql"})
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:client-test.sql")
+class ClientMapperTest {
+
+    @Autowired
+    private ClientMapper clientMapper;
+
+    @Test
+    public void testSelectById() {
+        ClientEntity clientEntity = new ClientEntity();
+        clientEntity.setId(1L);
+        ClientEntity result = clientMapper.selectById(clientEntity);
+        Assertions.assertEquals("java", result.getLanguage());
+        Assertions.assertEquals(3, result.getClusterId());
+    }
+
+    @Test
+    public void testSelectByClusterId() {
+        ClientEntity clientEntity = new ClientEntity();
+        clientEntity.setClusterId(3L);
+        List<ClientEntity> results = clientMapper.selectByClusterId(clientEntity);
+        Assertions.assertEquals(3, results.size());
+        Assertions.assertEquals("java", results.get(0).getLanguage());
+        Assertions.assertEquals("go", results.get(2).getLanguage());
+    }
+
+    @Test
+    public void testInsert() {
+        ClientEntity clientEntity = new ClientEntity();
+        clientEntity.setHost("127.0.0.1");
+        clientEntity.setClusterId(4L);
+        clientEntity.setName("clientName");
+        clientEntity.setDescription("");
+        clientEntity.setPid(1L);
+        clientEntity.setPort(8080);
+        clientEntity.setStatusEntity(StatusEnum.ACTIVE);
+        clientEntity.setConfigIds("");
+        clientEntity.setLanguage("rust");
+        clientEntity.setPlatform("");
+        clientEntity.setProtocol("http");
+        clientMapper.insert(clientEntity);
+
+        ClientEntity result = clientMapper.selectById(clientEntity);
+        Assertions.assertEquals("127.0.0.1", result.getHost());
+
+        Assertions.assertEquals(2, clientMapper.selectByClusterId(clientEntity).size());
+    }
+
+    @Test
+    public void testDeactivate() {
+        ClientEntity clientEntity = new ClientEntity();
+        clientEntity.setId(1L);
+        clientMapper.deActive(clientEntity);
+        ClientEntity result = clientMapper.selectById(clientEntity);
+        Assertions.assertEquals(0, result.getStatus());
+        Assertions.assertNotEquals(result.getCreateTime(), result.getEndTime());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapperTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapperTest.java
new file mode 100644
index 0000000..7087e00
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapperTest.java
@@ -0,0 +1,124 @@
+/*
+ * 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.eventmesh.dashboard.console.mapper.connection;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.connection.ConnectionEntity;
+
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:use-test-schema.sql", "classpath:eventmesh-dashboard.sql"})
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:connection-test.sql")
+class ConnectionMapperTest {
+
+    @Autowired
+    private ConnectionMapper connectionMapper;
+
+    @Test
+    public void testSelectAll() {
+        assertEquals(6, connectionMapper.selectAll().size());
+    }
+
+    @Test
+    public void testSelectByClusterId() {
+        ConnectionEntity connectionEntity = new ConnectionEntity();
+        connectionEntity.setClusterId(1L);
+        assertEquals(3, connectionMapper.selectByClusterId(connectionEntity).size());
+    }
+
+    @Test
+    public void testSelectByClusterIdSourceTypeAndSourceId() {
+        ConnectionEntity connectionEntity = new ConnectionEntity();
+        connectionEntity.setClusterId(1L);
+        connectionEntity.setSourceId(1L);
+        connectionEntity.setSourceType("connector");
+        List<ConnectionEntity> results = connectionMapper.selectByClusterIdSourceTypeAndSourceId(connectionEntity);
+        assertEquals(1, results.size());
+        assertEquals("connector", results.get(0).getSinkType());
+        assertEquals(1, results.get(0).getSinkId());
+    }
+
+    @Test
+    public void testSelectByClusterIdSinkTypeAndSinkId() {
+        ConnectionEntity connectionEntity = new ConnectionEntity();
+        connectionEntity.setClusterId(1L);
+        connectionEntity.setSinkId(2L);
+        connectionEntity.setSinkType("connector");
+        List<ConnectionEntity> results = connectionMapper.selectByClusterIdSinkTypeAndSinkId(connectionEntity);
+        assertEquals(1, results.size());
+        assertEquals("connector", results.get(0).getSourceType());
+        assertEquals(2, results.get(0).getSourceId());
+    }
+
+    @Test
+    public void testInsert() {
+        ConnectionEntity connectionEntity = new ConnectionEntity(1L, 1L, "connector", 1L, "connector", 2L, 1L, 0, "topic", 3L, null, "description");
+        connectionMapper.insert(connectionEntity);
+        assertEquals(7, connectionMapper.selectAll().size());
+    }
+
+    @Test
+    public void testBatchInsert() {
+        ConnectionEntity connectionEntity1 = new ConnectionEntity(1L, 1L, "connector", 1L, "connector", 2L, 1L, 0, "topic", 3L, null, "description");
+        ConnectionEntity connectionEntity2 = new ConnectionEntity(1L, 1L, "connector", 1L, "connector", 2L, 1L, 0, "topic", 3L, null, "description");
+        connectionMapper.batchInsert(Arrays.asList(connectionEntity1, connectionEntity2));
+        assertEquals(8, connectionMapper.selectAll().size());
+    }
+
+    @Test
+    public void testEndConnectionById() {
+        ConnectionEntity connectionEntity = new ConnectionEntity();
+        connectionEntity.setId(1L);
+        connectionMapper.endConnectionById(connectionEntity);
+        List<ConnectionEntity> results = connectionMapper.selectAll();
+        ConnectionEntity result = results.get(0);
+        assertEquals(1, result.getStatus());
+        assertNotNull(result.getEndTime());
+    }
+
+    @Test
+    public void testBatchEndConnection() {
+        ConnectionEntity connectionEntity1 = new ConnectionEntity();
+        connectionEntity1.setId(1L);
+        ConnectionEntity connectionEntity2 = new ConnectionEntity();
+        connectionEntity2.setId(2L);
+        connectionMapper.batchEndConnectionById(Arrays.asList(connectionEntity1, connectionEntity2));
+
+        List<ConnectionEntity> all = connectionMapper.selectAll();
+        assertEquals(1, all.get(0).getStatus());
+        assertEquals(1, all.get(1).getStatus());
+        assertNotEquals(all.get(0).getCreateTime(), all.get(0).getEndTime());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapperTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapperTest.java
new file mode 100644
index 0000000..0bb360b
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapperTest.java
@@ -0,0 +1,128 @@
+/*
+ * 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.eventmesh.dashboard.console.mapper.connector;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.connector.ConnectorEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:use-test-schema.sql", "classpath:eventmesh-dashboard.sql"})
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:connector-test.sql")
+class ConnectorMapperTest {
+
+    @Autowired
+    private ConnectorMapper connectorMapper;
+
+    @Test
+    public void testSelectById() {
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setId(1L);
+
+        connectorEntity = connectorMapper.selectById(connectorEntity);
+
+        assertNotNull(connectorEntity);
+        assertEquals(1L, connectorEntity.getClusterId());
+        assertEquals("the", connectorEntity.getClassName());
+    }
+
+    @Test
+    public void testSelectByClusterId() {
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setClusterId(1L);
+
+        List<ConnectorEntity> results = connectorMapper.selectByClusterId(connectorEntity);
+
+        assertEquals(3, results.size());
+        assertEquals("quick", results.get(1).getClassName());
+    }
+
+    @Test
+    public void testInsert() {
+        ConnectorEntity connectorEntity = new ConnectorEntity(1L, 1L, "test", "test", "test", 0, 2, "test");
+        connectorMapper.insert(connectorEntity);
+
+        assertNotNull(connectorEntity);
+        assertEquals(6, connectorEntity.getId());
+    }
+
+    @Test
+    public void testBatchInsert() {
+        ConnectorEntity connectorEntity1 = new ConnectorEntity(1L, 1L, "test", "test", "test", 0, 2, "test");
+        ConnectorEntity connectorEntity2 = new ConnectorEntity(1L, 1L, "test", "test", "test", 0, 2, "test");
+        ConnectorEntity connectorEntity3 = new ConnectorEntity(1L, 1L, "test", "test", "test", 0, 2, "test");
+        List<ConnectorEntity> connectorEntityList = new ArrayList<>();
+        connectorEntityList.add(connectorEntity1);
+        connectorEntityList.add(connectorEntity2);
+        connectorEntityList.add(connectorEntity3);
+
+        connectorMapper.batchInsert(connectorEntityList);
+
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setClusterId(1L);
+        List<ConnectorEntity> results = connectorMapper.selectByClusterId(connectorEntity);
+        assertEquals(6, results.size());
+    }
+
+    @Test
+    public void testUpdateK8sStatus() {
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setId(1L);
+        connectorEntity.setPodState(3);
+        connectorMapper.updatePodState(connectorEntity);
+
+        connectorEntity = connectorMapper.selectById(connectorEntity);
+        assertEquals(3, connectorEntity.getPodState());
+    }
+
+    @Test
+    public void testUpdateConfigIds() {
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setId(1L);
+        connectorEntity.setConfigIds("1,3,4,5,6,7");
+        connectorMapper.updateConfigIds(connectorEntity);
+
+        connectorEntity = connectorMapper.selectById(connectorEntity);
+        assertEquals("1,3,4,5,6,7", connectorEntity.getConfigIds());
+    }
+
+    @Test
+    public void testDeActiveById() {
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setId(1L);
+        connectorMapper.deActiveById(connectorEntity);
+
+        connectorEntity = connectorMapper.selectById(connectorEntity);
+        assertEquals(1, connectorEntity.getStatus());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapperTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapperTest.java
new file mode 100644
index 0000000..d91cd22
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapperTest.java
@@ -0,0 +1,138 @@
+/*
+ * 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.eventmesh.dashboard.console.mapper.health;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.health.HealthCheckResultEntity;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:use-test-schema.sql", "classpath:eventmesh-dashboard.sql"})
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:health-test.sql")
+class HealthCheckResultMapperTest {
+
+    @Autowired
+    private HealthCheckResultMapper healthCheckResultMapper;
+
+    @Test
+    public void testSelectById() {
+        HealthCheckResultEntity healthCheckResultEntity = new HealthCheckResultEntity();
+        healthCheckResultEntity.setId(1L);
+        healthCheckResultEntity = healthCheckResultMapper.selectById(healthCheckResultEntity);
+        assertEquals(1, healthCheckResultEntity.getId());
+        assertEquals(0, healthCheckResultEntity.getStatus());
+    }
+
+    @Test
+    public void testSelectByClusterIdAndTypeAndTypeId() {
+        HealthCheckResultEntity healthCheckResultEntity = new HealthCheckResultEntity(1L, 1L, 1, 1L, "", 1);
+        healthCheckResultEntity = healthCheckResultMapper.selectByClusterIdAndTypeAndTypeId(healthCheckResultEntity).get(0);
+        assertEquals(1, healthCheckResultEntity.getId());
+        assertEquals(0, healthCheckResultEntity.getStatus());
+    }
+
+    @Test
+    public void testSelectByClusterIdAndType() {
+        HealthCheckResultEntity healthCheckResultEntity = new HealthCheckResultEntity(1L, 1L, 1, 1L, "", 1);
+        List<HealthCheckResultEntity> results = healthCheckResultMapper.selectByClusterIdAndType(healthCheckResultEntity);
+        assertEquals(2, results.size());
+    }
+
+    @Test
+    public void testSelectByClusterIdAndTimeRange() throws ParseException {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+        Date startDate = dateFormat.parse("2024-02-02 10:56:50");
+        Timestamp startTimestamp = new Timestamp(startDate.getTime());
+        Date endDate = dateFormat.parse("2024-02-03 10:56:52");
+        Timestamp endTimestamp = new Timestamp(endDate.getTime());
+        List<HealthCheckResultEntity> results = healthCheckResultMapper.selectByClusterIdAndCreateTimeRange(1L, startTimestamp, endTimestamp);
+        assertEquals(4, results.size());
+    }
+
+    @Test
+    public void testInsert() {
+        HealthCheckResultEntity healthCheckResultEntity = new HealthCheckResultEntity(1L, 5L, 1, 5L, "", 1);
+        healthCheckResultMapper.insert(healthCheckResultEntity);
+        healthCheckResultEntity = healthCheckResultMapper.selectById(healthCheckResultEntity);
+        assertEquals(7, healthCheckResultEntity.getId());
+    }
+
+    @Test
+    public void testBatchInsert() {
+        HealthCheckResultEntity healthCheckResultEntity1 = new HealthCheckResultEntity(1L, 1L, 1, 5L, "", 1);
+        HealthCheckResultEntity healthCheckResultEntity2 = new HealthCheckResultEntity(1L, 1L, 1, 6L, "", 1);
+        healthCheckResultMapper.batchInsert(Arrays.asList(healthCheckResultEntity1, healthCheckResultEntity2));
+        List<HealthCheckResultEntity> results = healthCheckResultMapper.selectByClusterIdAndType(healthCheckResultEntity1);
+        assertEquals(4, results.size());
+    }
+
+    @Test
+    public void testUpdate() {
+        HealthCheckResultEntity healthCheckResultEntity = new HealthCheckResultEntity(1L, 1L, 1, 1L, "reason", 0);
+        healthCheckResultMapper.update(healthCheckResultEntity);
+        healthCheckResultEntity = healthCheckResultMapper.selectByClusterIdAndTypeAndTypeId(healthCheckResultEntity).get(0);
+        assertEquals(0, healthCheckResultEntity.getStatus());
+    }
+
+    @Test
+    public void testBatchUpdate() {
+        HealthCheckResultEntity healthCheckResultEntity1 = new HealthCheckResultEntity(1L, 1L, 1, 1L, "reason", 0);
+        HealthCheckResultEntity healthCheckResultEntity2 = new HealthCheckResultEntity(2L, 1L, 1, 1L, "reason", 0);
+        healthCheckResultMapper.batchUpdate(Arrays.asList(healthCheckResultEntity1, healthCheckResultEntity2));
+        healthCheckResultEntity1 = healthCheckResultMapper.selectById(healthCheckResultEntity1);
+        healthCheckResultEntity2 = healthCheckResultMapper.selectById(healthCheckResultEntity2);
+
+        assertEquals(0, healthCheckResultEntity1.getStatus());
+        assertEquals(0, healthCheckResultEntity2.getStatus());
+    }
+
+    @Test
+    public void testUpdateByClusterIdAndTypeAndTypeId() {
+        HealthCheckResultEntity entity1 = new HealthCheckResultEntity(null, 1L, 1, 1L, "reason", 2);
+        HealthCheckResultEntity entity2 = new HealthCheckResultEntity(null, 1L, 1, 1L, "reason", 2);
+        healthCheckResultMapper.batchInsert(Arrays.asList(entity1, entity2));
+
+        List<HealthCheckResultEntity> toBeUpdate = healthCheckResultMapper.getIdsNeedToBeUpdateByClusterIdAndTypeAndTypeId(
+            Arrays.asList(entity1, entity2));
+
+        toBeUpdate.forEach(entity -> entity.setStatus(2));
+
+        healthCheckResultMapper.batchUpdate(toBeUpdate);
+        entity1.setId(7L);
+        assertEquals(2, healthCheckResultMapper.selectById(entity1).getStatus());
+        entity2.setId(1L);
+        assertEquals(0, healthCheckResultMapper.selectById(entity2).getStatus());
+    }
+
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapperTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapperTest.java
new file mode 100644
index 0000000..42e58f4
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapperTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.eventmesh.dashboard.console.mapper.meta;
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.meta.MetaEntity;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:use-test-schema.sql", "classpath:eventmesh-dashboard.sql"})
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:meta-test.sql")
+class MetaMapperTest {
+
+    @Autowired
+    private MetaMapper metaMapper;
+
+    @Test
+    public void testSelectByClusterId() {
+        MetaEntity metaEntity = new MetaEntity();
+        metaEntity.setClusterId(1L);
+        metaEntity = metaMapper.selectByClusterId(metaEntity);
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImplTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImplTest.java
new file mode 100644
index 0000000..78cee9d
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImplTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.eventmesh.dashboard.console.service.connection.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.apache.eventmesh.dashboard.console.entity.connection.ConnectionEntity;
+
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+
+
+@ExtendWith(SpringExtension.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:connection-test.sql")
+@SpringBootTest
+public class ConnectionDataServiceDatabaseImplTest {
+
+    @Autowired
+    private ConnectionDataServiceDatabaseImpl connectionServiceDatabaseImpl;
+
+    @Test
+    public void testGetAllConnectionsByClusterId() {
+        List<ConnectionEntity> connectionEntityList = connectionServiceDatabaseImpl.getAllConnectionsByClusterId(1L);
+        assertEquals(3, connectionEntityList.size());
+    }
+
+    @Test
+    public void testGetAllConnections() {
+        List<ConnectionEntity> connectionEntityList = connectionServiceDatabaseImpl.getAllConnections();
+        assertEquals(6, connectionEntityList.size());
+    }
+
+    @Test
+    public void testReplaceAllConnections() {
+        List<ConnectionEntity> connectionEntityList = connectionServiceDatabaseImpl.getAllConnectionsByClusterId(1L);
+        //change ClusterId into 2
+        connectionEntityList.forEach(connectionEntity -> connectionEntity.setClusterId(2L));
+        connectionServiceDatabaseImpl.replaceAllConnections(connectionEntityList);
+        assertEquals(8, connectionServiceDatabaseImpl.getAllConnections().size());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/resources/application-test.yml b/eventmesh-dashboard-console/src/test/resources/application-test.yml
index 1a903d3..b70a657 100644
--- a/eventmesh-dashboard-console/src/test/resources/application-test.yml
+++ b/eventmesh-dashboard-console/src/test/resources/application-test.yml
@@ -21,9 +21,9 @@
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
-      url: jdbc:mysql://localhost:3306/eventmesh-dashboard-test?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+      url: jdbc:mysql://localhost:3306/eventmesh_dashboard_test?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
       username: root
-      password: root
+      password: password
 
       initial-size: 1
       max-active: 50
diff --git a/eventmesh-dashboard-console/src/test/resources/client-test.sql b/eventmesh-dashboard-console/src/test/resources/client-test.sql
new file mode 100644
index 0000000..4a652f8
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/resources/client-test.sql
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+DELETE
+FROM `eventmesh_dashboard_test`.client
+WHERE TRUE;
+ALTER TABLE `eventmesh_dashboard_test`.client
+    AUTO_INCREMENT = 1;
+
+insert into `eventmesh_dashboard_test`.client (id, cluster_id, name, platform, language, pid, host, port, protocol, status, config_ids, description,
+                                               create_time, end_time, update_time)
+values (1, 3, '', '', 'java', -1, '', -1, '', 1, '', '', '2024-02-02 15:15:15', '2024-02-02 15:15:15', '2024-02-02 15:15:15'),
+       (2, 3, '', '', 'java', -1, '', -1, '', 1, '', '', '2024-02-02 15:15:15', '2024-02-02 15:15:15', '2024-02-02 15:15:15'),
+       (3, 3, '', '', 'go', -1, '', -1, '', 1, '', '', '2024-02-02 15:15:15', '2024-02-02 15:15:15', '2024-02-02 15:15:15'),
+       (4, 4, '', '', 'go', -1, '', -1, '', 1, '', '', '2024-02-02 15:15:15', '2024-02-02 15:15:15', '2024-02-02 15:15:15');
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/resources/connectiontest.sql b/eventmesh-dashboard-console/src/test/resources/connection-test.sql
similarity index 90%
rename from eventmesh-dashboard-console/src/test/resources/connectiontest.sql
rename to eventmesh-dashboard-console/src/test/resources/connection-test.sql
index 641ea5f..361700a 100644
--- a/eventmesh-dashboard-console/src/test/resources/connectiontest.sql
+++ b/eventmesh-dashboard-console/src/test/resources/connection-test.sql
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-DELETE FROM `eventmesh-dashboard-test`.connection WHERE TRUE;
-ALTER TABLE `eventmesh-dashboard-test`.connection AUTO_INCREMENT = 1;
+DELETE FROM `eventmesh_dashboard_test`.connection WHERE TRUE;
+ALTER TABLE `eventmesh_dashboard_test`.connection AUTO_INCREMENT = 1;
 
-insert into `eventmesh-dashboard-test`.connection (id, cluster_id, source_type, source_id, sink_type, sink_id, runtime_id, status, topic, group_id, description, create_time, end_time, update_time)
+insert into `eventmesh_dashboard_test`.connection (id, cluster_id, source_type, source_id, sink_type, sink_id, runtime_id, status, topic, group_id, description, create_time, end_time, update_time)
 values  (1, 1, 'connector', 1, 'connector', 1, 1, 0, 'test-topic', -1, '', '2024-01-27 11:55:11', '2024-01-27 11:55:11', '2024-01-27 11:55:11'),
     (2, 1, 'connector', 2, 'connector', 2, 2, 0, 'test-topic', -1, '', '2024-01-27 11:55:11', '2024-01-27 11:55:11', '2024-01-27 11:55:11'),
     (3, 1, 'connector', 3, 'connector', 3, 3, 0, 'test-topic', -1, '', '2024-01-27 11:55:11', '2024-01-27 11:55:11', '2024-01-27 11:55:11'),
diff --git a/eventmesh-dashboard-console/src/test/resources/connector-test.sql b/eventmesh-dashboard-console/src/test/resources/connector-test.sql
new file mode 100644
index 0000000..2ebdc5f
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/resources/connector-test.sql
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+DELETE FROM `eventmesh_dashboard_test`.connection WHERE TRUE;
+ALTER TABLE `eventmesh_dashboard_test`.connection AUTO_INCREMENT = 1;
+
+insert into `eventmesh_dashboard_test`.connector (id, cluster_id, name, class_name, type, status, pod_state, config_ids, create_time, update_time)
+values  (1, 1, '', 'the', '', 1, 1, '', '2024-02-02 16:43:45', '2024-02-02 16:53:02'),
+    (2, 1, '', 'quick', '', 1, 1, '', '2024-02-02 16:43:45', '2024-02-02 16:53:02'),
+    (3, 1, '', 'brown', '', 1, 2, '', '2024-02-02 16:43:45', '2024-02-02 16:53:02'),
+    (4, 2, '', 'fox', '', 1, 2, '', '2024-02-02 16:43:45', '2024-02-02 16:53:02'),
+    (5, 3, '', 'jumps', '', 1, 3, '', '2024-02-02 16:43:45', '2024-02-02 16:53:02');
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/resources/health-test.sql b/eventmesh-dashboard-console/src/test/resources/health-test.sql
new file mode 100644
index 0000000..45c3aeb
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/resources/health-test.sql
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+DELETE FROM `eventmesh_dashboard_test`.health_check_result WHERE TRUE;
+ALTER TABLE `eventmesh_dashboard_test`.health_check_result AUTO_INCREMENT = 1;
+
+insert into `eventmesh_dashboard_test`.health_check_result (id, type, type_id, cluster_id, status, result_desc, create_time, update_time)
+values  (1, 1, 1, 1, 0, '', '2024-02-02 18:56:50', '2024-02-02 18:56:50'),
+    (2, 2, 2, 1, 1, '', '2024-02-02 18:56:50', '2024-02-02 18:56:50'),
+    (3, 3, 3, 1, 1, '', '2024-02-02 18:56:50', '2024-02-02 18:56:50'),
+    (4, 4, 4, 1, 1, '', '2024-02-02 18:56:50', '2024-02-02 18:56:50'),
+    (5, 1, 2, 1, 1, '', '2024-02-04 18:56:50', '2024-02-02 19:33:13'),
+    (6, 4, 2, 2, 0, '', '2024-02-04 18:56:50', '2024-02-02 19:33:13');
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java b/eventmesh-dashboard-console/src/test/resources/meta-test.sql
similarity index 61%
copy from eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
copy to eventmesh-dashboard-console/src/test/resources/meta-test.sql
index 7263f7c..66a6354 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
+++ b/eventmesh-dashboard-console/src/test/resources/meta-test.sql
@@ -15,14 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.dashboard.console.scheduler.health;
+DELETE FROM `eventmesh_dashboard_test`.meta WHERE TRUE;
+ALTER TABLE `eventmesh_dashboard_test`.meta AUTO_INCREMENT = 1;
 
-import org.springframework.stereotype.Component;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Component
-public class HealthCheckScheduler {
-
-}
+insert into `eventmesh_dashboard_test`.meta (id, name, type, version, cluster_id, host, port, role, username, params, status, create_time, update_time)
+values  (1, '1', 'nacos', '1.0', 1, '', -1, '-1', '', '', 0, '2024-02-03 10:30:02', '2024-02-03 10:30:02'),
+    (2, '2', 'zookeeper', '1.0', 1, '', -1, '-1', '', '', 0, '2024-02-03 10:30:02', '2024-02-03 10:30:02');
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java b/eventmesh-dashboard-console/src/test/resources/use-test-schema.sql
similarity index 78%
rename from eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
rename to eventmesh-dashboard-console/src/test/resources/use-test-schema.sql
index 7263f7c..db0c0a2 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
+++ b/eventmesh-dashboard-console/src/test/resources/use-test-schema.sql
@@ -15,14 +15,4 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.dashboard.console.scheduler.health;
-
-import org.springframework.stereotype.Component;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Component
-public class HealthCheckScheduler {
-
-}
+USE `eventmesh_dashboard_test`;
