嗨@Alexey1Gavrilov ,感谢您报告此事! 我同意肯定有一些倒退。
我开始致力于改善这种情况:https://github.com/jdbi/jdbi/pull/1607
目前,它只是在等待审查和一些测试,以确保我们不会破坏一切:)
您是否有时间独立验证上面链接的修复程序是否有助于您的用例?
谢谢,希望我们很快就会合并一个修复程序。
一个非常好的消息,您已经在进行改进! 我可以确认#1607 确实显着提高了性能。 我的微型基准程序使用该 PR 运行速度大约快 10-15%,然后在 3.5.1 上。 做得好!
我们还为列名匹配器实现了一个自定义缓存层,进一步提高了性能。 这个想法基本上是为Jdbi
实例处理的所有字段缓存columnName
和javaName
。 这是一个代码片段:
class CachingColumnNameMatcher implements ColumnNameMatcher {
private static class Column {
final String columnName;
final String javaName;
private Column(String columnName, String javaName) {
this.columnName = columnName;
this.javaName = javaName;
}
<strong i="10">@Override</strong>
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Column column = (Column) o;
return Objects.equals(columnName, column.columnName) &&
Objects.equals(javaName, column.javaName);
}
<strong i="11">@Override</strong>
public int hashCode() {
return Objects.hash(columnName, javaName);
}
}
private final ColumnNameMatcher delegate;
private final ConcurrentMap<Column, Boolean> cache;
CachingColumnNameMatcher(final ColumnNameMatcher delegate) {
this.delegate = delegate;
this.cache = new ConcurrentHashMap<>();
}
<strong i="12">@Override</strong>
public boolean columnNameMatches(final String columnName, final String javaName) {
final Column key = new Column(columnName, javaName);
return cache.computeIfAbsent(key, (c) -> delegate.columnNameMatches(columnName, javaName));
}
}
...
final ReflectionMappers reflectionMappers = jdbi.getConfig().get(ReflectionMappers.class);
reflectionMappers.setColumnNameMatchers(
reflectionMappers.getColumnNameMatchers().stream()
.map(CachingColumnNameMatcher::new)
.collect(Collectors.toList()));
...
如果我可以打开 PR,请告诉我缓存列名称比较是否对您有意义(它带有一些垃圾收集成本)。
@Alexey1Gavrilov ,我刚刚发布了包含 #1607 的 3.11.0。
我很高兴提高列名匹配的性能,尽管缓存所有匹配可能是一个重量级的解决方案。 您是否对特定的匹配器(可能是 SnakeCase 匹配器)有疑问? 让我们从对影响您的问题的更好描述开始,并设计一个解决方案,这可能是缓存:)
测试 3.11.1 - 与 3.5.1 相比提高了 20%! 做得好!
我将在 SnakeCase 匹配器上创建一个单独的问题,我们在那里讨论可能的解决方案。
太棒了,谢谢你!
最有用的评论
测试 3.11.1 - 与 3.5.1 相比提高了 20%! 做得好!
我将在 SnakeCase 匹配器上创建一个单独的问题,我们在那里讨论可能的解决方案。