JDBC потерял соединение при повторении ResultSet

В моем приложении я подключаюсь к базе данных MSSQL через TCP/IP, используя Spring и JdbcDAOSupport. Он отлично работает, когда соединение стабильно, но когда я отключаю кабель Ethernet во время повторения набора результатов, приложение приостанавливается. Он не выдает никаких исключений.

JdbcTemplate jdbc = getJdbcTemplate();
return jdbc.query(sql, mapper, someArgs);

где mapper — мой собственный класс RowMapper. Я пробовал использовать Connection и PreparedStatement, и это не решает проблему. У кого-нибудь есть решение для этого или есть похожие проблемы?


person Michał Sokołowski    schedule 19.02.2013    source источник


Ответы (1)


Приложение зависает, потому что протокол TCP/IP был разработан с учетом плохих соединений. Когда пакет не достигает пункта назначения, отправитель просто повторяет попытку с экспоненциальным отставанием. Если такое поведение нежелательно, вы настраиваете время ожидания блокировки сокета (SO_TIMEOUT).

К сожалению, драйвер JDBC SQL Server не имеет возможности настроить время ожидания сокета, поэтому он будет блокироваться на неопределенный срок.

Как указывает Натан Хьюз в своем комментарии, драйвер jTDS имеет возможность настроить socketTimeout, поэтому вы можете попробовать вместо него этот водитель.

person Mark Rotteveel    schedule 19.02.2013
comment
может попробовать jtds? похоже, что у него тайм-аут сокета (jtds.sourceforge.net/faq.html) - person Nathan Hughes; 19.02.2013
comment
@NathanHughes Это, наверное, единственный вариант, да - person Mark Rotteveel; 19.02.2013
comment
@Falcon: я думаю, не loginTimeout. Вы видели эту запись (ниже на странице часто задаваемых вопросов): socketTimeout (по умолчанию - 0) Количество времени ожидания (в секундах) ответа сервера до истечения времени ожидания. - person Nathan Hughes; 19.02.2013
comment
Это объяснение действительно помогло диагностировать сложную проблему, большое спасибо! - person dave.c; 05.07.2013