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:
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.
Links naar code op externe sites hebben we hier liever niet
Ik heb een logger klasse, die logt naar SQL server. Elke Log() aanroep zet gewoon 1 record in een logtabel.
Dit is de code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| 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.
Links naar code op externe sites hebben we hier liever niet
[ Voor 2% gewijzigd door Woy op 05-10-2011 14:57 ]