Class ProxyConnection
- All Implemented Interfaces:
InvocationHandler
PooledConnection. It intercepts Connection.close(),
Connection.abort(java.util.concurrent.Executor), Object.toString(),
PooledConnection.getConnection(), Object.equals(Object) and Object.hashCode().
Method names are compared with String.equals(Object) unless PoolConfiguration.setUseEquals(boolean)
selects reference comparison.
The connection handle implements PooledConnection (and XAConnection for an XA
pool). The pool manages session reuse itself, so the four listener methods are delegated to the driver's XA
connection where one exists, and otherwise fail with an SQLException naming the method rather than accepting
a notification the pool could never deliver faithfully.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected ObjectThe connection handle the current borrow was served under, ornullonce the borrow has ended.protected PooledConnectionThe underlying pooled connection.protected ConnectionPoolThe parent connection pool.Fields inherited from class JdbcInterceptor
ABORT_VAL, CLOSE_VAL, EQUALS_VAL, GETCONNECTION_VAL, HASHCODE_VAL, ISCLOSED_VAL, ISVALID_VAL, ISWRAPPERFOR_VAL, properties, TOSTRING_VAL, UNWRAP_VAL -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedProxyConnection(ConnectionPool parent, PooledConnection con, boolean useEquals) Creates a new ProxyConnection wrapping the given pooled connection. -
Method Summary
Modifier and TypeMethodDescriptionReturns the handle of the borrow this interceptor is armed for.Returns the underlying pooled connection.Returns the delegate pooled connection.Returns the parent connection pool.getPool()Returns the parent connection pool.Gets invoked each time an operation onConnectionis invoked.booleanisClosed()Returns true if the underlying connection has been closed or discarded.booleanisWrapperFor(Class<?> iface) Checks whether this interceptor wraps the given interface.voidreset(ConnectionPool parent, PooledConnection con) 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.voidsetBorrowHandle(Object borrowHandle) Records the handle of the borrow this interceptor serves.voidsetConnection(PooledConnection connection) Sets the underlying pooled connection.voidsetPool(ConnectionPool pool) Sets the parent connection pool.toString()Unwraps the connection to the given interface.Methods inherited from class JdbcInterceptor
compare, compare, disconnected, getNext, getProperties, isUseEquals, poolClosed, poolStarted, setNext, setProperties, setUseEquals, unregisterMBean
-
Field Details
-
connection
The underlying pooled connection. Volatile because writes that end or re-arm a borrow have no synchronization on the reader's side. -
borrowHandle
The connection handle the current borrow was served under, ornullonce the borrow has ended. It is the per-borrow identity that distinguishes a call of the current borrow from a late call of an earlier one. -
pool
The parent connection pool. Volatile because the close and abort branches read it without synchronization; reset writes the session before the pool so a reader never sees a null pool with a live session behind it.
-
-
Constructor Details
-
ProxyConnection
Creates a new ProxyConnection wrapping the given pooled connection.- Parameters:
parent- the parent connection poolcon- the pooled connectionuseEquals- whether to compare method names withString.equals(Object)rather than by reference
-
-
Method Details
-
getConnection
Returns the underlying pooled connection.- Returns:
- the pooled connection
-
setConnection
Sets the underlying pooled connection.- Parameters:
connection- the pooled connection
-
getBorrowHandle
Returns the handle of the borrow this interceptor is armed for.- Returns:
- the current borrow's handle, or
nullonce that borrow has ended - its own close or abort, or a teardown reset - until the recording of the next borrow's handle
-
setBorrowHandle
Records the handle of the borrow this interceptor serves. OnlyConnectionPool.setupConnection(PooledConnection)calls this, with the handle it is about to hand to the borrower.- Parameters:
borrowHandle- the new borrow's handle
-
getPool
-
setPool
Sets the parent connection pool.- Parameters:
pool- the connection pool
-
reset
Description copied from class:JdbcInterceptorGets 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.
Chain topology is owned by the pool: a hook must not callJdbcInterceptor.setNext(JdbcInterceptor)on itself or on any other link while the chain is wired, and in particular not from this callback. The walks that run this callback do not agree on when they read the next link - the walk at borrow time re-reads it after the callback, the shutdown walks read it before - so a hook that rewired its own link would be visited differently depending on which walk runs, and could be skipped or revisited without limit.- Specified by:
resetin classJdbcInterceptor- Parameters:
parent- - the connection pool owning the connectioncon- - the pooled connection
-
isWrapperFor
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 implementsConnectionandPooledConnection(andXAConnectionon XA pools) - is answered by the dispatch ininvoke(Object, Method, Object[]).- Parameters:
iface- the interface to check- Returns:
- true if this interceptor wraps the given interface
-
unwrap
Unwraps the connection to the given interface.- Parameters:
iface- the interface to unwrap to- Returns:
- the unwrapped connection. The pool-internal
PooledConnectiontype is not exposed through the public Wrapper contract. - Throws:
SQLException- if the connection does not wrap the given interface
-
invoke
Description copied from class:JdbcInterceptorGets invoked each time an operation onConnectionis invoked.The base implementation passes the call to the
nextinterceptor in the chain. When there is no next interceptor, the call fails fast with aNullPointerException: a chain built by the pool always ends in theProxyConnectionterminal, so reaching this case means a chain was hand-built without a terminal link. Interceptors that do not answer a call themselves continue it withsuper.invoke(proxy, method, args).- Specified by:
invokein interfaceInvocationHandler- Overrides:
invokein classJdbcInterceptor- Throws:
Throwable
-
isClosed
public boolean isClosed()Returns true if the underlying connection has been closed or discarded.- Returns:
- true if closed or discarded
-
getDelegateConnection
Returns the delegate pooled connection.- Returns:
- the delegate pooled connection
-
getParentPool
Returns the parent connection pool.- Returns:
- the parent connection pool
-
toString
-