问题描述
一个查询 3万条记录的sql ,在数据库中运行100ms左右。
但是在 mybatis中返回却用了 8s。
后来发现是自定义类型转换器导致:
问题出现的环境背景及自己尝试过哪些方法
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
//bean对应的字段
private Map signInProperties;
//JsonTypeHandler
public class JsonTypeHandler extends BaseTypeHandler {
private Class clazz;
private static final SerializerFeature[] serializerFeatures;
static {
serializerFeatures = new SerializerFeature[]{
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullListAsEmpty
};
}
public JsonTypeHandler(Class clazz) {
if (clazz == null) {
throw new IllegalArgumentException("Type argument cannot be null");
}
this.clazz = clazz;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, this.toJson(parameter));
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
return this.toObject(rs.getString(columnName), clazz);
}
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return this.toObject(rs.getString(columnIndex), clazz);
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return this.toObject(cs.getString(columnIndex), clazz);
}
private String toJson(T object) {
try {
return JSON.toJSONString(object, serializerFeatures);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private T toObject(String content, Class> clazz) {
if (content != null && !content.isEmpty()) {
try {
return (T) JSON.parseObject(content, clazz);
} catch (Exception e) {
throw new RuntimeException(e);
}
} else {
return null;
}
}
}
你期待的结果是什么?实际看到的错误信息又是什么?
为什么会这么慢? 不想改变映射的情况下有什么解决方案