1. #1
    SideShow's Avatar
    Registered
    21/08/02
    Location
    Roeselare
    Posts
    4,474
    iTrader
    15 (100%)
    Mentioned
    0 Post(s)
    Reputation
    1/35

    C# - Sql transactie vanuit threadpool

    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.
    Last edited by SideShow; 05-10-2011 at 15:46.
    no votes  

  2. #2
    SideShow's Avatar
    Registered
    21/08/02
    Location
    Roeselare
    Posts
    4,474
    iTrader
    15 (100%)
    Mentioned
    0 Post(s)
    Reputation
    1/35
    Volledige class hier te vinden: CodePaste.NET -
    no votes  

  3. #3
    SideShow's Avatar
    Registered
    21/08/02
    Location
    Roeselare
    Posts
    4,474
    iTrader
    15 (100%)
    Mentioned
    0 Post(s)
    Reputation
    1/35
    Oplossing is blijkbaar om threads geen shared objects te laten gebruiken, en dus elke thread zijn eigen sqlcommand te geven.
    no votes  

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Log in

Log in