possibly-consider-using a shorter-maxLifetime-value

#trouble-shooting

[HikariCP] Possibly consider using a shorter maxLifetime value

์—๋Ÿฌ ๋กœ๊ทธ

HikariPool-1 - Failed to validate connection com.mysql.jdbc.JDBC4Connection (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.

์‚ฌ์šฉ ๋ฒ„์ „

  • MySQL 5.7, HikariCP 3.4.5

์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ํ•ด์„

  • Failed to validate connection com.mysql.jdbc.JDBC4Connection

  • JDBC4Connection ๊ฐ์ฒด๋ฅผ validate ๊ฒ€์ฆํ•˜๋Š”๋ฐ ์‹คํŒจํ•˜์˜€์Œ.

  • No operations allowed after connection closed.

  • ์ปค๋„ฅ์…˜์ด ์ข…๋ฃŒ๋œ ํ›„์—๋Š” ์–ด๋– ํ•œ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ.

    • DB์™€์˜ ์ปค๋„ฅ์…˜์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๋“ฏ.

  • ์ฆ‰ Connection Pool์—์„œ ์–ด๋–ค Connection ๊ฐ์ฒด๋ฅผ validate ์ง„ํ–‰ํ•˜๋Š”๋ฐ (Poolbase.isConnectionAlive),

    • Possibly consider using a shorter maxLifetime value.

    • maxLifeTime ๊ฐ’์„ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๊ฑธ ๊ณ ๋ คํ•˜๋ผ

์›์ธ

  • Database์˜ wait_timeout ๊ฐ’๊ณผ, HikariCP์—์„œ ์ฐธ๊ณ ํ•˜๋Š” maxLifetime ์ค‘ ํ›„์ž์˜ ๊ฐ’์ด ๋” ํฌ๊ธฐ ๋•Œ๋ฌธ

๋ถ„์„

Poolbase.isConnectionAlive

   boolean isConnectionAlive(final Connection connection)
   {
      try {
         try {
            setNetworkTimeout(connection, validationTimeout);

            final int validationSeconds = (int) Math.max(1000L, validationTimeout) / 1000;

            if (isUseJdbc4Validation) {
               return connection.isValid(validationSeconds);
            }

            try (Statement statement = connection.createStatement()) {
               if (isNetworkTimeoutSupported != TRUE) {
                  setQueryTimeout(statement, validationSeconds);
               }

               statement.execute(config.getConnectionTestQuery());
            }
         }
         finally {
            setNetworkTimeout(connection, networkTimeout);

            if (isIsolateInternalQueries && !isAutoCommit) {
               connection.rollback();
            }
         }

         return true;
      }
      catch (Exception e) {
         lastConnectionFailure.set(e);
         logger.warn("{} - Failed to validate connection {} ({}). Possibly consider using a shorter maxLifetime value.",
                     poolName, connection, e.getMessage());
         return false;
      }
  • Connection์ด ์‚ด์•„์žˆ๋Š” ์ง€ ํ™•์ธํ•ด๋ณด๋Š” ๋ฉ”์„œ๋“œ

  • ์—ฌ๊ธฐ์„œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•จ.

    • ์–ด๋А ๋ถ€๋ถ„์—์„œ?

    • setNetworkTimeout(connection, validationTimeout); ํ˜น์€ Statement statement = connection.createStatement() ์ผ์ˆ˜๋„..

  • ์•„๋งˆ ํžˆ์นด๋ฆฌ ํ’€์— ์žˆ๋Š” ์ปค๋„ฅ์…˜์„ ํ†ตํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋ ค๊ณ  (์˜ˆ๋ฅผ ๋“ค๋ฉด ์ปค๋„ฅ์…˜์˜ ํƒ€์ž„์•„์›ƒ์„ค์ •..)์„ ํ•˜๋ ค ํ–ˆ์œผ๋‚˜, ์ด์— ์—ฐ๊ฒฐ๋œ Database์˜ ์ปค๋„ฅ์…˜์€ ์ด๋ฏธ ๋‹ซํ˜€์„œ, SQLException ์ด ๋ฐœ์ƒํ–ˆ์„๋“ฏ.

  • ์ด ๋•Œ๋ฌธ์— warn ๋กœ๊ทธ๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ์ฐํžˆ๊ฒŒ ๋œ๋“ฏ.

ํ•ด๊ฒฐ

HikariCP option

์‹œ๊ฐ„ ๋‹จ์œ„๋Š” ms

  • autoCommit

    • auto-commit์„ค์ •

    • default: true

  • connectionTimeout

    • pool์—์„œ ์ปค๋„ฅ์…˜์„ ์–ป์–ด์˜ค๊ธฐ์ „๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„

    • ํ—ˆ์šฉ๊ฐ€๋Šฅํ•œ wait time์„ ์ดˆ๊ณผํ•˜๋ฉด SQLException์„ ๋˜์ง.

    • ์„ค์ •๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ž‘์€ ์‹œ๊ฐ„์€ 250ms

    • default: 30000 (30s)

  • idleTimeout

    • pool์— ์ผ์„ ์•ˆํ•˜๋Š” ์ปค๋„ฅ์…˜์„ ์œ ์ง€ํ•˜๋Š” ์‹œ๊ฐ„

    • ์ด ์˜ต์…˜์€ minimumIdle์ด maximumPoolSize๋ณด๋‹ค ์ž‘๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ๋งŒ ์„ค์ •.

    • pool์—์„œ ์œ ์ง€ํ•˜๋Š” ์ตœ์†Œ ์ปค๋„ฅ์…˜ ์ˆ˜๋Š” minimumIdle (A connection will never be retired as idle before this timeout.).

    • ์ตœ์†Ÿ๊ฐ’์€ 10000ms

    • default: 600000 (10minutes)

  • maxLifetime

    • ์ปค๋„ฅ์…˜ ํ’€์—์„œ ์‚ด์•„์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ปค๋„ฅ์…˜์˜ ์ตœ๋Œ€ ์ˆ˜๋ช…์‹œ๊ฐ„.

    • ์‚ฌ์šฉ์ค‘์ธ ์ปค๋„ฅ์…˜์€ maxLifetime์— ์ƒ๊ด€์—†์ด ์ œ๊ฑฐ๋˜์ง€์•Š์Œ.

    • ์‚ฌ์šฉ์ค‘์ด์ง€ ์•Š์„ ๋•Œ, maxLifetime์ด ์ง€๋‚˜๋ฉด ์ œ๊ฑฐ๋จ.

    • ํ’€ ์ „์ฒด๊ฐ€์•„๋‹Œ ์ปค๋„ฅ์…˜ ๋ณ„๋กœ ์ ์šฉ ๊ทธ ์ด์œ ๋Š” ํ’€์—์„œ ๋Œ€๋Ÿ‰์œผ๋กœ ์ปค๋„ฅ์…˜๋“ค์ด ์ œ๊ฑฐ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ž„.

    • ๊ฐ•๋ ฅํ•˜๊ฒŒ ์„ค์ •ํ•ด์•ผํ•˜๋Š” ์„ค์ • ๊ฐ’

    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์ธํ”„๋ผ์˜ ์ ์šฉ๋œ connection time limit๋ณด๋‹ค ์ž‘์•„์•ผํ•จ.

    • 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด infinite lifetime์ด ์ ์šฉ๋จ.

      • idleTimeout์„ค์ • ๊ฐ’์— ๋”ฐ๋ผ ์ ์šฉ

      • idleTimeout๊ฐ’์ด ์„ค์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ 0์œผ๋กœ ์„ค์ •ํ•ด๋„ ๋ฌดํ•œ lifetime ์ ์šฉ ์•ˆ๋จ).

    • default: 1800000 (30minutes)

  • connectionTestQuery

    • JDBC4 ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด ์ด ์˜ต์…˜์€ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ถ”์ฒœ

    • ์ด ์˜ต์…˜์€ JDBC4๋ฅผ ์ง€์›์•ˆํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์œ„ํ•œ ์˜ต์…˜์ž„(Connection.isValid() API.)

    • ์ปค๋„ฅ์…˜ pool์—์„œ ์ปค๋„ฅ์…˜์„ ํš๋“ํ•˜๊ธฐ์ „์— ์‚ด์•„์žˆ๋Š” ์ปค๋„ฅ์…˜์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด valid ์ฟผ๋ฆฌ๋ฅผ ๋˜์ง€๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฟผ๋ฆฌ (๋ณดํ†ต SELECT 1 ๋กœ ์„ค์ •)

    • JDBC4๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ง€์›ํ•˜์ง€์•Š๋Š” ํ™˜๊ฒฝ์—์„œ ์ด ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด error๋ ˆ๋ฒจ ๋กœ๊ทธ๋ฅผ ๋ฑ‰์–ด๋ƒ„.

    • default: none

  • minimumIdle

    • ์•„๋ฌด๋Ÿฐ ์ผ์„ ํ•˜์ง€์•Š์•„๋„ ์ ์–ด๋„ ์ด ์˜ต์…˜์— ์„ค์ • ๊ฐ’ size๋กœ ์ปค๋„ฅ์…˜๋“ค์„ ์œ ์ง€ํ•ด์ฃผ๋Š” ์„ค์ •.

    • ์ตœ์ ์˜ ์„ฑ๋Šฅ๊ณผ ์‘๋‹ต์„ฑ์„ ์š”๊ตฌํ•œ๋‹ค๋ฉด ์ด ๊ฐ’์€ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๊ฒŒ ์ข‹์Œ.

    • default: same as maximumPoolSize

  • maximumPoolSize

    • pool์— ์œ ์ง€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ์ˆ˜.

    • pool์˜ ์ปค๋„ฅ์…˜ ์ˆ˜๊ฐ€ ์˜ต์…˜ ๊ฐ’์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด idle์ธ ์ƒํƒœ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Œ.

    • default: 10

  • poolName

    • ์‚ฌ์šฉ์ž๊ฐ€ pool์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•จ.

    • ๋กœ๊น…์ด๋‚˜ JMX management console์— ํ‘œ์‹œ๋˜๋Š” ์ด๋ฆ„.

    • default: auto-generated

  • initializationFailTimeout

    • pool์—์„œ ์ปค๋„ฅ์…˜์„ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•˜๋„๋ก ํ•ด์คŒ

  • readOnly

    • pool์—์„œ ์ปค๋„ฅ์…˜์„ ํš๋“ํ•  ๋•Œ read-only ๋ชจ๋“œ๋กœ ๊ฐ€์ ธ์˜ด.

    • ๋‹จ, ๋ช‡๋ช‡์˜ database๋Š” read-only๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ.

    • ์ปค๋„ฅ์…˜์ด read-only๋กœ ์„ค์ •๋˜์–ด์žˆ์œผ๋ฉด ๋ช‡๋ช‡์˜ ์ฟผ๋ฆฌ๋“ค์ด ์ตœ์ ํ™” ๋จ.

    • default: false

  • driverClassName

    • jdbcUrl์„ ์ฐธ์กฐํ•˜์—ฌ ์ž๋™์œผ๋กœ driver๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ์‹œ๋„.

    • ํ•˜์ง€๋งŒ ๋ช‡๋ช‡์˜ ์˜ค๋ž˜๋œ driver๋“ค์€ driverClassName์„ ๋ช…์‹œํ™” ํ•ด์•ผํ•จ.

    • ์–ด๋–ค ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ช…๋ฐฑํ•˜๊ฒŒ ํ‘œ์‹œ ๋˜์ง€์•Š๋Š”๋‹ค๋ฉด ์ƒ๋žตํ•ด๋„๋จ.

  • validationTimeout

    • valid ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ปค๋„ฅ์…˜์ด ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” timeout.

    • 250ms๊ฐ€ ์„ค์ •๋  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Ÿ๊ฐ’

    • default: 5000ms

  • leakDetectionThreshold

    • ์ปค๋„ฅ์…˜์ด ๋ˆ„์ˆ˜ ๋กœ๊ทธ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „์— ์ปค๋„ฅ์…˜์„ ๊ฒ€์‚ฌํ•˜์—ฌ pool์—์„œ ์ปค๋„ฅ์…˜์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„.

    • 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด leak detection์„ ์ด์šฉํ•˜์ง€์•Š์Œ.

    • ์ตœ์†Ÿ๊ฐ’ 2000ms

    • default: 0

์ฐธ๊ณ 

Last updated

Was this helpful?