2016-05-12 9 views
0

Unsere Produktionsumgebung, die verwendet NHibernate v3.1.0.4000 plötzlich begann diesen Fehler geben, wenn sie mit Volltextsuche Suche:NHibernate - "GenericADOException: konnte nicht Abfrage ausführen"

[SqlException (0x80131904) : Zeitüberschreitung. Das Zeitlimit ist vor dem Abschluss des Vorgangs abgelaufen oder der Server reagiert nicht.] System.Data.SqlClient.SqlConnection.OnError (SqlException-Ausnahme, Boolean breakConnection) +404 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() + 412 System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand CmdHandler, SqlDataReader Datenstrom, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 1363 System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +59 System.Data.SqlClient. SqlDataReader.get_MetaData() +118 System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 6.388.257 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBeh avior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6389826 System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String-Methode, DbAsyncResult result) 538 System.Data.SqlClient.SqlCommand. RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String-Methode) +28 System.Data.SqlClient.SqlCommand.ExecuteReader (CommandBehavior Verhalten, String-Methode) +256 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (CommandBehavior Verhalten) + 19 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() +23 NHibernate.AdoNet.AbstractBatcher.ExecuteReader (IDbCommand cmd) 845 NHibernate.Loader.Loader.GetResultSet (IDbCommand st, Boolean autoDiscoverTypes, Boolean aufrufbar, RowSelection Auswahl, ISessionImplementor Sitzung) +580 NHibernate.Loader.Loader.DoQuery (ISessionImplementor Sitzung, Queryquery, Boolean returnProxies) +275 NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections (ISessionImplementor Sitzung, Queryquery, Boolean returnProxies) +205 NHibernate.Loader.Loader.DoList (ISessionImplementor Sitzung, Queryquery) +195

[GenericADOException: nicht Abfrage [SELECT count (distinct this_.IdDocument) als y0_ VON Document.Document this_ inneren ausführen kann beitreten Document.DocumentCopy documentc1_ on this_.IdDocument = documentc1_.IdDocument WHERE ((@ p0 = @ p1 und enthält (this_.Title, @ p2)) und this_.IsDe leted = @ p3) und (((@ p4 = @ p5 und documentc1_.CreationDate> = @ p6) und documentc1_.CreationDate < = @ p7) und (documentc1_.IdOwnedByGroup = @ p8 oder documentc1_.IdCreatedByGroup = @ p9)]] Positionsparameter: # 0> 0 # 1> 0 # 2> "ýÿýÿýÿýÿýÿýÿýÿýÿ *" # 3> Falsch # 4> 0 # 5> 0 # 6> 12/5/2015 12:00:00 ýÿýÿ # 7> 12/5/2016 11:59:00 ýÿýÿ # 8> 1 # 9> 1 [SQL: SELECT-Zähler (distinct this_.IdDocument) als y0_ FROM Document.Document this_ innerer Join Document.DocumentCopy documentc1_ on this_.IdDocument = documentc1_.IdDocument WHERE ((@ p0 = @ p1 und enthält (this_.Title, @ p2)) und this_.IsDeleted = @ p3) und (((@ p4 = @ p5 und documentc1_.CreationDate> = @ p6) und documentc1_.CreationDate < = @ p7) und (documentc1_.IdOwnedByGroup = @ p8 oder documentc1_.IdCreatedByGroup = @ p9))]] NHibernate.Loader.Loader.DoList (ISessionImplementor-Sitzung, QueryParameters queryParame ters) 637 NHibernate.Loader.Loader.ListIgnoreQueryCache (ISessionImplementor Sitzung, Queryquery) +23 NHibernate.Loader.Criteria.CriteriaLoader.List (ISessionImplementor Sitzung) +60 NHibernate.Impl.SessionImpl.List (CriteriaImpl Kriterien, IList Ergebnisse) +1025 NHibernate.Impl.CriteriaImpl.List (IList Treffer) +63 NHibernate.Impl.CriteriaImpl.UniqueResult() +57 Domain.Repositories.DocumentRepository.Domain.Abstract.IDocumentRepository.GetAll (Kriterien 1 criteria, Int32& count, Dictionary 2 openFieldCriteria) 272 ServicesImplementation.DocumentService.GetDocuments (Kriterien 1 criteria, Int32& count, String metadataSearchTerm) +510 Docman.Models.List.ListModel.GetDocuments(Int32& count) +102 ASP._Page_Views_List_Index_cshtml.Execute() in d:\wwwroot\inetpub\docman\Views\List\Index.cshtml:27 System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +280 System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +104 System.Web.WebPages.StartPage.ExecutePageHierarchy() +143 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +157 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +384 System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +33 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func 1 Fortsetzung) 826.372 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters (Controllercontroller, IList`1 Filter, action~~POS=TRUNC action~~POS=TRUNC) +265 System.Web.Mvc.ControllerActionInvoker.InvokeAction (Controllercontroller, String action) 827.248 -System .Web.Mvc.Controller.ExecuteCore() +159 System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) +335 System.Web.M vc. <> c__DisplayClassb.b__5() +62 System.Web.Mvc.Async. <> c__DisplayClass1.b__0() +20 System.Web.Mvc. <> c__DisplayClasse.b__d() +54 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 469 System.Web.HttpApplication.ExecuteStep (IExecutionStep Schritt, Boolean & completedSynchronously) +375

Ich habe versucht, die oben aufgeführte Abfrage auf SSMS und es lief gut und schnell.

Ein ähnlicher Fehler wird hier erwähnt: , obwohl meine Fehlermeldung keine IndexOutOfRangeException darin enthält.

Kann mir jemand sagen, was könnte die Ursache dafür sein?

UPDATE:

Weitere Informationen:

Wir verwenden Projektionen.

Nach dem Fehlerprotokoll stammt der Fehler von einer Abfrage, die nur eine Anzahl und nicht viele Zeilen mit vielen Feldern zurückgibt.

Wie ich bereits sagte, die gleiche Abfrage (im Fehlerprotokoll aufgeführt) läuft schnell und ohne Probleme, wenn ich es von SSMS ausführen. Alle Abfragen, die von der Anwendung ausgeführt werden, die diese SQL-Abfrage ausführt, scheinen jedoch mit dem obigen Fehler fehlzuschlagen.

Der Code ist möglicherweise nicht klar für Sie, da wir einen benutzerdefinierten Wrapper für NH verwenden.

Ich denke, ich bin falsch in der Reihenfolge der Ausnahmen und zuerst die Zeitüberschreitung passiert und dann meldet der ADO.net den anderen Fehler. So , ich denke, es ist ein Timeout, nachdem alle ...

UPDATE 2:

Nach etwas mehr Forschung, es scheint zu diesem Thema bezieht und die Abfrage in der Tat ist das Timing aus, nur nicht von SSMS:

Query times out when executed from web, but super-fast when executed from SSMS

+0

Die datails sagt, ist Timeout Problem. – Najera

+0

Wie viel Daten bringen Sie zurück? Wie sieht der Code aus, der das macht? nimmst du Projektionen? – Fran

+0

@Najera Wenn Sie unter diese erste Ausnahme schauen, gibt es eine weitere Ausnahme, die die innere Ausnahme zu sein scheint. – user2173353

Antwort

-1

das ist ein Timeout entpuppte, die nicht von SSMS reproduziert werden konnten, da war es einen anderen Wert für ARITHABORT (zwischen meiner App-Sitzung und der SSMS Sitzung) verwenden.

Sobald ich den Standardwert für sie zu ON/1 für die DB gesetzt hatte, alles festgelegt wurde:

USE [master]; 
GO 
ALTER DATABASE [{database_name}] SET ARITHABORT ON WITH NO_WAIT; 
GO 

Siehe hier: https://dba.stackexchange.com/a/95090/71232

+0

Falsch, schrecklich falsch. Sie haben einen fehlerhaften Abfrageplan nur vorübergehend aus dem verwendeten Abfrageplancache entfernt. Das Problem wird zurückkommen und dich später wieder beißen. Die Tatsache, dass du [diese Antwort] gefunden hast (/ a/2248566/1178314) war vielversprechend, aber es sieht so aus, als hättest du es zu schnell gelesen. Ihr tatsächliches Problem ist höchstwahrscheinlich ein Indexproblem, das dazu führt, dass SQL Server irgendwann einen fehlerhaften Abfrageplan generiert und in den Zwischenspeicher legt. –

+0

@ Frédéric MS schlägt jedoch vor, diese Einstellung trotzdem auf ON zu setzen (https://msdn.microsoft.com/en-us/library/ms190306.aspx). Also, ich denke nicht, dass es eine schlechte Sache ist, das zu tun, was ich getan habe. Außerdem enthält die Abfrage eine Volltextsuchabfrage, und die meisten Volltextindizes sind zu mehr als 70% in der Datenbank fragmentiert (das passiert, wenn Sie ein System ohne DBA ausführen ...). Die gleiche Abfrage, ohne den Volltextsuchteil lief schnell, also denke ich F.T.S. Was hat den Unterschied gemacht? Unsere Indizes für Nicht-Volltextsuche MÜSSEN zwar angepasst werden, aber ich glaube nicht, dass sie hier die Ursache waren. :) – user2173353

+0

Es zu "on" zu haben, ist keine schlechte Sache, gewährt, aber zu glauben, dass es die Probleme, die Sie angetroffen haben, tatsächlich vollständig löst, ist wahrscheinlich eine schlechte Sache. Siehe [hier] (/ a/10175455/1178314). In all den Fällen, die ich gesehen habe, war das eigentliche Problem immer ein Index-Problem, nicht nur dieses "ARITHABORT" -Einstellung. –