URLConnection 객체를 쓸려거든, HTTPURLConnection으로 클래스타입 변환을 하고, 명시적으로 disconnect() 메소드를 날려주는 것이 좋습니다.
HttpURLConnection conn = (HttpURLConnection)(new URL("http://www.google.com").openConnection());
…
conn.disconnect();
http 프로토콜을 가지는 URL 객체를 이용하여 openConnection() 메소드를 얻는 객체는 rt.jar에 있는 sun.net.www.protocol.http.HttpURLConnection 객체를 얻어옵니다.
사실 이 객체는 URLConnection 또는 HttpURLConnection 추상화 객체로 쓸 수 있습니다. 다만 큰 차이는 disconnect() 메소드를 호출할 수 있느냐 없는냐 수준입니다.
URLConnection을 통해서 InputStream을 통해서 response를 다 읽어오면, 자연스럽게 접속이 끊기게 됩니다. 아시다시피 아파치 http 설정에 KeepAlive 가 Off로 되어 있으면 그렇습니다.
만약 KeepAlive가 On으로 되어 있으면, 연결이 끊기지 않도록 되어 있지요.
결국은 아파치 설정이 KeepAlive가 On 설정으로 셋팅되어 있을 수 있기 때문에 HttpURLConnection객체를 써서 disconnect()를 써야 하는 상황이라고 생각하시면 좋을 듯 싶습니다.
아파치 설정에 KeepAlive Off로 되어 있으면, 그 서버와 통신하는 클라이언트의 URLConnection을 사용해도 아무런 문제가 없습니다. 한게임 웹은 무조건 그런 설정을 따라가도록 되어 있습니다.
첨부파일에 보시면, 제가 수십 번의 테스트를 통해서 나름 결론을 내린 두개의 tcpdump 분석 데이터가 있습니다.
아파치 웹 서버가 KeepAlive 가 Off로 되어 있으면, 클라이언트에서 FIN을 보내서 종료하게 되고, KeepAlive가 On이면 대기하게 됩니다. 웹 서버가 KeepAlive가 On 상태인대, 계속 요청이 들어오게 되면, 연결이 많아져 점점 처리를 못하게 되어 ACK 통신이 어려워져 timeout 되어 FIN_WAIT로 이동할 것입니다. (아마도 거의 장애 상태에 부딪히게 됩니다. 이 상황은 보고된 장애 또는 도스 공격 상황와 매우 흡사한 상황입니다.)
'java core' 카테고리의 다른 글
Java Pattern 활용하기 (0) | 2009.07.23 |
---|---|
Symmetric Encryption by using java.security. (0) | 2009.07.22 |
Finally 범위 (0) | 2009.07.15 |
How to get object size in java. (0) | 2009.05.29 |
How to get List comparator using Comparator class. (0) | 2009.05.13 |