Connection Pooling
Using a pooled connection can result in significant performance gains, because
applications can save the overhead involved in making a connection. This can
be particularly significant for middle-tier applications that connect over a
network, or for applications that repeatedly connect and disconnect, such as
Internet applications.
In addition to performance gains, the connection pooling architecture enables
an environment and its associated connections to be used by multiple components
in a single process. This means that standalone components in the same process
can interact with each other without being aware of each other. A connection
in a connection pool can be used repeatedly by multiple applications.
Note Connection pooling can be used by an ODBC application exhibiting ODBC 2.x behavior, as long as the application can call SQLSetEnvAttr. When using connection pooling, the application must not execute SQL
statements that change the database or the context of the database, such as changing
the <database name>, which changes the catalog used by a data source.
The connection pool is maintained by the Driver Manager. Connections are drawn
from the pool when the application calls SQLConnect or SQLDriverConnect, and are returned to the pool when the application calls SQLDisconnect. The size of the pool grows dynamically based upon the requested resource
allocations. It shrinks based on the inactivity timeout: If a connection is
inactive for a period of time (it has not been used in a connection), it is removed
from the pool. The size of the pool is limited only by memory constraints and
limits on the server.
The Driver Manager determines whether a specific connection in a pool should
be used according to the arguments passed in SQLConnect or SQLDriverConnect, and the connection attributes set after the connection was allocated.
To use a connection pool, an application performs the following steps:
1 Enables connection pooling by calling SQLSetEnvAttr to set the SQL_ATTR_CONNECTION_POOLING environment attribute to
SQL_CP_ONE_PER_DRIVER or SQL_CP_ONE_PER_HENV. This call must be made before the application
allocates the shared environment for which connection pooling is to be enabled.
The environment handle in the call to SQLSetEnvAttr should be set to null, which makes SQL_ATTR_CONNECTION_POOLING a
process-level attribute. If the attribute is set to SQL_CP_ONE_PER_DRIVER, a single
connection pool is supported for each driver, and it is not possible to share
connections between environments. If an application works with many drivers and few
environments, this may be more efficient because fewer comparisons may be
required. If set to SQL_CP_ONE_PER_HENV, a single connection pool is supported for each
environment, and it is possible to share connections between environments. If
an application works with many environments and few drivers, this may be more
efficient because fewer comparisons may be required. Connection pooling is
disabled by setting SQL_ATTR_CONNECTION_POOLING to SQL_CP_OFF.
2 Allocates an environment by calling SQLAllocHandle with the HandleType argument set to SQL_HANDLE_ENV. The environment allocated by this call will
be an implicit shared environment because connection pooling has been enabled.
The environment to be used is not determined, however, until SQLAllocHandle with a HandleType of SQL_HANDLE_DBC is called on this environment.
3 Allocates a connection by calling SQLAllocHandle with InputHandle set to SQL_HANDLE_DBC, and the InputHandle set to the environment handle allocated for connection pooling. The Driver
Manager attempts to find an existing environment that matches the environment
attributes set by the application. If no such environment exists, one is created,
with a reference count (maintained by the Driver Manager) of 1. If a matching
shared environment is found, the environment is returned to the application, and
its reference count is incremented.
The actual connection to be used is not determined by the Driver Manager until SQLConnect or SQLDriverConnect is called.
4 Calls SQLConnect or SQLDriverConnect to make the connection. The Driver Manager uses the connection options in the
call to SQLConnect (or the connection keywords in the call to SQLDriverConnect) and the connection attributes set after connection allocation to determine
which connection in the pool should be used.
Note How a requested connection is matched to a pooled connection is determined
by the SQL_ATTR_CP_MATCH environment attribute. For more information, see SQLSetEnvAttr.
5 Calls SQLDisconnect when done with the connection. The connection is returned to the connection
pool, and is available for reuse.