未验证 提交 b28b811a 编写于 作者: K kezhenxu94 提交者: GitHub

[BugFix] Fix wrong H2 column type (#4593)

MEDIUMTEXT in H2 is CLOB in JDBC type, and casting it to `String` causes `ClassCastException`
上级 e55073e5
...@@ -30,5 +30,5 @@ public interface INewModel extends Service { ...@@ -30,5 +30,5 @@ public interface INewModel extends Service {
* *
* @return the created new model * @return the created new model
*/ */
Model add(Class aClass, int scopeId, Storage storage, boolean record); Model add(Class<?> aClass, int scopeId, Storage storage, boolean record);
} }
...@@ -43,7 +43,7 @@ public class StorageModels implements IModelManager, INewModel, IModelOverride { ...@@ -43,7 +43,7 @@ public class StorageModels implements IModelManager, INewModel, IModelOverride {
} }
@Override @Override
public Model add(Class aClass, int scopeId, Storage storage, boolean record) { public Model add(Class<?> aClass, int scopeId, Storage storage, boolean record) {
// Check this scope id is valid. // Check this scope id is valid.
DefaultScopeDefine.nameOf(scopeId); DefaultScopeDefine.nameOf(scopeId);
...@@ -67,7 +67,7 @@ public class StorageModels implements IModelManager, INewModel, IModelOverride { ...@@ -67,7 +67,7 @@ public class StorageModels implements IModelManager, INewModel, IModelOverride {
return model; return model;
} }
private void retrieval(Class clazz, private void retrieval(Class<?> clazz,
String modelName, String modelName,
List<ModelColumn> modelColumns, List<ModelColumn> modelColumns,
List<ExtraQueryIndex> extraQueryIndices) { List<ExtraQueryIndex> extraQueryIndices) {
...@@ -100,12 +100,10 @@ public class StorageModels implements IModelManager, INewModel, IModelOverride { ...@@ -100,12 +100,10 @@ public class StorageModels implements IModelManager, INewModel, IModelOverride {
Collections.addAll(indexDefinitions, field.getAnnotation(MultipleQueryUnifiedIndex.class).value()); Collections.addAll(indexDefinitions, field.getAnnotation(MultipleQueryUnifiedIndex.class).value());
} }
indexDefinitions.forEach(indexDefinition -> { indexDefinitions.forEach(indexDefinition -> extraQueryIndices.add(new ExtraQueryIndex(
extraQueryIndices.add(new ExtraQueryIndex( column.columnName(),
column.columnName(), indexDefinition.withColumns()
indexDefinition.withColumns() )));
));
});
} }
} }
......
...@@ -45,60 +45,60 @@ public class H2SQLExecutor { ...@@ -45,60 +45,60 @@ public class H2SQLExecutor {
private static final Logger logger = LoggerFactory.getLogger(H2SQLExecutor.class); private static final Logger logger = LoggerFactory.getLogger(H2SQLExecutor.class);
protected List<StorageData> getByIDs(JDBCHikariCPClient h2Client, String modelName, String[] ids, protected <T extends StorageData> List<StorageData> getByIDs(JDBCHikariCPClient h2Client,
StorageBuilder storageBuilder) throws IOException { String modelName,
String[] ids,
try (Connection connection = h2Client.getConnection()) { StorageBuilder<T> storageBuilder) throws IOException {
/* /*
* Although H2 database or other database support createArrayOf and setArray operate. * Although H2 database or other database support createArrayOf and setArray operate.
* But Mysql 5.1.44 driver doesn't. * But Mysql 5.1.44 driver doesn't.
*/ */
String param = ArrayParamBuilder.build(ids); String param = ArrayParamBuilder.build(ids);
try (ResultSet rs = h2Client.executeQuery(connection, "SELECT * FROM " + modelName + " WHERE id in (" + param + ")")) { try (Connection connection = h2Client.getConnection();
List<StorageData> storageDataList = new ArrayList<>(); ResultSet rs = h2Client.executeQuery(
StorageData storageData; connection, "SELECT * FROM " + modelName + " WHERE id in (" + param + ")")) {
do { List<StorageData> storageDataList = new ArrayList<>();
storageData = toStorageData(rs, modelName, storageBuilder); StorageData storageData;
if (storageData != null) { do {
storageDataList.add(storageData); storageData = toStorageData(rs, modelName, storageBuilder);
} if (storageData != null) {
storageDataList.add(storageData);
} }
while (storageData != null);
return storageDataList;
} }
while (storageData != null);
return storageDataList;
} catch (SQLException | JDBCClientException e) { } catch (SQLException | JDBCClientException e) {
throw new IOException(e.getMessage(), e); throw new IOException(e.getMessage(), e);
} }
} }
protected StorageData getByID(JDBCHikariCPClient h2Client, String modelName, String id, protected <T extends StorageData> StorageData getByID(JDBCHikariCPClient h2Client, String modelName, String id,
StorageBuilder storageBuilder) throws IOException { StorageBuilder<T> storageBuilder) throws IOException {
try (Connection connection = h2Client.getConnection()) { try (Connection connection = h2Client.getConnection();
try (ResultSet rs = h2Client.executeQuery(connection, "SELECT * FROM " + modelName + " WHERE id = ?", id)) { ResultSet rs = h2Client.executeQuery(connection, "SELECT * FROM " + modelName + " WHERE id = ?", id)) {
return toStorageData(rs, modelName, storageBuilder); return toStorageData(rs, modelName, storageBuilder);
}
} catch (SQLException | JDBCClientException e) { } catch (SQLException | JDBCClientException e) {
throw new IOException(e.getMessage(), e); throw new IOException(e.getMessage(), e);
} }
} }
protected StorageData getByColumn(JDBCHikariCPClient h2Client, String modelName, String columnName, Object value, protected StorageData getByColumn(JDBCHikariCPClient h2Client, String modelName, String columnName, Object value,
StorageBuilder storageBuilder) throws IOException { StorageBuilder<? extends StorageData> storageBuilder) throws IOException {
try (Connection connection = h2Client.getConnection()) { try (Connection connection = h2Client.getConnection();
try (ResultSet rs = h2Client.executeQuery(connection, "SELECT * FROM " + modelName + " WHERE " + columnName + " = ?", value)) { ResultSet rs = h2Client.executeQuery(
return toStorageData(rs, modelName, storageBuilder); connection, "SELECT * FROM " + modelName + " WHERE " + columnName + " = ?", value)) {
} return toStorageData(rs, modelName, storageBuilder);
} catch (SQLException | JDBCClientException e) { } catch (SQLException | JDBCClientException e) {
throw new IOException(e.getMessage(), e); throw new IOException(e.getMessage(), e);
} }
} }
protected StorageData toStorageData(ResultSet rs, String modelName, protected StorageData toStorageData(ResultSet rs, String modelName,
StorageBuilder storageBuilder) throws SQLException { StorageBuilder<? extends StorageData> storageBuilder) throws SQLException {
if (rs.next()) { if (rs.next()) {
Map data = new HashMap(); Map<String, Object> data = new HashMap<>();
List<ModelColumn> columns = TableMetaInfo.get(modelName).getColumns(); List<ModelColumn> columns = TableMetaInfo.get(modelName).getColumns();
for (ModelColumn column : columns) { for (ModelColumn column : columns) {
data.put(column.getColumnName().getName(), rs.getObject(column.getColumnName().getStorageName())); data.put(column.getColumnName().getName(), rs.getObject(column.getColumnName().getStorageName()));
...@@ -109,11 +109,11 @@ public class H2SQLExecutor { ...@@ -109,11 +109,11 @@ public class H2SQLExecutor {
} }
protected int getEntityIDByID(JDBCHikariCPClient h2Client, String entityColumnName, String modelName, String id) { protected int getEntityIDByID(JDBCHikariCPClient h2Client, String entityColumnName, String modelName, String id) {
try (Connection connection = h2Client.getConnection()) { try (Connection connection = h2Client.getConnection();
try (ResultSet rs = h2Client.executeQuery(connection, "SELECT " + entityColumnName + " FROM " + modelName + " WHERE ID=?", id)) { ResultSet rs = h2Client.executeQuery(
while (rs.next()) { connection, "SELECT " + entityColumnName + " FROM " + modelName + " WHERE ID=?", id)) {
return rs.getInt(ServiceInstanceInventory.SEQUENCE); if (rs.next()) {
} return rs.getInt(ServiceInstanceInventory.SEQUENCE);
} }
} catch (SQLException | JDBCClientException e) { } catch (SQLException | JDBCClientException e) {
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e);
...@@ -121,8 +121,8 @@ public class H2SQLExecutor { ...@@ -121,8 +121,8 @@ public class H2SQLExecutor {
return Const.NONE; return Const.NONE;
} }
protected SQLExecutor getInsertExecutor(String modelName, StorageData metrics, protected <T extends StorageData> SQLExecutor getInsertExecutor(String modelName, T metrics,
StorageBuilder storageBuilder) throws IOException { StorageBuilder<T> storageBuilder) throws IOException {
Map<String, Object> objectMap = storageBuilder.data2Map(metrics); Map<String, Object> objectMap = storageBuilder.data2Map(metrics);
SQLBuilder sqlBuilder = new SQLBuilder("INSERT INTO " + modelName + " VALUES"); SQLBuilder sqlBuilder = new SQLBuilder("INSERT INTO " + modelName + " VALUES");
...@@ -149,8 +149,8 @@ public class H2SQLExecutor { ...@@ -149,8 +149,8 @@ public class H2SQLExecutor {
return new SQLExecutor(sqlBuilder.toString(), param); return new SQLExecutor(sqlBuilder.toString(), param);
} }
protected SQLExecutor getUpdateExecutor(String modelName, StorageData metrics, protected <T extends StorageData> SQLExecutor getUpdateExecutor(String modelName, T metrics,
StorageBuilder storageBuilder) throws IOException { StorageBuilder<T> storageBuilder) throws IOException {
Map<String, Object> objectMap = storageBuilder.data2Map(metrics); Map<String, Object> objectMap = storageBuilder.data2Map(metrics);
SQLBuilder sqlBuilder = new SQLBuilder("UPDATE " + modelName + " SET "); SQLBuilder sqlBuilder = new SQLBuilder("UPDATE " + modelName + " SET ");
......
...@@ -92,7 +92,7 @@ public class H2TableInstaller extends ModelInstaller { ...@@ -92,7 +92,7 @@ public class H2TableInstaller extends ModelInstaller {
} else if (String.class.equals(type)) { } else if (String.class.equals(type)) {
return "VARCHAR(" + column.getLength() + ")"; return "VARCHAR(" + column.getLength() + ")";
} else if (IntKeyLongValueHashMap.class.equals(type)) { } else if (IntKeyLongValueHashMap.class.equals(type)) {
return "MEDIUMTEXT"; return "VARCHAR(20000)";
} else if (byte[].class.equals(type)) { } else if (byte[].class.equals(type)) {
return "MEDIUMTEXT"; return "MEDIUMTEXT";
} else { } else {
......
...@@ -22,6 +22,7 @@ import java.sql.Connection; ...@@ -22,6 +22,7 @@ import java.sql.Connection;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValueHashMap;
import org.apache.skywalking.oap.server.core.storage.StorageException; import org.apache.skywalking.oap.server.core.storage.StorageException;
import org.apache.skywalking.oap.server.core.storage.model.ExtraQueryIndex; import org.apache.skywalking.oap.server.core.storage.model.ExtraQueryIndex;
import org.apache.skywalking.oap.server.core.storage.model.Model; import org.apache.skywalking.oap.server.core.storage.model.Model;
...@@ -101,4 +102,12 @@ public class MySQLTableInstaller extends H2TableInstaller { ...@@ -101,4 +102,12 @@ public class MySQLTableInstaller extends H2TableInstaller {
createIndex(client, connection, model, tableIndexSQL); createIndex(client, connection, model, tableIndexSQL);
} }
} }
@Override
protected String getColumnType(final ModelColumn column) {
if (IntKeyLongValueHashMap.class.equals(column.getType())) {
return "MEDIUMTEXT";
}
return super.getColumnType(column);
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册