i've got program send's multiple request in parallel sql server instance. of concurrent requests, 1 of them block few seconds on db.open().
void mymethod() { var brands = new list<string>{"chevy", "honda", "ford", "gm"}; var foundcars = new concurrentbag<car>(); parallel.foreach(brands, brand => { logger.trace(brand + " before enqueue"); foundscars.enqueue(findcar(brand)); logger.trace(brand + " after enqueue"); }); } public car findcars(string brand) { using (var db = new sqlconnection(connectionstring)) { sqllogger.trace("brand " + " brand " + " before db open"); db.open(); sqllogger.trace("brand " + " brand " + " after db open"); using (var cmd = new sqlcommand(sqlcmd, db)) { while (reader.read()) { //sql select stuff going on } } } } if i'd in trace i'd see this, order depends on db response time guess, in scenario honda data being processed not be:
12:00:00.0000 chevy before enqueue 12:00:00.0000 honda before enqueue 12:00:00.0000 ford before enqueue 12:00:00.0000 gm before enqueue 12:00:00.0200 brand chevy before db open 12:00:00.0300 brand honda before db open 12:00:00.0200 brand ford before db open 12:00:00.0200 brand gm before db open 12:00:00.0300 brand chevy after db open 12:00:00.0300 brand ford after db open 12:00:00.0300 brand gm after db open 12:00:00.0400 chevy after enqueue 12:00:00.0400 ford after enqueue 12:00:00.0400 gm after enqueue 12:00:07.0000 brand honda after db open <-- around 7 seconds late 12:00:07.0100 honda after enqueue i can't seem replicate problem locally on sql server 2008 instance, happens time on sql server 2012 instance. issue seems configuration problem. happen when send concurrent requests , whatever select request is. if blocking query in sql server management, return in sub 100ms.
here connection string:
<add key="sqlconnectionstring" value="data source=10.0.20.20;initial catalog=carsdb;integrated security=sspi;connection timeout=240;" /> edit:
i have insert "min pool size=30" in connection string, seems first, second or third time method hit runs in +15 seconds, other method calls sub 500ms.
i've got sql server 2012 running in our test environement same meta data in tables issue seen, , can't replicate problem. seems configuration problem somewhere.
unless have partitioned table insane
parallel.foreach(brands, brand => { logger.trace(brand + " before enqueue"); foundscars.enqueue(findcar(brand)); logger.trace(brand + " after enqueue"); }); multiple connections going after same table not faster let alone overhead of multiple connections. on other end have single physical read write head. not open , close connection takes way way longer simple read? line table , read it. reader very fast.
Comments
Post a Comment