Frage

Ich arbeite an einer Anwendung ASP.net in C # geschrieben mit SQL Server 2000-Datenbank. Wir haben mehrere PDF-Berichte, die Kunden für ihre Geschäftsanforderungen nutzen. Das Problem ist, diese Berichte eine Weile dauern, zu erzeugen (> 3 Minuten). Was in der Regel endet geschieht, wenn der Benutzer den Bericht fordert die Anforderung Timeout der Anforderung tötet, bevor der Web-Server Zeit, um den Bericht zu beenden hat Erzeugung, so dass der Benutzer bekommt nie eine Chance, um die Datei herunterzuladen. Dann wird der Benutzer die Seite aktualisieren und versuchen Sie es erneut, die den gesamten Bericht Erzeugungsprozess beginnt immer und immer noch landet ein Timeout. (Nein, wir sind keine Berichte jetzt das Caching, das ist etwas, das ich hart für mich drängen ...).

Wie gehen Sie diese Szenarien? Ich habe eine Idee in meinem Kopf, die eine aysnchronous Anfrage beinhaltet das Herstellen der Berichterstellung zu starten und dann einige Javascript muss in regelmäßigen Abständen den Status zu überprüfen. Sobald der Status anzeigt, wird der Bericht beendet dann einen separaten Antrag für die eigentliche Datei.

Gibt es eine einfachere Art und Weise, die ich zu sehen bin nicht?

War es hilfreich?

Lösung

Mit dem Dateisystem hier ist wahrscheinlich eine gute Wette. Haben Sie eine Anfrage, die sofort eine URL auf den Bericht pdf Standort zurückkehrt. Der Server kann dann entweder einen externen Prozess beginnen oder eine Anforderung an sich selbst senden, um die Berichterstattung zu erfüllen. Der Kunde kann sich fragen den Server (mit http HEAD) für die PDF an der angegebenen URL. Wenn Sie den Dateinamen der PDF ergeben sich aus den Berichtsparameter machen, entweder durch einen Hash oder direkt die Parameter in den Namen setzen werden Sie auch Instant-Server seitiges Caching erhalten.

Andere Tipps

Ich würde diesen Bericht irgendwie ein wenig mehr offline von der Verarbeitungs Sicht zu machen.

Wie eine Warteschlange Erstellen in Berichtsanforderungen zu stellen, verarbeiten die Berichte von dort und nach dem Finish, kann er eine Nachricht an den Benutzer senden.

Vielleicht würde ich sogar einen separaten Windows-Dienst für die Bearbeitung der Warteschlange erstellen.

Update:. für den Benutzer zu senden E-Mail sein kann, oder sie können eine ‚Bericht‘ Seite haben, wo sie ihre Berichte Status überprüfen und sie herunterladen, wenn sie bereit sind,

Ihre Benutzer mit diesem Ansatz nicht akzeptieren können, aber:

Wenn sie einen Bericht (durch Klicken auf eine Schaltfläche oder einen Link oder was auch immer) fordern, könnten Sie die Reportgenerierung auf einem separaten Thread starten, und Umleiten den Benutzer auf eine Seite, die sagt: „Danke, Ihr Bericht wird Sie gemailt, in wenigen Minuten“.

Wenn der Faden des Berichts erfolgt zu erzeugen, können Sie die PDF direkt per E-Mail (wird wahrscheinlich nicht wegen der Größe arbeiten) oder den Bericht auf dem Server speichern und einen Link zu dem Benutzer eine E-Mail.

Alternativ können Sie in IIS gehen und das Timeout> 3 Minuten erhöhen.

Hier einige der Dinge, die ich tun würde, wenn ich dieses Problem vorgestellt würde:

1- jenen Timeout Stop! Sie sind eine totale Verschwendung von Ressourcen. (Bringen Sie den Timeout-Wert von ASP-Seiten nach oben)

2- Zentralisieren alle DB-Zugriff in einem einzigen Punkt, dann sammeln Statistiken über welche Berichte liefen, wenn sie von wem und wie viel Zeit es dauerte. Untersuchen, warum es so lange dauert, ist es wegen der Komplexität Bericht? Datenreichweite? Serverbelastung? (Sie können alle schreiben eigentlich, dass auf einer CSV-Datei auf dem Server und importieren Sie diese Datei in regelmäßigen Abständen in dem SQL-Server später zu analysieren).

Schließlich, es wird leichter für Sie zu „Cache“, berichtet, wenn Sie diesen einzigen Zugangspunkt durchlaufen (zB gleiche Abfrage gleichen Datum werden gleiche PDF zurückkehren zuvor generierten)

3 Ich weiß, das ist wirklich nicht die Frage war, aber haben Sie versucht, tauchen in diese Abfragen, um zu sehen, warum sie so lange laufen zu lassen? Abfrageoptimierung vielleicht?

4- Email / SMS / Meldung auf dem Bildschirm, wenn Bericht fertig ist groß scheint ..., wenn Ihr Benutzer im Allgemeinen einen Stapel von Bericht sendet vielleicht ein wenig Armaturenbrett „ihre“ Warteschlange angibt Progression erzeugt werden kann in der App gebaut werden . Eine kleine Ajax-Steuerung würde in regelmäßigen Abständen den Status aktualisieren ..    . Hinweis: Wenn Sie verwenden den zentralen DB-Zugriff und Sie haben genügend Informationen über das, was läuft, wenn, warum und wie lange werden Sie schließlich in der Lage sein, um in etwa die Zeit schätzt es dauern wird für einen Bericht auszuführen

Wenn die Antwortzeit Mission kritisch ist, sollten bestimmte Benutzer im Datenbereich (Datumsbereich zum Beispiel) begrenzt werden, während einiger Stunden des Tages?

Viel Glück und bitte mehr Details zu Ihrem Szenario abgeben Sie genauere Hinweise zu bekommen ...

zur Abfrageoptimierung ist wahrscheinlich die beste Wahl zu starten. Obwohl ich Ihnen nicht wissen, den Bericht zu erzeugen, sollte dieser Schritt nicht wirklich nehmen, dass alle lang. Eine schlecht funktionierende Abfrage auf der anderen Seite konnte absolut Ihre Leistung töten.

Je nachdem, was Sie finden bei der Abfrage in suchen, können Sie einige Indizes hinzufügen müssen, oder möglicherweise sogar eine Tabelle zu speichern, die Informationen für den Bericht in einer denormalisierter Art und Weise eingerichtet, damit es schneller verfügbar. Diese normalisierte Tabelle könnte dann aufgefrischt werden (über einen SQL Server Job) jede Stunde, oder mit dem, was Frequenz Ihre Anforderungen diktieren (innerhalb Grund).

Wenn sein ein relativ statischer Bericht, ohne Parameter Benutzereingabe ändert, dann Caching des Bericht läuft früher am Tag als auch eine gute Idee wäre, aber sein harte darüber mehr zu sagen, ohne Ihre Situation zu kennen.

Für ein Problem wie dieses Sie wirklich brauchen, um die Datenbank zu starten, wenn Sie Grund haben Ihren Bericht Erzeugungs Code des Seins der Täter zu vermuten. Es gibt verschiedene Pflastern Sie, dass für eine Weile helfen könnten nutzen könnten, aber wenn Ihr db die Ursache ist, dann werden diese Lösungen nicht gut skalieren, und Sie werden wahrscheinlich ähnliche Probleme (oder schlechter) einige Zeit in der Zukunft .

Was ist mit dem Bericht an den Benutzer per E-Mail. Alle ASP-Seite tun sollten, ist die Anfrage senden, um den Bericht zu erstellen und eine Meldung zurück, dass der Bericht geschickt wird nachdem es beendet ausgeführt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top