Rather than setting up a new TCP connection on each request,
a new connection is set up only when one is not available in the connection
pool. When the connection is closed, it is returned to the pool where it
remains connected to the database, as opposed to completely tearing down that
TCP connection.
No matter what anyone says about garbage collection within
the Microsoft .NET Framework, always call Close or Dispose explicitly on your
connection when you are finished with it. Do not wait for CLR to close the
connection for you; you have no guarantee when garbage collection will happen!
To use connection pooling optimally, there are a couple of
rules to live by. First, open the connection, do the work, and then close the
connection. It is okay to open and close the connection multiple times on each
request if you have to (optimally you apply Tip 1) rather than keeping the
connection open and passing it around through different methods. Second, use
the same connection string (and the same thread identity if you are using
integrated authentication). If you do not use the same connection string, for
example customizing the connection string based on the logged-in user, you will
not get the same optimization value provided by connection pooling. And if you
use integrated authentication while impersonating a large set of users, your
pooling will also be much less effective. The .NET CLR data performance
counters can be very useful when attempting to track down any performance
issues that are related to connection pooling.