<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Maxlifetime on Joonlog</title><link>https://joonlog.github.io/tags/maxlifetime/</link><description>Recent content in Maxlifetime on Joonlog</description><generator>Hugo -- gohugo.io</generator><language>ko-kr</language><lastBuildDate>Wed, 10 Sep 2025 09:00:00 +0900</lastBuildDate><atom:link href="https://joonlog.github.io/tags/maxlifetime/index.xml" rel="self" type="application/rss+xml"/><item><title>HikariCP connection is closed 에러 TroubleShooting</title><link>https://joonlog.github.io/p/hikaricp-connection-is-closed-%EC%97%90%EB%9F%AC-troubleshooting/</link><pubDate>Wed, 10 Sep 2025 09:00:00 +0900</pubDate><guid>https://joonlog.github.io/p/hikaricp-connection-is-closed-%EC%97%90%EB%9F%AC-troubleshooting/</guid><description>&lt;ul&gt;
&lt;li&gt;MySQL은 &lt;code&gt;wait_timeout&lt;/code&gt; 설정값에 따라 커넥션 중 일정 시간이상 사용하지 않은 커넥션을 &lt;strong&gt;종료&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;HikariCP는 &lt;code&gt;maxLifetime&lt;/code&gt; 설정값에 따라 스스로 미사용된 커넥션을 제거하고 새로 생성하는 방식으로 동작
&lt;ul&gt;
&lt;li&gt;커넥션 누수 발생 시 connection closed 되지 않으므로 Hikari는 커넥션을 &lt;code&gt;activate&lt;/code&gt; 상태로 파악하여 &lt;code&gt;maxLifetime&lt;/code&gt; 에 따른 커넥션 갱신하지 않음
&lt;ul&gt;
&lt;li&gt;따라서 &lt;code&gt;wait_timeout&lt;/code&gt; 으로 인해 닫힌 커넥션을 재사용하려다 &lt;code&gt;connection is closed&lt;/code&gt; 오류가 발생&lt;/li&gt;
&lt;li&gt;HikariCP는 &lt;code&gt;maxLifetime&lt;/code&gt;값을 DB의 &lt;code&gt;wait_timeout&lt;/code&gt;보다 &lt;strong&gt;몇 초 정도&lt;/strong&gt; 짧게 설정하라고 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="connection-is-closed-에러-히스토리"&gt;connection is closed 에러 히스토리
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;connection pool 수치 점검&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;default 10개, 필요시 20~30개로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spring.datasource.hikari.maximum-pool-size&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;현재 실행 중인 쿼리의 Que 값이 connection Pool 최대 값까지 도달하여 다음 실행할 쿼리를 처리하지 못해 발생&lt;/li&gt;
&lt;li&gt;APM 솔루션으로 Connection Pool 자원 모니터링을 통해 증설이 필요할 시 즉시 증설, 쿼리 최적화 필요 언급
&lt;ul&gt;
&lt;li&gt;이건 임시 조치만 반복할 뿐, 커넥션 누수는 코드를 수정해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;db 파라미터 &lt;code&gt;wait_timeout = 500&lt;/code&gt; 설정&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;이후 재발&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spring.datasource.hikari.minimum-idle&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt; // 최소 커넥션 수
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spring.datasource.hikari.idle-timeout&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;300000&lt;/span&gt; // 유휴 커넥션 타임아웃 &lt;span class="o"&gt;(&lt;/span&gt;5분&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spring.datasource.hikari.max-lifetime&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1800000&lt;/span&gt; // 최대 커넥션 생명 주기 &lt;span class="o"&gt;(&lt;/span&gt;30분&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spring.datasource.hikari.connection-timeout&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30000&lt;/span&gt; // 커넥션 대기 시간 &lt;span class="o"&gt;(&lt;/span&gt;30초&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# db 파라미터 max_connection = 2000으로 확인됨&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spring.datasource.hikari.maximum-pool-size&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt; // 30에서 60으로 변경
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;이후 재발&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;HikariCP는 &lt;code&gt;maxLifetime&lt;/code&gt;값을 DB의 &lt;code&gt;wait_timeout&lt;/code&gt;보다 &lt;strong&gt;몇 초 정도&lt;/strong&gt; 짧게 설정하라고 권장&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spring.datasource.hikari.max-lifetime&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;497000&lt;/span&gt; // 최대 커넥션 생명 주기 &lt;span class="o"&gt;(&lt;/span&gt;497초&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;이후 재발&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;was 서버 로그 확인 시 maxLifetime 값을 더 짧게 설정하는 것을 권장하는 로그 확인&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;WARN &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;PoolBase.javalisConnectionAlive&lt;span class="o"&gt;(&lt;/span&gt;184&lt;span class="o"&gt;)&lt;/span&gt; : HikariPool-1 - Failed to connection org.mariadb.jdbc.MariaDbConnection@14441ec9 &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8360&lt;span class="o"&gt;)&lt;/span&gt; Connection.setNetworkTimeout cannot be called on a closed connection&lt;span class="o"&gt;)&lt;/span&gt;. Possibly consider using a shorter maxLifetime value.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;maxLifetime 값 변경&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spring.datasource.hikari.max-lifetime&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;470000&lt;/span&gt; // 최대 커넥션 생명 주기 &lt;span class="o"&gt;(&lt;/span&gt;470초&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;동일오류 재발&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;spring.datasource.hikari.connection-init-sql 프로퍼티를 추가하여 세션 wait_timeout을 설정&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;wait_timeout 값을 설정된 hikari MaxLifetime 값 + 5초 형식으로 설정&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spring.datasource.hikari.connection-init-sql&lt;span class="o"&gt;=&lt;/span&gt;SET &lt;span class="nv"&gt;wait_timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="커넥션-누수-사례"&gt;커넥션 누수 사례
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://jaehoney.tistory.com/337" target="_blank" rel="noopener"
&gt;https://jaehoney.tistory.com/337&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;wait_timeout 이 15초로 설정되어 있는데 레거시 코드 때문에 높이지 못함&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;따라서 세션의 wait_timeout을 설정&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spring.datasource.hikari.connection-init-sql&lt;span class="o"&gt;=&lt;/span&gt;SET &lt;span class="nv"&gt;wait_timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="link" href="https://do-study.tistory.com/97" target="_blank" rel="noopener"
&gt;https://do-study.tistory.com/97&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;EntityManager를 Bean으로 설정함
&lt;ul&gt;
&lt;li&gt;EntityManager는 스레드간 절대 공유하면 안됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;QueryDSL 구현 Resitory에서 특정 datasource의 EntityManager를 받기 위해 setEntityManager를 재정의하지 않고 별도 setting 메소드 작성&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>