Как предотвратить эту ошибку dling / sql - или это из-за плохой сети? - PullRequest
0 голосов
/ 22 февраля 2012

Шаг 1) Я проверяю, могу ли я получить доступ к серверу: (потому что у меня есть автономная обработка)

public static bool dbOnline(string timeOut="3")
{
  bool online = false;
       try
       {
           var testConn = new SqlConnection(Utils.ConnectionStr(timeOut)); 
           testConn.Open();
           online = true;
           testConn.Close();
       }
       catch (Exception)
       {
           online = false;
       }
       return online;
   }

2) Возвращается нормально, затем я создаю экземпляр dlinq!

_DataContext = new DataContext(Utils.ConnectionStr);//System.Data.Linq.DataContext
//then i point out a customer in DB

var customer = _DataContext.Customers.TableQuery().FirstOrDefault(c => c.ID == custid);

//Check its not null
if (customer != null)
{
            customer.points+= _points;
            customer.LastUpdated = DateTime.Now;
            customer.SubmitChanges();
}

3) И иногда я получаю эту ошибку, я могу что-то сделать, чтобы предотвратить это, или это исправить сеть?(я знаю, что есть проблемы с сетью), но могу ли я сделать что-то другое?- Спасибо

Ошибка: * System.Data.SqlClient.SqlException (0x80131904): истекло время ожидания.Время ожидания истекло до завершения операции, или сервер не отвечает. *

The statement has been terminated.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader()
   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicUpdate(TrackedObject item)
   at System.Data.Linq.ChangeDirector.StandardChangeDirector.Update(TrackedObject item)
   at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)

1 Ответ

1 голос
/ 22 февраля 2012

Тайм-аут невозможно определить изолированно, однако я обычно ожидаю, что ошибка network будет иметь другую ошибку.Первое, на что я бы посмотрел:

  • - это правильно проиндексированные данные
  • были ли они блокированы в то время, скорее всего, из-за длительной транзакции с блокировкойdata
  • было ли что-то похожее на увеличение базы данных в то время, когда
  • был сервер исключительно занят в то время

Мои деньги были бы на втором

Кроме того, мы не можем видеть, что такое TableQuery();если это возвращает IEnumerable<Customer>, то это может быть связано с извлечением слишком большого количества данных (в вашем контексте это, вероятно, должно возвращать IQueryable<Customer> при минимуме, но мы не можем видеть).

Реальноездесь нужно запустить трассировку SQL и попытаться поймать ее в действии - посмотреть, что происходит.

...