sql >> Database >  >> RDS >> Sqlserver

Hoe reinig ik SqlDependency van SQL Server-geheugen?

Er is een specifiek gedrag van de Microsoft SqlDependency-klasse. Ook al roept u de SqlDependency.Stop() methode aan, laat SqlCommand en SqlConnection vrij - het houdt nog steeds gespreksgroepen (sys.conversation_groups) en gesprekseindpunten (sys.conversation_endpoints) in de database. Het lijkt erop dat SQL Server elk gesprekseindpunt laadt en al het toegestane geheugen gebruikt. Hier testen die het bewijzen. Dus om alle ongebruikte gesprekseindpunten op te schonen en al het bezette geheugen vrij te geven, moet u deze SQL-code voor uw database starten:

DECLARE @ConvHandle uniqueidentifier
DECLARE Conv CURSOR FOR
SELECT CEP.conversation_handle FROM sys.conversation_endpoints CEP
WHERE CEP.state = 'DI' or CEP.state = 'CD'
OPEN Conv;
FETCH NEXT FROM Conv INTO @ConvHandle;
WHILE (@@FETCH_STATUS = 0) BEGIN
    END CONVERSATION @ConvHandle WITH CLEANUP;
    FETCH NEXT FROM Conv INTO @ConvHandle;
END
CLOSE Conv;
DEALLOCATE Conv;

Ook geeft SqlDependency u niet de mogelijkheid om ALLE wijzigingen van de tabel te ontvangen. U ontvangt dus geen melding over wijzigingen tijdens het herinschrijven van SqlDependency.

Om al deze problemen te vermijden, had ik een andere open source-realisatie van de SqlDependency-klasse gebruikt - SqlDependencyEx . Het maakt gebruik van databasetrigger en native Service Broker-melding om gebeurtenissen over wijzigingen van de tabel te ontvangen. Dit is een gebruiksvoorbeeld:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

Ik hoop dat dit helpt.




  1. Hulp bij Mysql-subquery

  2. Sql-query's die variabelen binden versus ze specificeren

  3. Hoe selecteer je alle kolommen, plus het resultaat van een CASE-statement in orakel 11g?

  4. Hiërarchische query's in SQL Server 2005