Archief - C# - Sql transactie vanuit threadpool

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

SideShow

Legacy Member
Hallo

Ik heb een logger klasse, die logt naar SQL server. Elke Log() aanroep zet gewoon 1 record in een logtabel.

Dit is de code:

Code:
        public void Log(...args...)
        {
            _sqlCommand.Parameters[0].Value = Guid.NewGuid();
            ...

            for (int i = 0; i < 100; i++)
                ThreadPool.QueueUserWorkItem(ThreadPoolCallback);
        }

        private void ThreadPoolCallback(Object threadContext)
        {
            using (var sqlConnection = new SqlConnection(_connectionString))
            {
                try
                {
                    _sqlCommand.Connection = sqlConnection;
                    sqlConnection.Open();
                    _sqlCommand.ExecuteNonQuery();
                }
                finally
                {
                    sqlConnection.Close();
                }
            }
        }

Om het systeem performant te houden, en niet-UI-gerelateerde zaken asynchroon te doen, wil ik van de eerste keer ook testen hoe performant dit is, door bij wijze van test 100 taken toe te voegen aan de threadpool.

_sqlCommand is een private class field en er wordt steeds een nieuwe connectie gemaakt: gezien de connectie met sql server toch standaard via een connectionpool gebeurt, kan dit geen probleem opleveren, dacht ik.

Het probleem is dat dit meestal enkele keren lukt, er komen dus enkele (tientallen) records bij in mijn logtabel, maar dan vliegt hij eruit. Ofwel gaat hij plots zeggen dat de connectie niet kan geopend worden omdat ze nooit gesloten werd, ofwel gaat hij zeggen dat de huidige state = connecting is, of een nullreference zou hij ook durven doen tijdens de ExecuteNonQuery.

Iemand een idee?

Btw, ik heb geen catch omdat unhandeld exeptions normaal gezien gewoon in de eventlog komen van de server (ze moeten zeker niet opgegooid worden naar UI gerelateerde code), maar ik heb wel een finally blok nodig, dacht ik.

SideShow

Legacy Member
Oplossing is blijkbaar om threads geen shared objects te laten gebruiken, en dus elke thread zijn eigen sqlcommand te geven.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan