You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@skywalking.apache.org by wu...@apache.org on 2018/09/18 09:47:28 UTC

[incubator-skywalking] branch h2-storage updated: Add codes of other dao. No metric dao, wait for @peng-yongsheng new PR.

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

wusheng pushed a commit to branch h2-storage
in repository https://gitbox.apache.org/repos/asf/incubator-skywalking.git


The following commit(s) were added to refs/heads/h2-storage by this push:
     new a10b644  Add codes of other dao. No metric dao, wait for @peng-yongsheng new PR.
a10b644 is described below

commit a10b644143a700176a00abd7c9996698c3ae8128
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Tue Sep 18 17:47:16 2018 +0800

    Add codes of other dao. No metric dao, wait for @peng-yongsheng new PR.
---
 .../cache/EndpointInventoryCacheEsDAO.java         |  4 +-
 .../cache/NetworkAddressInventoryCacheEsDAO.java   |  2 +-
 .../server/storage/plugin/jdbc/SQLExecutor.java    | 15 +++-
 ...yCacheDAO.java => H2RegisterLockInstaller.java} | 29 ++++----
 .../storage/plugin/jdbc/h2/H2StorageProvider.java  | 10 +--
 .../storage/plugin/jdbc/h2/dao/H2BatchDAO.java     |  9 +--
 .../jdbc/h2/dao/H2EndpointInventoryCacheDAO.java   | 23 +++++-
 .../storage/plugin/jdbc/h2/dao/H2IndicatorDAO.java | 78 ++-------------------
 .../h2/dao/H2NetworkAddressInventoryCacheDAO.java  | 23 +++++-
 .../storage/plugin/jdbc/h2/dao/H2RegisterDAO.java  | 81 ++++++++++++++++++++++
 .../{H2IndicatorDAO.java => H2SQLExecutor.java}    | 73 ++++++++++++-------
 .../h2/dao/H2ServiceInstanceInventoryCacheDAO.java | 30 ++++++--
 .../jdbc/h2/dao/H2ServiceInventoryCacheDAO.java    | 26 +++++--
 .../storage/plugin/jdbc/h2/dao/H2StorageDAO.java   |  2 +-
 14 files changed, 262 insertions(+), 143 deletions(-)

diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/cache/EndpointInventoryCacheEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/cache/EndpointInventoryCacheEsDAO.java
index ecdf877..df187ed 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/cache/EndpointInventoryCacheEsDAO.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/cache/EndpointInventoryCacheEsDAO.java
@@ -53,7 +53,7 @@ public class EndpointInventoryCacheEsDAO extends EsDAO implements IEndpointInven
                 return Const.NONE;
             }
         } catch (Throwable e) {
-            logger.error(e.getMessage());
+            logger.error(e.getMessage(), e);
             return Const.NONE;
         }
     }
@@ -72,7 +72,7 @@ public class EndpointInventoryCacheEsDAO extends EsDAO implements IEndpointInven
                 return null;
             }
         } catch (Throwable e) {
-            logger.error(e.getMessage());
+            logger.error(e.getMessage(), e);
             return null;
         }
     }
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/cache/NetworkAddressInventoryCacheEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/cache/NetworkAddressInventoryCacheEsDAO.java
index 9022f86..ebec15f 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/cache/NetworkAddressInventoryCacheEsDAO.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/cache/NetworkAddressInventoryCacheEsDAO.java
@@ -48,7 +48,7 @@ public class NetworkAddressInventoryCacheEsDAO extends EsDAO implements INetwork
             String id = NetworkAddressInventory.buildId(networkAddress);
             GetResponse response = getClient().get(NetworkAddressInventory.MODEL_NAME, id);
             if (response.isExists()) {
-                return (int)response.getSource().getOrDefault(RegisterSource.SEQUENCE, 0);
+                return (int)response.getSource().getOrDefault(NetworkAddressInventory.SEQUENCE, 0);
             } else {
                 return Const.NONE;
             }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/SQLExecutor.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/SQLExecutor.java
index 4cd33c8..52ab0d4 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/SQLExecutor.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/SQLExecutor.java
@@ -18,16 +18,16 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.jdbc;
 
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
 import java.util.List;
-import lombok.AccessLevel;
-import lombok.Getter;
 
 /**
  * A SQL executor.
  *
  * @author wusheng
  */
-@Getter(AccessLevel.PUBLIC)
 public class SQLExecutor {
     private String sql;
     private List<Object> param;
@@ -36,4 +36,13 @@ public class SQLExecutor {
         this.sql = sql;
         this.param = param;
     }
+
+    public void invoke(Connection connection) throws SQLException {
+        PreparedStatement preparedStatement = connection.prepareStatement(sql);
+
+        for (int i = 0; i < param.size(); i++) {
+            preparedStatement.setObject(i + 1, param.get(i));
+        }
+        preparedStatement.execute();
+    }
 }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2ServiceInstanceInventoryCacheDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2RegisterLockInstaller.java
similarity index 51%
copy from oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2ServiceInstanceInventoryCacheDAO.java
copy to oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2RegisterLockInstaller.java
index a715cb1..1d18969 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2ServiceInstanceInventoryCacheDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2RegisterLockInstaller.java
@@ -16,24 +16,29 @@
  *
  */
 
-package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
+package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2;
 
-import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory;
-import org.apache.skywalking.oap.server.core.storage.cache.IServiceInstanceInventoryCacheDAO;
+import org.apache.skywalking.oap.server.core.storage.StorageException;
+import org.apache.skywalking.oap.server.library.client.Client;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @author wusheng
  */
-public class H2ServiceInstanceInventoryCacheDAO implements IServiceInstanceInventoryCacheDAO {
-    @Override public ServiceInstanceInventory get(int serviceInstanceId) {
-        return null;
-    }
+public class H2RegisterLockInstaller {
+    public static final String LOCK_TABLE_NAME = "register_lock";
 
-    @Override public int getServiceInstanceId(int serviceId, String serviceInstanceName) {
-        return 0;
-    }
+    private static final Logger logger = LoggerFactory.getLogger(H2RegisterLockInstaller.class);
+
+    /**
+     * For H2 storage, no concurrency situation, so, on lock table required. If someone wants to implement a storage by
+     * referring H2, please consider to create a LOCK table.
+     *
+     * @param client
+     * @throws StorageException
+     */
+    public void install(Client client) throws StorageException {
 
-    @Override public int getServiceInstanceId(int serviceId, int addressId) {
-        return 0;
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java
index c1459ef..2bc7b94 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java
@@ -86,10 +86,10 @@ public class H2StorageProvider extends ModuleProvider {
         this.registerServiceImplementation(StorageDAO.class, new H2StorageDAO(h2Client));
         this.registerServiceImplementation(IRegisterLockDAO.class, new H2RegisterLockDAO());
 
-        this.registerServiceImplementation(IServiceInventoryCacheDAO.class, new H2ServiceInventoryCacheDAO());
-        this.registerServiceImplementation(IServiceInstanceInventoryCacheDAO.class, new H2ServiceInstanceInventoryCacheDAO());
-        this.registerServiceImplementation(IEndpointInventoryCacheDAO.class, new H2EndpointInventoryCacheDAO());
-        this.registerServiceImplementation(INetworkAddressInventoryCacheDAO.class, new H2NetworkAddressInventoryCacheDAO());
+        this.registerServiceImplementation(IServiceInventoryCacheDAO.class, new H2ServiceInventoryCacheDAO(h2Client));
+        this.registerServiceImplementation(IServiceInstanceInventoryCacheDAO.class, new H2ServiceInstanceInventoryCacheDAO(h2Client));
+        this.registerServiceImplementation(IEndpointInventoryCacheDAO.class, new H2EndpointInventoryCacheDAO(h2Client));
+        this.registerServiceImplementation(INetworkAddressInventoryCacheDAO.class, new H2NetworkAddressInventoryCacheDAO(h2Client));
 
         this.registerServiceImplementation(ITopologyQueryDAO.class, new H2TopologyQueryDAO());
 
@@ -101,6 +101,8 @@ public class H2StorageProvider extends ModuleProvider {
 
             H2TableInstaller installer = new H2TableInstaller(getManager());
             installer.install(h2Client);
+
+            new H2RegisterLockInstaller().install(h2Client);
         } catch (StorageException e) {
             throw new ModuleStartException(e.getMessage(), e);
         } catch (ClientException e) {
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2BatchDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2BatchDAO.java
index d5dc471..c15bcf5 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2BatchDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2BatchDAO.java
@@ -19,7 +19,6 @@
 package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
 
 import java.sql.Connection;
-import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.util.List;
 import org.apache.skywalking.oap.server.core.storage.IBatchDAO;
@@ -55,13 +54,7 @@ public class H2BatchDAO implements IBatchDAO {
 
             for (Object exe : batchCollection) {
                 SQLExecutor sqlExecutor = (SQLExecutor)exe;
-
-                PreparedStatement preparedStatement = connection.prepareStatement(sqlExecutor.getSql());
-
-                for (int i = 0; i < sqlExecutor.getParam().size(); i++) {
-                    preparedStatement.setObject(i + 1, sqlExecutor.getParam().get(i));
-                }
-                preparedStatement.execute();
+                sqlExecutor.invoke(connection);
             }
         } catch (SQLException e) {
             logger.error(e.getMessage(), e);
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2EndpointInventoryCacheDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2EndpointInventoryCacheDAO.java
index 5f61d4a..7f423ac 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2EndpointInventoryCacheDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2EndpointInventoryCacheDAO.java
@@ -18,18 +18,35 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
 
+import java.io.IOException;
 import org.apache.skywalking.oap.server.core.register.EndpointInventory;
 import org.apache.skywalking.oap.server.core.storage.cache.IEndpointInventoryCacheDAO;
+import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @author wusheng
  */
-public class H2EndpointInventoryCacheDAO implements IEndpointInventoryCacheDAO {
+public class H2EndpointInventoryCacheDAO extends H2SQLExecutor implements IEndpointInventoryCacheDAO {
+    private static final Logger logger = LoggerFactory.getLogger(H2EndpointInventoryCacheDAO.class);
+    private JDBCHikariCPClient h2Client;
+
+    public H2EndpointInventoryCacheDAO(JDBCHikariCPClient h2Client) {
+        this.h2Client = h2Client;
+    }
+
     @Override public int getEndpointId(int serviceId, String endpointName) {
-        return 0;
+        String id = EndpointInventory.buildId(serviceId, endpointName);
+        return getEntityIDByID(h2Client, EndpointInventory.SEQUENCE, EndpointInventory.MODEL_NAME, id);
     }
 
     @Override public EndpointInventory get(int endpointId) {
-        return null;
+        try {
+            return (EndpointInventory)getByColumn(h2Client, EndpointInventory.MODEL_NAME, EndpointInventory.SEQUENCE, endpointId, new EndpointInventory.Builder());
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+            return null;
+        }
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2IndicatorDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2IndicatorDAO.java
index c3aa111..3dcd653 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2IndicatorDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2IndicatorDAO.java
@@ -19,27 +19,16 @@
 package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
 
 import java.io.IOException;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
 import org.apache.skywalking.oap.server.core.storage.IIndicatorDAO;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
-import org.apache.skywalking.oap.server.core.storage.model.ModelColumn;
-import org.apache.skywalking.oap.server.core.storage.type.StorageDataType;
-import org.apache.skywalking.oap.server.library.client.jdbc.JDBCClientException;
 import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
-import org.apache.skywalking.oap.server.storage.plugin.jdbc.SQLBuilder;
 import org.apache.skywalking.oap.server.storage.plugin.jdbc.SQLExecutor;
-import org.apache.skywalking.oap.server.storage.plugin.jdbc.TableMetaInfo;
 
 /**
  * @author wusheng
  */
-public class H2IndicatorDAO implements IIndicatorDAO<SQLExecutor, SQLExecutor> {
+public class H2IndicatorDAO extends H2SQLExecutor implements IIndicatorDAO<SQLExecutor, SQLExecutor> {
     private JDBCHikariCPClient h2Client;
     private StorageBuilder<Indicator> storageBuilder;
 
@@ -49,74 +38,15 @@ public class H2IndicatorDAO implements IIndicatorDAO<SQLExecutor, SQLExecutor> {
     }
 
     @Override public Indicator get(String modelName, Indicator indicator) throws IOException {
-        try (ResultSet rs = h2Client.executeQuery("SELECT * FROM " + modelName + " WHERE id = ?", new Object[] {indicator.id()})) {
-            while (rs.next()) {
-                Map data = new HashMap();
-                List<ModelColumn> columns = TableMetaInfo.get(modelName).getColumns();
-                for (ModelColumn column : columns) {
-                    data.put(column.getColumnName(), rs.getObject(column.getColumnName().getName()));
-                }
-                return storageBuilder.map2Data(data);
-            }
-        } catch (SQLException e) {
-            throw new IOException(e.getMessage(), e);
-        } catch (JDBCClientException e) {
-            throw new IOException(e.getMessage(), e);
-        }
-        return null;
+        return (Indicator)getByID(h2Client, modelName, indicator.id(), storageBuilder);
     }
 
     @Override public SQLExecutor prepareBatchInsert(String modelName, Indicator indicator) throws IOException {
-        Map<String, Object> objectMap = storageBuilder.data2Map(indicator);
-
-        SQLBuilder sqlBuilder = new SQLBuilder("INSERT INTO " + modelName + " VALUES");
-        List<ModelColumn> columns = TableMetaInfo.get(modelName).getColumns();
-        List<Object> param = new ArrayList<>();
-        sqlBuilder.append("(id=?,");
-        param.add(indicator.id());
-        for (int i = 0; i < columns.size(); i++) {
-            ModelColumn column = columns.get(i);
-            sqlBuilder.append("?");
-            if (i != columns.size()) {
-                sqlBuilder.append(",");
-            }
-
-            Object value = objectMap.get(column.getColumnName().getName());
-            if (value instanceof StorageDataType) {
-                param.add(((StorageDataType)value).toStorageData());
-            } else {
-                param.add(value);
-            }
-        }
-        sqlBuilder.append(")");
-
-        return new SQLExecutor(sqlBuilder.toString(), param);
+        return getInsertExecutor(modelName, indicator, storageBuilder);
     }
 
     @Override public SQLExecutor prepareBatchUpdate(String modelName, Indicator indicator) throws IOException {
-        Map<String, Object> objectMap = storageBuilder.data2Map(indicator);
-
-        SQLBuilder sqlBuilder = new SQLBuilder("UPDATE " + modelName + " SET ");
-        List<ModelColumn> columns = TableMetaInfo.get(modelName).getColumns();
-        List<Object> param = new ArrayList<>();
-        for (int i = 0; i < columns.size(); i++) {
-            ModelColumn column = columns.get(i);
-            sqlBuilder.append(column.getColumnName().getName() + "= ?");
-            if (i != columns.size()) {
-                sqlBuilder.append(",");
-            }
-
-            Object value = objectMap.get(column.getColumnName().getName());
-            if (value instanceof StorageDataType) {
-                param.add(((StorageDataType)value).toStorageData());
-            } else {
-                param.add(value);
-            }
-        }
-        sqlBuilder.append(" WHERE id = ?");
-        param.add(indicator.id());
-
-        return new SQLExecutor(sqlBuilder.toString(), param);
+        return getUpdateExecutor(modelName, indicator, storageBuilder);
     }
 
     @Override public void deleteHistory(String modelName, Long timeBucketBefore) {
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2NetworkAddressInventoryCacheDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2NetworkAddressInventoryCacheDAO.java
index 7a11ed6..5a79a66 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2NetworkAddressInventoryCacheDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2NetworkAddressInventoryCacheDAO.java
@@ -18,18 +18,35 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
 
+import java.io.IOException;
 import org.apache.skywalking.oap.server.core.register.NetworkAddressInventory;
 import org.apache.skywalking.oap.server.core.storage.cache.INetworkAddressInventoryCacheDAO;
+import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @author wusheng
  */
-public class H2NetworkAddressInventoryCacheDAO implements INetworkAddressInventoryCacheDAO {
+public class H2NetworkAddressInventoryCacheDAO extends H2SQLExecutor implements INetworkAddressInventoryCacheDAO {
+    private static final Logger logger = LoggerFactory.getLogger(H2NetworkAddressInventoryCacheDAO.class);
+    private JDBCHikariCPClient h2Client;
+
+    public H2NetworkAddressInventoryCacheDAO(JDBCHikariCPClient h2Client) {
+        this.h2Client = h2Client;
+    }
+
     @Override public int getAddressId(String networkAddress) {
-        return 0;
+        String id = NetworkAddressInventory.buildId(networkAddress);
+        return getEntityIDByID(h2Client, NetworkAddressInventory.SEQUENCE, NetworkAddressInventory.MODEL_NAME, id);
     }
 
     @Override public NetworkAddressInventory get(int addressId) {
-        return null;
+        try {
+            return (NetworkAddressInventory)getByColumn(h2Client, NetworkAddressInventory.MODEL_NAME, NetworkAddressInventory.SEQUENCE, addressId, new NetworkAddressInventory.Builder());
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+            return null;
+        }
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2RegisterDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2RegisterDAO.java
new file mode 100644
index 0000000..1d869ba
--- /dev/null
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2RegisterDAO.java
@@ -0,0 +1,81 @@
+/*
+ * 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.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.register.RegisterSource;
+import org.apache.skywalking.oap.server.core.storage.IRegisterDAO;
+import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
+import org.apache.skywalking.oap.server.library.client.jdbc.JDBCClientException;
+import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
+
+/**
+ * @author wusheng
+ */
+public class H2RegisterDAO extends H2SQLExecutor implements IRegisterDAO {
+    private final JDBCHikariCPClient h2Client;
+    private final StorageBuilder<RegisterSource> storageBuilder;
+
+    public H2RegisterDAO(JDBCHikariCPClient h2Client,
+        StorageBuilder<RegisterSource> storageBuilder) {
+        this.h2Client = h2Client;
+        this.storageBuilder = storageBuilder;
+    }
+
+    @Override public int max(String modelName) throws IOException {
+        try (ResultSet rs = h2Client.executeQuery("SELECT max(sequence) max_id FROM " + modelName + " ORDER BY sequence ASC", new Object[0])) {
+            while (rs.next()) {
+                return rs.getInt("max_id");
+            }
+        } catch (SQLException e) {
+            throw new IOException(e.getMessage(), e);
+        } catch (JDBCClientException e) {
+            throw new IOException(e.getMessage(), e);
+        }
+        return Const.NONE;
+    }
+
+    @Override public RegisterSource get(String modelName, String id) throws IOException {
+        return (RegisterSource)getByID(h2Client, modelName, id, storageBuilder);
+    }
+
+    @Override public void forceInsert(String modelName, RegisterSource source) throws IOException {
+        try (Connection connection = h2Client.getConnection()) {
+            getInsertExecutor(modelName, source, storageBuilder).invoke(connection);
+        } catch (SQLException e) {
+            throw new IOException(e.getMessage(), e);
+        } catch (JDBCClientException e) {
+            throw new IOException(e.getMessage(), e);
+        }
+    }
+
+    @Override public void forceUpdate(String modelName, RegisterSource source) throws IOException {
+        try (Connection connection = h2Client.getConnection()) {
+            getUpdateExecutor(modelName, source, storageBuilder).invoke(connection);
+        } catch (SQLException e) {
+            throw new IOException(e.getMessage(), e);
+        } catch (JDBCClientException e) {
+            throw new IOException(e.getMessage(), e);
+        }
+    }
+}
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2IndicatorDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2SQLExecutor.java
similarity index 61%
copy from oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2IndicatorDAO.java
copy to oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2SQLExecutor.java
index c3aa111..820d6b7 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2IndicatorDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2SQLExecutor.java
@@ -25,9 +25,10 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
-import org.apache.skywalking.oap.server.core.storage.IIndicatorDAO;
+import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
+import org.apache.skywalking.oap.server.core.storage.StorageData;
 import org.apache.skywalking.oap.server.core.storage.model.ModelColumn;
 import org.apache.skywalking.oap.server.core.storage.type.StorageDataType;
 import org.apache.skywalking.oap.server.library.client.jdbc.JDBCClientException;
@@ -35,38 +36,65 @@ import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariC
 import org.apache.skywalking.oap.server.storage.plugin.jdbc.SQLBuilder;
 import org.apache.skywalking.oap.server.storage.plugin.jdbc.SQLExecutor;
 import org.apache.skywalking.oap.server.storage.plugin.jdbc.TableMetaInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @author wusheng
  */
-public class H2IndicatorDAO implements IIndicatorDAO<SQLExecutor, SQLExecutor> {
-    private JDBCHikariCPClient h2Client;
-    private StorageBuilder<Indicator> storageBuilder;
+public class H2SQLExecutor {
+    private static final Logger logger = LoggerFactory.getLogger(H2SQLExecutor.class);
 
-    public H2IndicatorDAO(JDBCHikariCPClient h2Client, StorageBuilder<Indicator> storageBuilder) {
-        this.h2Client = h2Client;
-        this.storageBuilder = storageBuilder;
+    protected StorageData getByID(JDBCHikariCPClient h2Client, String modelName, String id,
+        StorageBuilder storageBuilder) throws IOException {
+        try (ResultSet rs = h2Client.executeQuery("SELECT * FROM " + modelName + " WHERE id = ?", new Object[] {id})) {
+            return toStorageData(rs, modelName, storageBuilder);
+        } catch (SQLException e) {
+            throw new IOException(e.getMessage(), e);
+        } catch (JDBCClientException e) {
+            throw new IOException(e.getMessage(), e);
+        }
     }
 
-    @Override public Indicator get(String modelName, Indicator indicator) throws IOException {
-        try (ResultSet rs = h2Client.executeQuery("SELECT * FROM " + modelName + " WHERE id = ?", new Object[] {indicator.id()})) {
-            while (rs.next()) {
-                Map data = new HashMap();
-                List<ModelColumn> columns = TableMetaInfo.get(modelName).getColumns();
-                for (ModelColumn column : columns) {
-                    data.put(column.getColumnName(), rs.getObject(column.getColumnName().getName()));
-                }
-                return storageBuilder.map2Data(data);
-            }
+    protected StorageData getByColumn(JDBCHikariCPClient h2Client, String modelName, String columnName, Object value,
+        StorageBuilder storageBuilder) throws IOException {
+        try (ResultSet rs = h2Client.executeQuery("SELECT * FROM " + modelName + " WHERE " + columnName + " = ?", new Object[] {value})) {
+            return toStorageData(rs, modelName, storageBuilder);
         } catch (SQLException e) {
             throw new IOException(e.getMessage(), e);
         } catch (JDBCClientException e) {
             throw new IOException(e.getMessage(), e);
         }
+    }
+
+    private StorageData toStorageData(ResultSet rs, String modelName,
+        StorageBuilder storageBuilder) throws SQLException {
+        while (rs.next()) {
+            Map data = new HashMap();
+            List<ModelColumn> columns = TableMetaInfo.get(modelName).getColumns();
+            for (ModelColumn column : columns) {
+                data.put(column.getColumnName(), rs.getObject(column.getColumnName().getName()));
+            }
+            return storageBuilder.map2Data(data);
+        }
         return null;
     }
 
-    @Override public SQLExecutor prepareBatchInsert(String modelName, Indicator indicator) throws IOException {
+    protected int getEntityIDByID(JDBCHikariCPClient h2Client, String entityColumnName, String modelName, String id) {
+        try (ResultSet rs = h2Client.executeQuery("SELECT " + entityColumnName + " FROM " + modelName + " WHERE ID=?", new Object[] {id})) {
+            while (rs.next()) {
+                return rs.getInt(ServiceInstanceInventory.SEQUENCE);
+            }
+        } catch (SQLException e) {
+            logger.error(e.getMessage(), e);
+        } catch (JDBCClientException e) {
+            logger.error(e.getMessage(), e);
+        }
+        return Const.NONE;
+    }
+
+    protected SQLExecutor getInsertExecutor(String modelName, StorageData indicator,
+        StorageBuilder storageBuilder) throws IOException {
         Map<String, Object> objectMap = storageBuilder.data2Map(indicator);
 
         SQLBuilder sqlBuilder = new SQLBuilder("INSERT INTO " + modelName + " VALUES");
@@ -93,7 +121,8 @@ public class H2IndicatorDAO implements IIndicatorDAO<SQLExecutor, SQLExecutor> {
         return new SQLExecutor(sqlBuilder.toString(), param);
     }
 
-    @Override public SQLExecutor prepareBatchUpdate(String modelName, Indicator indicator) throws IOException {
+    protected SQLExecutor getUpdateExecutor(String modelName, StorageData indicator,
+        StorageBuilder storageBuilder) throws IOException {
         Map<String, Object> objectMap = storageBuilder.data2Map(indicator);
 
         SQLBuilder sqlBuilder = new SQLBuilder("UPDATE " + modelName + " SET ");
@@ -118,8 +147,4 @@ public class H2IndicatorDAO implements IIndicatorDAO<SQLExecutor, SQLExecutor> {
 
         return new SQLExecutor(sqlBuilder.toString(), param);
     }
-
-    @Override public void deleteHistory(String modelName, Long timeBucketBefore) {
-
-    }
 }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2ServiceInstanceInventoryCacheDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2ServiceInstanceInventoryCacheDAO.java
index a715cb1..645a8bc 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2ServiceInstanceInventoryCacheDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2ServiceInstanceInventoryCacheDAO.java
@@ -18,22 +18,44 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
 
+import java.io.IOException;
 import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory;
 import org.apache.skywalking.oap.server.core.storage.cache.IServiceInstanceInventoryCacheDAO;
+import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @author wusheng
  */
-public class H2ServiceInstanceInventoryCacheDAO implements IServiceInstanceInventoryCacheDAO {
+public class H2ServiceInstanceInventoryCacheDAO extends H2SQLExecutor implements IServiceInstanceInventoryCacheDAO {
+    private static final Logger logger = LoggerFactory.getLogger(H2ServiceInstanceInventoryCacheDAO.class);
+    private JDBCHikariCPClient h2Client;
+
+    public H2ServiceInstanceInventoryCacheDAO(JDBCHikariCPClient h2Client) {
+        this.h2Client = h2Client;
+    }
+
     @Override public ServiceInstanceInventory get(int serviceInstanceId) {
-        return null;
+        try {
+            return (ServiceInstanceInventory)getByColumn(h2Client, ServiceInstanceInventory.MODEL_NAME, ServiceInstanceInventory.SEQUENCE, serviceInstanceId, new ServiceInstanceInventory.Builder());
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+            return null;
+        }
     }
 
     @Override public int getServiceInstanceId(int serviceId, String serviceInstanceName) {
-        return 0;
+        String id = ServiceInstanceInventory.buildId(serviceId, serviceInstanceName);
+        return getByID(id);
     }
 
     @Override public int getServiceInstanceId(int serviceId, int addressId) {
-        return 0;
+        String id = ServiceInstanceInventory.buildId(serviceId, addressId);
+        return getByID(id);
+    }
+
+    private int getByID(String id) {
+        return getEntityIDByID(h2Client, ServiceInstanceInventory.SEQUENCE, ServiceInstanceInventory.MODEL_NAME, id);
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2ServiceInventoryCacheDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2ServiceInventoryCacheDAO.java
index 50e882e..e3d7177 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2ServiceInventoryCacheDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2ServiceInventoryCacheDAO.java
@@ -18,22 +18,40 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
 
+import java.io.IOException;
 import org.apache.skywalking.oap.server.core.register.ServiceInventory;
 import org.apache.skywalking.oap.server.core.storage.cache.IServiceInventoryCacheDAO;
+import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @author wusheng
  */
-public class H2ServiceInventoryCacheDAO implements IServiceInventoryCacheDAO {
+public class H2ServiceInventoryCacheDAO extends H2SQLExecutor implements IServiceInventoryCacheDAO {
+    private static final Logger logger = LoggerFactory.getLogger(H2ServiceInventoryCacheDAO.class);
+    private JDBCHikariCPClient h2Client;
+
+    public H2ServiceInventoryCacheDAO(JDBCHikariCPClient h2Client) {
+        this.h2Client = h2Client;
+    }
+
     @Override public int getServiceId(String serviceName) {
-        return 0;
+        String id = ServiceInventory.buildId(serviceName);
+        return getEntityIDByID(h2Client, ServiceInventory.SEQUENCE, ServiceInventory.MODEL_NAME, id);
     }
 
     @Override public int getServiceId(int addressId) {
-        return 0;
+        String id = ServiceInventory.buildId(addressId);
+        return getServiceId(id);
     }
 
     @Override public ServiceInventory get(int serviceId) {
-        return null;
+        try {
+            return (ServiceInventory)getByColumn(h2Client, ServiceInventory.MODEL_NAME, ServiceInventory.SEQUENCE, serviceId, new ServiceInventory.Builder());
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+            return null;
+        }
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2StorageDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2StorageDAO.java
index 2f18d2c..59811b2 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2StorageDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2StorageDAO.java
@@ -41,6 +41,6 @@ public class H2StorageDAO implements StorageDAO {
     }
 
     @Override public IRegisterDAO newRegisterDao(StorageBuilder<RegisterSource> storageBuilder) {
-        return null;
+        return new H2RegisterDAO(h2Client, storageBuilder);
     }
 }