You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2022/09/04 16:12:25 UTC
[skywalking] 01/01: Use prepareStatement in H2SQLExecutor#getByIDs
This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch sql-db
in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit 9d83029fe5e112d1caf67a3b7ccfef4db25aa8fe
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Mon Sep 5 00:12:09 2022 +0800
Use prepareStatement in H2SQLExecutor#getByIDs
---
docs/en/changes/changes.md | 1 +
.../storage/plugin/jdbc/h2/dao/H2SQLExecutor.java | 53 ++++++++++++----------
2 files changed, 30 insertions(+), 24 deletions(-)
diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index 290dd8ee54..85a81c6407 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -6,6 +6,7 @@
#### OAP Server
* Add component ID(133) for impala JDBC Java agent plugin and component ID(134) for impala server
+* Use prepareStatement in H2SQLExecutor#getByIDs.(No function change).
#### UI
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/H2SQLExecutor.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
index 39500d2a23..47b3f2ec7e 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2SQLExecutor.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
@@ -38,7 +38,6 @@ import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObje
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.library.util.CollectionUtils;
-import org.apache.skywalking.oap.server.storage.plugin.jdbc.ArrayParamBuilder;
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;
@@ -49,26 +48,32 @@ public class H2SQLExecutor {
String modelName,
String[] ids,
StorageBuilder<T> storageBuilder) throws IOException {
- /*
- * Although H2 database or other database support createArrayOf and setArray operate,
- * Mysql 5.1.44 driver doesn't.
- */
- String param = ArrayParamBuilder.build(ids);
- try (Connection connection = h2Client.getConnection();
- ResultSet rs = h2Client.executeQuery(
- connection, "SELECT * FROM " + modelName + " WHERE id in (" + param + ")")) {
- List<StorageData> storageDataList = new ArrayList<>();
- StorageData storageData;
- do {
- storageData = toStorageData(rs, modelName, storageBuilder);
- if (storageData != null) {
- storageDataList.add(storageData);
+ try (Connection connection = h2Client.getConnection()) {
+ SQLBuilder sql = new SQLBuilder("SELECT * FROM " + modelName + " WHERE id in (");
+ List<Object> parameters = new ArrayList<>();
+ for (int i = 0; i < ids.length; i++) {
+ if (i == 0) {
+ sql.append("?");
+ } else {
+ sql.append(",?");
}
+ parameters.add(ids[i]);
}
- while (storageData != null);
+ sql.append(")");
+ try (ResultSet rs = h2Client.executeQuery(connection, sql.toString(), parameters)) {
+ StorageData storageData;
+ List<StorageData> storageDataList = new ArrayList<>();
+ do {
+ storageData = toStorageData(rs, modelName, storageBuilder);
+ if (storageData != null) {
+ storageDataList.add(storageData);
+ }
+ }
+ while (storageData != null);
- return storageDataList;
+ return storageDataList;
+ }
} catch (SQLException | JDBCClientException e) {
throw new IOException(e.getMessage(), e);
}
@@ -148,14 +153,14 @@ public class H2SQLExecutor {
param.add(metrics.id());
for (int i = 0; i < columns.size(); i++) {
ModelColumn column = columns.get(i);
- sqlBuilder.append("?");
+ sqlBuilder.append("?");
- Object value = objectMap.get(column.getColumnName().getName());
- if (value instanceof StorageDataComplexObject) {
- param.add(((StorageDataComplexObject) value).toStorageData());
- } else {
- param.add(value);
- }
+ Object value = objectMap.get(column.getColumnName().getName());
+ if (value instanceof StorageDataComplexObject) {
+ param.add(((StorageDataComplexObject) value).toStorageData());
+ } else {
+ param.add(value);
+ }
if (i != columns.size() - 1) {
sqlBuilder.append(",");