JAVA SQL Exception에서 Io exception: Broken pipe 에러가 발생했다면
네크워크 중간에 F/W이 있을 경우,
F/W 담당자에게, session Timeout 값이 얼마인지를 확인하십시요.
이 값은 일반적으로 default 2시간이나 관리자들의 경험상 30 분으로 조정되어 있을
것입니다.
또, F/W 이 하나 이상이 존재하고 F/W 로드발란싱을 위해 L4나 L7 장비를 함께 운영
하고 있다면, L4/L7 장비의 session timeout 값을 확인하십시요. 통상적으로 관리자들의
경험상 10분으로 조정되는 경향이 있습니다.
이 같은 상황에서, DB connection Pool을 사용하고 있다면 기 연결된 물리적인 JDBC
java.sql.Connection들이, 사용되지 않은채 위 시간이 지날 경우, 사실상 단절된 연결을
갖고 있게 되며, 이 연결이 응용어플리케이션에서 사용될 경우, 위와 같은 IOException이
발생할 수 있습니다. 이 상황은 부하가 많지 않을 때 오히려 발생하게 됩니다. 적당한
부하를 받는 시스템에서는 Pool에 있는 Connection들이 항상 빈번하게 사용되기 때문에
F/W이나 L4/L7 네트웍레벨에서 IdleTimeout 상황으로 이어지지 않기 때문입니다.
이 경우라면, DB Connection Pool의 IdleTimeout(유휴제한시간) 값을 위 N/W 상의
session timeout보다 짧게 조정되어야 합니다. 즉, F/W이나 N/W에서 조용히(?) 끊어지기
전에 Pool 에서 정상적으로 close() 시켜버려야 하는 것이지요.
혹은 AS400 DB상에서 Idle connection timeout값이 있다면 마찬가지로 고려되어야
겠지요...
PS: Hans Vergstan 의 DBConnectionManager.java 나 DBPoolMan.java 와 같이 인터넷상에
돌아다니는 Connection Pool 의 경우 "IdleTimeout" 기능이 없습니다. 직접 구현해
넣어야 합니다. 그렇지 않으면, 상기와 같은 I/O Exception Broken Pipe 와 같은
에러를 해결할 방법이 없습니다.
PS: 이 현상은 최근 여러 곳에서 특정 웹어플리케이션서버나 특정 DB와 무관하게 동일한
문제게 봉착한 사이트들이 많은 것 같아 향후, 보다 상세하고 case by case 로 정리하여
다시 작성할 예정입니다.