gpt4 book ai didi

java - 如何加速反射代码?

转载 作者:行者123 更新时间:2023-11-30 11:18:13 24 4
gpt4 key购买 nike

在我的应用程序中,我使用 Apache 的 DBUtils 类从 MySQL 数据库中读取数据。我编写了一个自定义 BasicRowProcessor,它使用数据对象字段上的注释来从数据库中读取列。它在代码方面工作得很好,但是当我拉很多行时性能相当慢。例如,使用此代码,一个 1500 行 x 35 列的结果集将花费 800 毫秒,但如果我使用标准 JDBC 代码,则只需 80 毫秒。

问题 - 我可以做些什么来加速这段代码?具体来说,我使用了很多反射和注释 - 是否缺少一些技巧来加快速度?

 @Override
public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException
{
T data = type.newInstance();

Field[] f = type.getFields();

for (int i=0; i<f.length; i++)
{
Field field = f[i];

if (field.isAnnotationPresent(DBColumn.class))
{
String columnName = field.getAnnotation(DBColumn.class).name();
}

if (field.getType().getName().equals("int"))
{
field.setInt(data, rs.getInt(columnName));
}
else if (field.getType().getName().equals("long"))
{
field.setLong(data, rs.getLong(columnName));
}
// .... for all the other types

}

return data;
}

最佳答案

也许构建并缓存行映射逻辑,这样您就不必每次都扫描字段、注释、结果集元数据和类型。

JDBC 元数据访问特别慢。

在此示例中,您可以提供一个字符串“key”,以便为不同的结果集类型(不同的列结构)启用映射器的高效缓存。

public BasicRowProcessor getReflectiveRowMapper (ResultSet rs, String resultSetKey, Class<T> type) {
String key = resultSetKey+"-"+type;
BasicRowProcessor result = rrmCache.get( key);
if (result != null) {
result = buildReflectiveRowMapper (rs, resultSetKey, type);
rrmCache.put( key, result);
}
return result;
}

public BuiltRowProcessor buildReflectiveRowMapper (ResultSet rs, String resultSetKey, Class<T> type) {
}

然后..

public class BuiltRowProcessor extends BasicRowProcessor {
protected FieldMapping[] mappings;

@Override
public <T> T toBean (ResultSet rs, Class<T> type) throws SQLException {
T data = type.newInstance();
for (FieldMapping field : mappings) {
field.mapField( rs, data);
}
return data;
}
}

abstract public class FieldMapping {
protected Field field;
protected int columnIndex;

// constructor..

abstract public void mapField (ResultSet rs, Object target) throws SQLException;

protected void writeField (Object target, Object value) {
try {
field.setValue(target, value); // or whatever API.
} catch (Exception x) {
throw new RuntimeException("error writing field: "+field, x);
}
}
}

public IntMapping extends FieldMapping {
// constructor..

public void mapField (ResultSet rs, Object target) throws SQLException {
int value = rs.getInt(columnIndex);
writeField( target, value);
}
}

关于java - 如何加速反射代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23945331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com