JDK 1.3 socket.setSoTimeout()
От: Alexandr.Martynov http://amartyno.blogspot.com/
Дата: 24.04.06 18:05
Оценка:
Есть Oracle и JDK 1.3. В Oracle лежат Java классы взаимодействия с внешним SOAP сервисом.
Сделано это следующим образом:
1. Открывается сокет
2. выставляется timeout
3. посылается запрос SOAP сервису
4. ждется ответ от сервиса
5. если по прошествии некотрого времени ответ не получен выкидывается exception

Вопрос в следующем: нужно ли перед пунктом 5 закрывать socket или он сам по timeout'у закроется?

По факту мы имеем проблему — по прошествии очень большого количества времени БД падает из-за слишком болього числа открытых сессий и в данный момент мы грешим именно на этот код.

P.S. Я слышал что в JDK 1.3 была какая-то проблема с реализацие сокетов и что она пофикшена в JDK 1.4 — это случайно не она?


фагмент кода
-------------- 8< -------------------


import java.net.Socket;
import java.net.UnknownHostException;
import java.net.ConnectException;
import java.net.SocketException;
import java.util.Date;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

...

Socket socket = null;
socket = new Socket(hostname, port);

try {
socket.setSoLinger(true, 5);
socket.setSoTimeout(12000);
socket.setTcpNoDelay(true);
}

catch (SocketException se) {
...
}

catch (NullPointerException npe) {
...
}

...

Date start = new Date();
while(((result = this.in.read(c)) == -1)) {
int elapsed = new Date().getSeconds() — start.getSeconds();
if (elapsed > this.timeout) {
throw new MyException("...");
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.