2009-06-16 10 views
6

Ich unterstütze eine ASP.Net 3.5-Webanwendung, und Benutzer treten bei dem Versuch, einen Bericht auszuführen, nach 30 Sekunden einen Zeitüberschreitungsfehler auf. Wenn man sich im Internet umschaut, scheint es einfach zu sein, das Timeout im Code zu ändern, leider kann ich nicht auf den Code zugreifen und neu kompilieren. Gibt es sowieso den Standard für die Web-App, den Arbeitsprozess, IIS oder den gesamten Rechner zu konfigurieren?Ändern Sie den Standard-SqlCommand CommandTimeout mit der Konfiguration statt neu zu kompilieren?

Hier wird Spuren der Stapel bis zu dem Punkt, wo es für den Fall, in System.Data ist ich ein anderes Problem fehlt:

[SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.] 
    System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1948826 
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4844747 
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194 
    System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392 
    System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33 
    System.Data.SqlClient.SqlDataReader.get_MetaData() +83 
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297 
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32 
    System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141 
    System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12 
    System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10 
    System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +130 
    System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) +162 
    System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) +115 

--edit

Es ist etwas außerhalb der Code sein muss, selbst - Ich habe die Datenbank heruntergeladen und auf der gleichen Website ausgeführt, die auf einem Testserver installiert ist, und sie läuft länger als 30 Sekunden und gibt den Bericht zurück. Ich habe die machine.config und web.config Dateien aus dem .Net-Verzeichnis auf dem Live-und Test verglichen und sie scheinen die gleichen, verglichen die beiden IIS-Setups, schaute auch auf die SQL Server-Konfiguration und der einzige Unterschied ist, dass die Live Server ist auf 64-Bit-W2K3 geclustert, während der Testserver auf 32-Bit ist.

Antwort

14

Leider sagt alles, was ich in der Vergangenheit darüber gelesen habe, nein, kann nicht über die Konfiguration gesteuert werden. Was ist ein Mist.

2

Das Beste, das ich kenne, ist, dass Sie in der Verbindungszeichenfolge ein Verbindungstimeout festlegen können, das steuert, wie lange ADO beim Versuch, eine Verbindung mit SQL Server herzustellen, wartet und das Befehlstimeout nicht beeinflusst.

Ich persönlich denke, es sollte eine Möglichkeit geben, diese Einstellung zu ändern. Angenommen, die Assembly, in der sich diese befindet, ist nicht stark. Ihre beste Wette lautet möglicherweise, den Quellcode zurückzuentwickeln, die Quelle zu ändern und die Assembly mit dem neuen Namen erneut bereitzustellen.

3

Sie können das Befehls-Timeout nicht über die Verbindungszeichenfolge oder eine externe Einstellung festlegen, tut mir leid.

Manchmal interpretiert ein Treiber den Timeout-Parameter in der Verbindungszeichenfolge sowohl als Connect Timeout als auch als Command Timeout, aber das ist technisch gesehen ein "Bug". Ich muss die Standards lieben.

0

Es ist nicht zu schwer, selbst zu rollen? Erstellen Sie einfach eine benutzerdefinierte SqlCommandTimeout-Einstellung unter AppSettings. Wenn Sie bereits eine Art von SqlCommandFactory verwenden, um Ihren SqlCommand zu erstellen, oder eine SqlCommand-Basisklasse verwenden, können Sie die Änderung leicht vornehmen. Wenn nicht, dann interessiert Sie wahrscheinlich nicht genug an Ihrem Code, um ihn trotzdem in eine Konfigurationsdatei einfügen zu müssen.

Grüße, James

+1

Ich bin sicher, dass es nicht, aber, wie ich in der Frage erwähnt, habe ich keinen Zugriff auf den Quellcode. Wenn Sie diese Frage noch heute stellen, wäre diese Frage wahrscheinlich auf Serverfehler. – robertc