Connection pooling enables an application to use a connection from a
pool of connections that do not need to be reestablished for each use. Once a connection
has been created and placed in a pool, an application can reuse that connection without
performing the complete connection process.
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 stand-alone 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 components.
The connection pool is maintained by the Driver Manager. Connections are
drawn from the pool when the application calls f90SQLConnect or f90SQLDriverConnect,
and are returned to the pool when the application calls f90SQLDisconnect. 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 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. This is done based on the arguments passed in f90SQLConnect
or f90SQLDriverConnect and the connection attributes set after the connection was
allocated.
When the Driver Manager is pooling connections, it needs to be able to
determine if a connection is still working before handing the connection out. Otherwise,
the Driver Manager keeps on handing out the dead connection to the application whenever a
transient network failure occurs. In ODBC 3.5 a new connection attribute,
SQL_ATTR_CONNECTION_DEAD, has been defined. This is a read-only connection attribute that
returns either SQL_CD_TRUE or SQL_CD_FALSE. The value SQL_CD_TRUE means that the
connection has been lost, while the value SQL_CD_FALSE means that the connection is still
alive.
To use a connection pool, an application performs the following steps:
- Enables connection pooling by calling f90SQLSetEnvAttr 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. The environment handle in the call to f90SQLSetEnvAttr should be set to null.
This 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. 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. 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.
- Allocates an environment by calling f90SQLAllocHandle with the HandleType
argument set to SQL_HANDLE_ENV. The environment allocated by this call will be an implicit
shared environment since connection pooling has been enabled. The environment to be used
is not determined, however, until f90SQLAllocHandle with a HandleType of
SQL_HANDLE_DBC is called on this environment.
- Allocates a connection by calling f90SQLAllocHandle with HandleType
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 f90SQLConnect or f90SQLDriverConnect is called.
- Call f90SQLConnect or f90SQLDriverConnect to make
the connection. The Driver Manager uses the connection options in the call to f90SQLConnect
(or the connection keywords in the call to f90SQLDriverConnect) and the connection
attributes set after connection allocation to determine which connection in the pool
should be used. How a requested connection is matched to a pooled connection is determined
by the SQL_ATTR_CP_MATCH environment attribute. For more information, see f90SQLSetEnvAttr.
- Call f90SQLDisconnect when done with the connection. The
connection is returned to the connection pool and becomes available for reuse.