A connection is required to send commands and receive answers, usually in the form of a result set.
Once a connection has been built it can be opened and closed at will, and properties (such as the command time-out length, or transaction, if one exists) can be set.
Database connections are finite and expensive and can take a disproportionately long time to create relative to the operations performed on them.
The application need not be aware of the connection pooling when it calls the methods on the wrapper object.
For example, the application may use a connection for too long when too many clients attempt to access the web site or one or more operations are blocked or simply inefficient.