Исключение подключения с использованием шаблона Spring JDBC

У меня есть простое веб-приложение, разработанное с использованием Spring, и недавно у меня возникли проблемы с подключениями к БД. Моя БД находится на MS SQL Server 2005.

Для извлечения данных я реализовал несколько DAO, используя класс JDBCTemplate, предоставленный фреймворком.

Иногда я получаю это исключение:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: StatementCallback; SQL [SELECT [Campaigns].[CampaignID],[CampaignCode],[CampaignType],[StartDate],[EndDate],[Status],[FirstUpdate],[LastUpdate],[FirstUpdateUserID],[LastUpdateUserID],[CampaignDescriptions].[Description] FROM [Campaigns] INNER JOIN [CampaignDescriptions] ON [Campaigns].[CampaignID] = [CampaignDescriptions].[CampaignID] ORDER BY [StartDate] DESC]; Connection reset by peer: socket write error; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: socket write error
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

исключение, по-видимому, возникает только при выполнении сообщенного запроса.

Я не могу понять, что вызывает эту проблему. Есть идеи?

Метод, выполняющий запрос:

@Transactional(propagation = Propagation.NEVER)
public Campaign[] getAll() {
    List<Campaign> campList = getJdbcTemplate()
            .query(BASE_QUERY,
                    new CampaignMapper());
    return campList.toArray(new Campaign[0]);
}

где BASE_QUERY совпадает с сообщением об исключении.


person davioooh    schedule 21.11.2012    source источник
comment
соответствующая часть ошибки: SQLServerException: сброс соединения одноранговым узлом: ошибка записи сокета   -  person NimChimpsky    schedule 21.11.2012
comment
как вы объявляете источник данных в конфигурации весеннего приложения?   -  person user1516873    schedule 21.11.2012


Ответы (1)


это пахнет устаревшей проблемой соединения. Он может отображаться только в этом запросе, если он довольно распространен или выполняется первым (в большинстве случаев).

Что нужно проверить:

  • Тайм-аут подключения на стороне сервера
  • Минимальный тайм-аут простоя пула подключений
  • Пул соединений проверяет соединение перед использованием
person Gareth Davis    schedule 21.11.2012
comment
поэтому может случиться так, что падающий запрос получает устаревшее соединение из пула. какой пул соединений вы используете? - person Gareth Davis; 21.11.2012
comment
я использую org.apache.commons.dbcp.BasicDataSource в качестве источника данных для своего дао. Я не устанавливаю никаких параметров пула... - person davioooh; 21.11.2012
comment
@davioooh добавьте параметр validationQuery в свой источник данных, например: <property name="validationQuery" value="select 1 as res"/> - person user1516873; 21.11.2012
comment
@user1516873 user1516873 есть ли способ также установить время ожидания соединения? - person davioooh; 27.11.2012
comment
@davioooh, я думаю, тебе следует создать новый вопрос, а не портить этот. - person user1516873; 27.11.2012