Hikari Connection Pool에 λŒ€ν•˜μ—¬ (2)

na.ramΒ·2025λ…„ 5μ›” 12일

Spring

λͺ©λ‘ 보기
7/13
post-thumbnail

πŸ”Ž HikariCP Dead lock?

이 λΈ”λŸ­μ€ HikariCP의 About Pool Sizing의 pool-locking λΆ€λΆ„μ˜ λ²ˆμ—­μž…λ‹ˆλ‹€.

pool-locking은 ν•˜λ‚˜μ˜ μ•‘ν„°(μ“°λ ˆλ“œλ‚˜ μž‘μ—…μž)κ°€ λ§Žμ€ 컀λ„₯μ…˜μ„ νšλ“ν•˜λŠ” κ²½μš°μ— λ°œμƒν•  수 μžˆλŠ” κ°€λŠ₯μ„±μœΌλ‘œ μ œκΈ°λ˜μ–΄ μ™”μŠ΅λ‹ˆλ‹€.
이 λ¬Έμ œλŠ” λŒ€λΆ€λΆ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μˆ˜μ€€μ—μ„œ λ°œμƒν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

λ¬Όλ‘ , μ΄λŸ¬ν•œ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ ν’€ 크기λ₯Ό 늘리면 락업(lockup, 정체 ν˜„μƒ)을 μ™„ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
ν•˜μ§€λ§Œ ν’€ 크기λ₯Ό 늘리기 전에 λ¨Όμ € μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μˆ˜μ€€μ—μ„œ κ°œμ„  κ°€λŠ₯ν•œ 뢀뢄이 μžˆλŠ”μ§€ κ²€ν† ν•˜κΈΈ ꢌμž₯ν•©λ‹ˆλ‹€.

λ°λ“œλ½μ„ ν”Όν•˜κΈ° μœ„ν•œ pool size 계산 곡식

λ°λ“œλ½μ΄ μ ˆλŒ€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν•˜κΈ° μœ„ν•œ ν’€ 크기λ₯Ό κ³„μ‚°ν•˜λŠ” 곡식은 λ‹€μŒκ³Ό 같이 κ°„λ‹¨ν•©λ‹ˆλ‹€.

pool size = Tn Γ— (Cm - 1) + 1
Tn: μ΅œλŒ€ μŠ€λ ˆλ“œ 수 (Maximum number of threads)
Cm: 단일 μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— λ³΄μœ ν•  수 μžˆλŠ” μ΅œλŒ€ 컀λ„₯μ…˜ 수 (Max connections per thread)

βœ”οΈ μ΄λŠ” 졜적의 pool sizeκ°€ μ•„λ‹Œ, λ°λ“œλ½ λ°©μ§€λ₯Ό μœ„ν•œ μ΅œμ†Œ 크기일 λΏμž…λ‹ˆλ‹€.
βœ”οΈ 일뢀 ν™˜κ²½μ—μ„œλŠ” JTA(Java Transaction Manager)λ₯Ό μ‚¬μš©ν•˜λ©΄ getConnection()μ—μ„œ ν˜„μž¬ νŠΈλžœμž­μ…˜μ—μ„œ 이미 연결을 λ³΄μœ ν•˜κ³  μžˆλŠ” μ“°λ ˆλ“œλ‘œ λ™μΌν•œ 컀λ„₯μ…˜μ„ μž¬μ‚¬μš©ν•΄ ν•„μš”ν•œ 컀λ„₯μ…˜ 수λ₯Ό 크게 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ”Ž HikariCP의 λ™μž‘ 방식?

Connection νšλ“

  1. 컀λ„₯μ…˜μ„ μš”μ²­ν•œλ‹€.
  2. ThreadLocal μΊμ‹œμ—μ„œ νƒμƒ‰ν•œλ‹€.

    2-1. μ“°λ ˆλ“œλ³„ μΊμ‹œμ— μžˆλŠ” ν•­λͺ©μ„ μ—­μˆœμœΌλ‘œ νƒμƒ‰ν•˜λ©°, STATE_NOT_IN_USE μƒνƒœμΈ ν•­λͺ©μ„ STATE_IN_USE둜 λ°”κΎΈκ³  λ°˜ν™˜ν•œλ‹€.
    2-2. μΊμ‹œμ— μ—†μœΌλ©΄ 3번으둜 λ„˜μ–΄κ°„λ‹€.

  3. sharedListμ—μ„œ νƒμƒ‰ν•œλ‹€.

    3-1. 순차적으둜 ν™•μΈν•˜λ©°, STATE_NOT_IN_USE μƒνƒœμΈ ν•­λͺ©μ„ STATE_IN_USE둜 λ°”κΎΈκ³  λ°˜ν™˜ν•œλ‹€.

  4. handoffQueueμ—μ„œ 타 μ“°λ ˆλ“œ λ°˜ν™˜ ν•­λͺ© λŒ€κΈ°
    4-1. 유휴 컀λ„₯μ…˜μ΄ μ‘΄μž¬ν•˜λ©΄ STATE_NOT_IN_USE μƒνƒœμΈ ν•­λͺ©μ„ STATE_IN_USE둜 λ°”κΎΈκ³  λ°˜ν™˜ν•œλ‹€.
    4-2. 유휴 컀λ„₯μ…˜μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ κΈ°λ‹€λ¦°λ‹€.
    4-3. μ§€μ •λœ timeout 내에 아무 컀λ„₯μ…˜λ„ λ°˜ν™˜λ°›μ§€ λͺ»ν•œλ‹€λ©΄ null을 λ°˜ν™˜ν•œλ‹€.

Connection λ°˜ν™˜

  1. λ°˜ν™˜λœ 컀λ„₯μ…˜μ˜ μƒνƒœλ₯Ό STATE_NOT_IN_USE둜 λ³€κ²½ν•œλ‹€.
  2. λŒ€κΈ° 쀑인 μ“°λ ˆλ“œκ°€ μžˆλ‹€λ©΄ handoffQueue에 μΆ”κ°€ν•œλ‹€. (이 경우, μœ„μ˜ Connection μš”μ²­μ˜ 4번 κ³Όμ •μ—μ„œ λŒ€κΈ° 쀑인 μ“°λ ˆλ“œμ—κ²Œ λ°˜ν™˜ν•˜κ²Œ 됨)
  3. λŒ€κΈ° 쀑인 μ“°λ ˆλ“œκ°€ μ—†λ‹€λ©΄ ThreadLocal μΊμ‹œμ— μ €μž₯ν•œλ‹€.

0개의 λŒ“κΈ€