Jdbi: 버전 3.5.1 이후 μƒλ‹Ήν•œ μ„±λŠ₯ μ €ν•˜

에 λ§Œλ“  2019λ…„ 10μ›” 27일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: jdbi/jdbi

20개 μ΄μƒμ˜ ν•„λ“œκ°€ μžˆλŠ” Java μœ ν˜•μ— λŒ€ν•΄ Java Beans ν–‰ 및 인수 맀퍼λ₯Ό μ‚¬μš©ν•˜λŠ” λ™μ•ˆ 버전 3.5.1μ—μ„œ 버전 3.10.1(Dropwizard 1.3.5 -> 2.0.X)둜 이동할 λ•Œ μƒλ‹Ήν•œ μ„±λŠ₯ μ €ν•˜λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

문제λ₯Ό μž¬ν˜„ν•˜κΈ° μœ„ν•΄ 마이크둜 벀치마크 ν”„λ‘œκ·Έλž¨( https://github.com/Alexey1Gavrilov/jdbi-test) 을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. 3.5.1 및 3.10.1의 μ‹€ν–‰ μ‹œκ°„μ€ μ΅œλŒ€ 70%κΉŒμ§€ λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

ν…ŒμŠ€νŠΈ 3.11.1 - 3.5.1에 ​​비해 20% κ°œμ„ ! ν›Œλ₯­ν•œ 일!
SnakeCase λ§€μ²˜μ— λŒ€ν•΄ λ³„λ„μ˜ 문제λ₯Ό λ§Œλ“€κ³  κ±°κΈ°μ—μ„œ κ°€λŠ₯ν•œ μ†”λ£¨μ…˜μ— λŒ€ν•΄ λ…Όμ˜ν•˜κ² μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  5 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš” @Alexey1Gavrilov , μ‹ κ³ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! ν™•μ‹€νžˆ μ•½κ°„μ˜ νšŒκ·€κ°€ μžˆμ—ˆλ‹€λŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€.

상황 κ°œμ„  μž‘μ—…μ„ μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. https://github.com/jdbi/jdbi/pull/1607
ν˜„μž¬, μš°λ¦¬κ°€ λͺ¨λ“  것을 κΉ¨λœ¨λ¦¬μ§€ μ•Šλ„λ‘ 검토와 λͺ‡ 가지 ν…ŒμŠ€νŠΈλ₯Ό 기닀리고 μžˆμŠ΅λ‹ˆλ‹€. :)

μœ„μ— 링크된 μˆ˜μ • 사항이 μ‚¬μš© 사둀에 도움이 λ˜λŠ”μ§€ λ…λ¦½μ μœΌλ‘œ 확인할 μ‹œκ°„μ΄ μžˆμŠ΅λ‹ˆκΉŒ?
κ°μ‚¬ν•©λ‹ˆλ‹€. 곧 μˆ˜μ • 사항이 λ³‘ν•©λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

이미 κ°œμ„  μž‘μ—…μ„ ν•˜κ³  μžˆλ‹€λŠ” μ•„μ£Ό 쒋은 μ†Œμ‹μž…λ‹ˆλ‹€! #1607이 μ„±λŠ₯을 크게 ν–₯μƒμ‹œν‚€λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄ 마이크둜 벀치마크 ν”„λ‘œκ·Έλž¨μ€ ν•΄λ‹Ή PR둜 μ‹€ν–‰ν•œ λ‹€μŒ 3.5.1μ—μ„œ μ•½ 10-15% 더 λΉ λ₯΄κ²Œ μ‹€ν–‰λ©λ‹ˆλ‹€. ν›Œλ₯­ν•œ 일!

λ˜ν•œ μ„±λŠ₯을 λ”μš± ν–₯μƒμ‹œν‚€λŠ” μ—΄ 이름 μΌμΉ˜μžμ— λŒ€ν•œ μ‚¬μš©μž 지정 μΊμ‹œ 계측을 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€. μ•„μ΄λ””μ–΄λŠ” 기본적으둜 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 λ§€μ²˜μ— λŒ€ν•΄ λ³„λ„μ˜ 문제λ₯Ό λ§Œλ“€κ³  κ±°κΈ°μ—μ„œ κ°€λŠ₯ν•œ μ†”λ£¨μ…˜μ— λŒ€ν•΄ λ…Όμ˜ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ’‹μ•„ κ³ λ§ˆμ›Œ!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰