2017-03-28 9 views
2

Ich habe eine CLR-DLL (Quellcode in C# geschrieben), die in SQL Server geladen wird. Der Initialisierungsprozess ist teuer, also ist es etwas, was ich normalerweise nur einmal tun möchte. Es gibt jedoch Zeiten, in denen es erforderlich sein könnte, erneut zu initialisieren, und ich möchte SQL Server dazu nicht neu starten müssen. Als solche habe ich nicht markiert diese statischen Variablen als schreibgeschützt. Mein Problem ist, dass meine statischen Variablen auf scheinbar zufällige Weise auf null zurückgesetzt werden. Ich bin ziemlich sicher, dass ich keine Threading-Probleme habe und keiner meiner Code diese Werte auf null setzt. Wenn ich meine Protokolldateien analysiere, kann ich nur raten, dass SQL Server die Werte irgendwie auf null zurücksetzt (vielleicht wird die DLL manchmal neu geladen?). Führt SQL Server das aus? Wenn ja, gibt es eine Möglichkeit, es nicht zu konfigurieren?SQL Server CLR statische Variablen zurückgesetzt auf Null

+3

Die Beschreibung ist fast das Gegenteil von dem, was eine SQLCLR-Funktion oder ein Aggregat sein sollte. Eine SQLCLR-Klasse wird im SQL Server-Speicherbereich ausgeführt, wobei das SQL Server-Threading verwendet wird. Der Lebenszyklus wird von SQL Server gesteuert. Daher sollte es * keine teure Initialisierung durchführen oder erfordern. Es sollte * überhaupt keine statischen Variablen haben. Es * sollte nicht * Speicher verschwenden, der zum Zwischenspeichern von Daten verwendet werden könnte. Mit anderen Worten, Sie haben Threading-Probleme, aber das sind wahrscheinlich die geringsten Ihrer Probleme –

+2

Wo ist der Code und was versucht es zu tun? Warum benötigt eine SQLCLR-Assembly irgendeine Art von Initialisierung? Es ist unmöglich, ohne den Code zu helfen, abgesehen davon, dass SQLCLR-Klassen nicht so funktionieren sollen. –

+0

Dieser Code wendet sich an den Schlüsselmanager, um kryptografische Schlüssel zu exportieren. Ich speichere die Schlüssel im Speicher, um den Schlüsselverwalter nicht wiederholt zu erreichen (weil das der teure Prozess ist). Leider darf ich keinen Code von diesem bestimmten Projekt posten. – Hmmmmm

Antwort

2

SQL Server lädt und entlädt CLR-Module nach Bedarf (unter Speicherdruck, im Falle einer nicht behandelten Ausnahme, more on it here). Selbst wenn Sie in der Lage wären, alle damit verbundenen Bedingungen und Timings zu verstehen, wird sich dies wahrscheinlich auch in zukünftigen Versionen ändern.

Größere Datenmengen werden nicht gut skaliert. Schreiben Sie einen Windows-Dienst dafür und rufen Sie ihn über tcp (z. B.) von Ihrer verwalteten UDF ab. Wenn Sie einen In-Process-Status benötigen, verwenden Sie einen permanenten Caching-Mechanismus anstelle von statischen Variablen (die Datenbank, das Dateisystem) - oder antizipieren Sie, dass Statiken jederzeit null werden können, und initialisieren Sie sie immer dann, wenn nichts passiert mit diesem Ansatz per se, abgesehen von der Skalierbarkeit Problem und Nebenläufigkeit/Synchronisation.

Verwandte Themen