Все внезапно, Sql Server Тайм-аут - PullRequest
1 голос
/ 25 мая 2010

Мы получили устаревшее приложение vb.net, которое работало годами. Но вдруг он перестает работать вчера и дает время ожидания сервера SQL Большая часть приложения выдает ошибку тайм-аута, одна часть, например, ниже кода:

command2 = New SqlCommand("select * from Acc order by AccDate,AccNo,AccSeq", SBSConnection2)
        reader2 = command2.ExecuteReader()
    If reader2.HasRows() Then
        While reader2.Read()
            If IndiAccNo <> reader2("AccNo") Then
                CAccNo = CAccNo + 1
                CAccSeq = 10001
                IndiAccNo = reader2("AccNo")
            Else
                CAccSeq = CAccSeq + 1
           End If
            command3 = New SqlCommand("update Acc Set AccNo=@NewAccNo,AccSeq=@NewAccSeq where AccNo=@AccNo and AccSeq=@AccSeq", SBSConnection3)
            command3.Parameters.Add("@AccNo", SqlDbType.Int).Value = reader2("AccNo")
        command3.Parameters.Add("@AccSeq", SqlDbType.Int).Value = reader2("AccSeq")
          command3.Parameters.Add("@NewAccNo", SqlDbType.Int).Value = CAccNo
        command3.Parameters.Add("@NewAccSeq", SqlDbType.Int).Value = CAccSeq

      command3.ExecuteNonQuery()
    End While
End If

Это работало и теперь дает время ожидания в command3.ExecuteNonQuery () Есть идеи?

~~~~~~~~~~~ Некоторая информация:

Нет ничего, что было изменено в сети, и приложение использует локальную базу данных Основная проблема в том, что даже в среде разработки это больше не работает

Ответы [ 13 ]

16 голосов
/ 25 мая 2010

Скажу очевидное - что-то изменилось. Это может быть обновление, которое не дает желаемого эффекта - это может быть сетевой компонент, идущий на юг - это может быть гибкий диск - это может быть много вещей - но что-то в пути доступа изменилось , Какие другие признаки проблемы вы видите, в том числе проблемы, не связанные непосредственно с этим приложением? Где хранится база данных (локальный диск, сетевое хранилище, написанное ангелами на головке булавки, другое)? Ваш системный администратор "помог" или "улучшил" что-то? Код не изношен - что-то еще произошло.

15 голосов
/ 25 мая 2010

Возможно ли, что этот запрос стал медленнее со временем и теперь просто превысил время ожидания по умолчанию?

Сколько записей будет в таблице acc и есть ли индексы в AccNo и AccSeq? И какую версию SQL вы используете?

10 голосов
/ 25 мая 2010

Сколько времени вы обновляли статистику и перестраивали индексы?

Насколько выросли ваши данные? Запросы, которые хорошо работают для небольших наборов данных, могут быть плохими для больших.

У вас проблемы с блокировкой? [AMJ] Вы проверили монитор активности на наличие блокировок по истечении времени ожидания?

Запустили ли вы профилировщик, чтобы получить запрос, который истекает, а затем запустить его непосредственно на сервере? Так быстрее? Также могут возникнуть проблемы с сетью при перемещении информации с сервера базы данных в приложение. Это, по крайней мере, скажет вам, если это проблема с SQl Server или проблема с сетью.

И, как сказал Боб Джарвис, что недавно изменилось на сервере? Что-то изменилось в самой структуре базы данных? Кто-то добавил триггер?

3 голосов
/ 25 мая 2010

Я бы предположил, что есть блокировка для одной из записей, которые вы пытаетесь обновить, или есть транзакции, которые не были завершены.

Я знаю, что это не является частью вашего вопроса, но после просмотра вашего примера кода я должен сделать этот комментарий: есть ли шанс, что вы сможете изменить свой метод выполнения sql в вашей базе данных? На многих уровнях это плохо.

1 голос
/ 03 июня 2010

Вы проверяли очевидное?

Запускали ли вы запрос «обновить Acc Set AccNo = @ NewAccNo, AccSeq = @ NewAccSeq, где AccNo = @ AccNo и AccSeq = @ AccSeq» непосредственно в SQL Server Management Studio? (Пожалуйста, замените переменные на некоторые жестко закодированные значения)

Проводили ли вы тот же тест на компьютере другого коллеги?

1 голос
/ 25 мая 2010

Возможно, вам следует установить для свойства CommandTimeout более высокую задержку?

Это позволит вашей команде немного подождать, пока базовая база данных ответит. Как я понимаю, возможно, вы не уделяете достаточно времени вашему ядру базы данных для выполнения всего, что требуется, перед созданием другой команды для выполнения update.

Знайте, что SqlDataReader продолжается до "SELECT" при подаче объектов в памяти. Затем, во время чтения, вы требуете, чтобы ваш код обновил какую-то другую таблицу, которую ваш DBE просто не может обработать, к тому времени, как требует SqlCommand, чем время ожидания.

1 голос
/ 25 мая 2010

есть ли шансы на "кавычки" как часть строк, которые вы передаете запросам?

есть ли какие-либо шансы для запросов, зависящих от даты, когда особое условие больше не работает?

0 голосов
/ 04 июня 2010

Может быть, ваши таблицы содержат больше информации, и определено SqlConnection.ConnectionTimeout значение свойства в файле конфигурации с небольшим значением. И это значение не обязательно для выполнения ваших запросов. Вы можете попытаться оптимизировать свои запросы, а также перестроить индексы.

0 голосов
/ 04 июня 2010

Это может показаться чем-то большим, но если все ваше приложение перестало работать, у вас закончились места для журнала транзакций в вашей базе данных? Либо указан абсолютный размер, и он достигнут, либо диск заполнен.

0 голосов
/ 03 июня 2010

Убедитесь, что диск дефрагментирован. Да, я знаю, но это имеет значение. Не встроенный дефрагментатор. Тот, который дефрагментирует и оптимизирует как PerfectDisk .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...