OK, I see your problem, and it dosen't has to do with web service calls! You
are creating database connections based on the connection strings delivered
as web method parameters, and use these connections for database
synchronization. Since these operations usually take some time to complete,
and since you have a lot of consumers, you quickly get into the situation of
having some hundreds of open database connections with sync operations
running over them, which is quite expensive in terms of memory and processing
time.
I would guess that the web service gets only a limited number different
connection strings, so I would put them in the web.config. Then I would use
the Application_Start event handler in global.asax to initialize one instance
for each of these connections, and taking care that the connections are
pooled. Then I'd change the web method, so insetead of the connection string,
I'd have an identifier for the connection pool. The web method implementation
would select the apropriate connection pool from the Application, based on
the provided identifier, and use the pool as you do it now. Las, I'd place
cleanup code in the Application_End event handler to close the connection
pools.
This way you use just a limited number of connections, which are also pooled.
Hope it helps!