Abfrage hat einen Zeitüberschreitungsfehler in NHibernate, aber nicht in SQL Server

8

Ich habe ein Problem mit NHibernate in C #.

Wenn die Abfrage mit einem ADO-Zeitüberschreitungsfehler ausgeführt werden soll, wenn ich eine Abfrage ausführen möchte, aber wenn ich SQL Profiler verwende, um die Abfrage zu erfassen, und dann in einer neuen Abfrage von SQL Server, dauert es nur 2 Sekunden

Irgendwelche Ideen ??

    
Javid_p84 25.12.2010, 13:32
quelle

2 Antworten

9

Wenn Sie die Abfrage von SQL Profiler erfassen und in SSMS ausführen, führen Sie sie als sp_executesql-Abfrage aus? Ich stieß auf ein ähnliches Problem mit NHibernate 2.1GA und diese Antwort gilt für diese Version, ich habe noch nicht zu NH3 konvertiert. NH Profiler ist ein großartiges Werkzeug, aber es extrahiert das SQL in eine formatierte Abfrage, die nicht die eigentliche Abfrage darstellt, die an den Server gesendet wird.

Das Problem ist die Art und Weise, wie NHibernate String-Parameter für sp_executesql bereitstellt. String-Parameter werden als nvarchar mit einer Länge eingegeben, die der Länge des Werts entspricht. Diese Abfrage beschränkt beispielsweise zwei Spalten, die varchar (4) bzw. varchar (20) sind:

%Vor%

Der Abfrageplan hierfür verwendete einen Index-Scan und dauerte 17 Sekunden. Durch das Ändern von nvarchar in varchar wurde ein Plan generiert, der eine Indexsuche verwendete und in & lt; 2 Sek. Dies war in SSMS reproduzierbar.

Die Ursache war, dass NHbnerate DbType.String anstelle von DbType.AnsiString für varchar-Spalten standardmäßig verwendet. Die Lösung für mich bestand darin, eine Fluent NHibernate-Konvention hinzuzufügen, um alle Zeichenfolgenzuordnungen in AnsiString zu ändern, was dazu führte, dass NHibernate Abfragen erstellte, die Parameter als varchar lieferten.

    
Jamie Ide 27.12.2010 16:27
quelle
4

Nun, ich habe gesehen, nhibernate Timeouts auftreten, wenn Sie mit einer Transaktion, die noch nicht in der Datenbank engagiert ist und mit einer anderen Transaktion, die auf dem gleichen Objekt arbeitet behandeln .. so würde ich vorschlagen, achten Sie auf mehrere Sitzungen poen in Ihrem App und stelle sicher, dass das nicht der Fall ist und benutze nur 1 ..

und auch nhibernate profile ist etwas, das ich auch vorschlagen würde .. Ссылка Es ist ein cooles Tool zu haben .. es zeigt tatsächlich die Abfrage gefeuert auf die db und die Zeilen abgerufen und ist sehr einfach zu verwenden .. Alles was Sie tun müssen, ist die Verbindungszeichenfolge auf die dB, die ur die Abfrage gegen und ausgeführt wird Sie können alle Ihre Abfragen sehen und Sie können sich von SQL Profiler verabschieden.

Ich hoffe, das hilft.

    
Baz1nga 25.12.2010 21:31
quelle

Tags und Links