Class ProxyConnection

java.lang.Object
org.apache.tomcat.jdbc.pool.JdbcInterceptor
org.apache.tomcat.jdbc.pool.ProxyConnection
All Implemented Interfaces:
InvocationHandler

public class ProxyConnection extends JdbcInterceptor
A ProxyConnection object is the bottom most interceptor that wraps an object of type PooledConnection. The ProxyConnection intercepts, among the calls it forwards, the following methods: By default method comparisons is done on a String reference level, unless the PoolConfiguration.setUseEquals(boolean) has been called with a true argument.

The connection handle the pool hands out implements PooledConnection (and XAConnection when the pool is backed by an XADataSource). The pool keeps no connection or statement event listeners of its own, so the four listener methods of javax.sql.PooledConnection - addConnectionEventListener, removeConnectionEventListener, addStatementEventListener and removeStatementEventListener - are answered by the XA-family dispatch in invoke(Object, Method, Object[]): where the handle is itself an XAConnection they reach the XA connection the driver created, whose implementation decides what registering them means; where it is not, the call has no dispatch target and each of the four fails with an SQLException naming the method. The refusal also stands on a pool backed by a ConnectionPoolDataSource: the pool does hold the driver's own pooled connection there, but it holds it for its own session management and does not route these calls to it. A handle whose session the pool discarded while it was still borrowed, or which its borrower has already closed, answers instead with the closed-connection failure the handle gives in those states. Either failure reaches a caller of the interface - the interface declares no checked exception - as an UndeclaredThrowableException carrying it. That refusal is deliberate rather than unfinished work. The specification has the connection pool manager register through these methods, to be told to deactivate the logical handle and reuse or retire the physical session - decisions this pool makes and carries out itself: close() on the handle recycles a session that stays open and owned by the pool, and the next borrower is handed a new handle, so this handle is not the long-lived producer object whose listener list the specification describes; and where the pool does not observe statements - as it does not by default - a statementClosed event has no point from which it could be delivered. Accepting a registration it could not notify faithfully would only hide from the caller that no notification will ever arrive.

  • Field Details

    • connection

      protected PooledConnection connection
      The underlying pooled connection.
    • pool

      protected ConnectionPool pool
      The parent connection pool.
  • Constructor Details

    • ProxyConnection

      protected ProxyConnection(ConnectionPool parent, PooledConnection con, boolean useEquals)
      Creates a new ProxyConnection wrapping the given pooled connection.
      Parameters:
      parent - the parent connection pool
      con - the pooled connection
      useEquals - whether to use equals for method comparison
  • Method Details

    • getConnection

      public PooledConnection getConnection()
      Returns the underlying pooled connection.
      Returns:
      the pooled connection
    • setConnection

      public void setConnection(PooledConnection connection)
      Sets the underlying pooled connection.
      Parameters:
      connection - the pooled connection
    • getPool

      public ConnectionPool getPool()
      Returns the parent connection pool.
      Returns:
      the connection pool
    • setPool

      public void setPool(ConnectionPool pool)
      Sets the parent connection pool.
      Parameters:
      pool - the connection pool
    • reset

      public void reset(ConnectionPool parent, PooledConnection con)
      Description copied from class: JdbcInterceptor
      Gets called each time the connection is borrowed from the pool This means that if an interceptor holds a reference to the connection the interceptor can be reused for another connection.
      This method may be called with null as both arguments when we are closing down the connection. When called for a shutdown reset, an interceptor that throws is isolated: the exception is logged and ignored, and the remaining interceptors in the chain are reset as well.
      Specified by:
      reset in class JdbcInterceptor
      Parameters:
      parent - - the connection pool owning the connection
      con - - the pooled connection
    • isWrapperFor

      public boolean isWrapperFor(Class<?> iface)
      Checks whether this interceptor wraps the given interface. This is the view from the interceptor itself; the contract of the connection handle the pool hands out - which also implements Connection and PooledConnection (and XAConnection on XA pools) - is answered by the dispatch in invoke(Object, Method, Object[]).
      Parameters:
      iface - the interface to check
      Returns:
      true if this interceptor wraps the given interface
    • unwrap

      public Object unwrap(Class<?> iface) throws SQLException
      Unwraps the connection to the given interface.
      Parameters:
      iface - the interface to unwrap to
      Returns:
      the unwrapped connection. For PooledConnection this is the pool's own pooled connection - a pool-internal object meant for trusted callers such as interceptors, not for application code, as it can close and discard the connection behind the pool's own accounting.
      Throws:
      SQLException - if the connection does not wrap the given interface
    • invoke

      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
      Description copied from class: JdbcInterceptor
      Gets invoked each time an operation on Connection is invoked.
      Specified by:
      invoke in interface InvocationHandler
      Overrides:
      invoke in class JdbcInterceptor
      Throws:
      Throwable
    • isClosed

      public boolean isClosed()
      Returns true if the underlying connection has been closed or discarded.
      Returns:
      true if closed or discarded
    • getDelegateConnection

      public PooledConnection getDelegateConnection()
      Returns the delegate pooled connection.
      Returns:
      the delegate pooled connection
    • getParentPool

      public ConnectionPool getParentPool()
      Returns the parent connection pool.
      Returns:
      the parent connection pool
    • toString

      public String toString()
      Overrides:
      toString in class Object