Это проблема с Java, а не с драйвером JDBC. При определенных обстоятельствах вызов подключения через сокет игнорирует параметры тайм-аута и может занять минуты, чтобы вернуться. Это происходит с нами, когда брандмауэр блокирует порт. Это происходит со всеми TCP-соединениями (HTTP, RMI).
Единственное решение, которое я нахожу, это открыть соединение в другом потоке, как это,
private static final ExecutorService THREADPOOL
= Executors.newCachedThreadPool();
private static <T> T call(Callable<T> c, long timeout, TimeUnit timeUnit)
throws InterruptedException, ExecutionException, TimeoutException
{
FutureTask<T> t = new FutureTask<T>(c);
THREADPOOL.execute(t);
return t.get(timeout, timeUnit);
}
try {
Data data = call(new Callable<Data>() {
public Data call() throws Exception
{
// Open connection, get data here
return data;
}, 2, TimeUnit.SECONDS);
} catch (TimeoutException e) {
System.err.println("Data call timed-out");
}