Class AOPool<C extends AutoCloseable,E extends Throwable,I extends Throwable>
- java.lang.Object
-
- java.lang.Thread
-
- com.aoindustries.io.AOPool<C,E,I>
-
- All Implemented Interfaces:
Runnable
public abstract class AOPool<C extends AutoCloseable,E extends Throwable,I extends Throwable> extends Thread
Reusable generic connection pooling with dynamic flaming tiger feature.Two lists of connections are maintained. The first is the list of connections that are ready unused, and the second is the list of connections that are currently checked-out. By using this strategy, an available connection can be found without searching the entire list.
In addition to the global lists, a
ThreadLocallist of connections checked-out by the current thread is maintained. When getting a new connection, this is used to check againstmaxConnectionsinstead of checking the global lists.Idea: Add some sort of thread-connection affinity, where the same connection slot will be used by the same thread when it is available. This should help cache locality.
Idea: Automatically connect ahead of time in the background. This could hide connection latency on first-use.
- Author:
- AO Industries, Inc.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class java.lang.Thread
Thread.State, Thread.UncaughtExceptionHandler
-
-
Field Summary
Fields Modifier and Type Field Description static intDEFAULT_CONNECT_TIMEOUTstatic intDEFAULT_DELAY_TIMEstatic longDEFAULT_MAX_CONNECTION_AGEstatic intDEFAULT_MAX_IDLE_TIMEstatic intDEFAULT_SOCKET_SO_LINGERprotected LoggerloggerAll warnings are sent here if available, otherwise will be written toSystem.err.static longUNLIMITED_MAX_CONNECTION_AGE-
Fields inherited from class java.lang.Thread
MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY
-
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Deprecated Methods Modifier and Type Method Description voidclose()Shuts down the pool, exceptions during close will be logged as a warning and not thrown.protected abstract voidclose(C conn)Closes the underlying connection.intgetConcurrency()Gets the number of connections that are currently busy.CgetConnection()Gets either an available connection or creates a new connection, warning when a connection is already used by this thread.CgetConnection(int maxConnections)Gets either an available connection or creates a new connection.intgetConnectionCount()Gets the number of connections currently connected.protected abstract CgetConnectionObject()Creates a new connection.longgetConnects()Gets the total number of connects for the entire pool.LoggergetLogger()intgetMaxConcurrency()Gets the maximum number of connections that have been busy at once.longgetMaxConnectionAge()Gets the maximum age for connections.intgetPoolSize()Gets the maximum number of connections the pool will create at once.longgetTotalTime()longgetTransactionCount()protected abstract booleanisClosed(C conn)Determine if the underlying connection is closed.protected voidlogConnection(C conn)Perform any connection logging beforeresetConnection(java.lang.AutoCloseable)and/orclose(java.lang.AutoCloseable).protected abstract EnewException(String message, Throwable cause)protected abstract InewInterruptedException(String message, Throwable cause)protected voidprintConnectionStats(Appendable out, boolean isXhtml)Prints additional connection pool details.voidprintStatisticsHTML(Appendable out)Deprecated.Please specify if is HTML or XHTMLvoidprintStatisticsHTML(Appendable out, boolean isXhtml)Prints complete statistics about connection pool use.protected voidrelease(C connection)Releases the databaseConnectionto theConnectionpool.voidreleaseConnection(C connection)Deprecated.Please release to the pool by closing the connection, preferably via try-with-resources.protected abstract voidresetConnection(C conn)Resets the given connection for release back to the pool.voidrun()The RefreshConnection thread polls every connection in the connection pool.-
Methods inherited from class java.lang.Thread
activeCount, checkAccess, clone, countStackFrames, currentThread, destroy, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, start, stop, stop, suspend, toString, yield
-
-
-
-
Field Detail
-
DEFAULT_DELAY_TIME
public static final int DEFAULT_DELAY_TIME
- See Also:
- Constant Field Values
-
DEFAULT_MAX_IDLE_TIME
public static final int DEFAULT_MAX_IDLE_TIME
- See Also:
- Constant Field Values
-
UNLIMITED_MAX_CONNECTION_AGE
public static final long UNLIMITED_MAX_CONNECTION_AGE
- See Also:
- Constant Field Values
-
DEFAULT_MAX_CONNECTION_AGE
public static final long DEFAULT_MAX_CONNECTION_AGE
- See Also:
- Constant Field Values
-
DEFAULT_CONNECT_TIMEOUT
public static final int DEFAULT_CONNECT_TIMEOUT
- See Also:
- Constant Field Values
-
DEFAULT_SOCKET_SO_LINGER
public static final int DEFAULT_SOCKET_SO_LINGER
- See Also:
- Constant Field Values
-
logger
protected final Logger logger
All warnings are sent here if available, otherwise will be written toSystem.err.
-
-
Method Detail
-
close
protected abstract void close(C conn) throws E extends Throwable
Closes the underlying connection. The connection may or may not already have been reset. The connection may or may not already be closed.Please note, this is distinct from the implementation of
AutoCloseablefor use in try-with-resources.
-
close
public final void close()
Shuts down the pool, exceptions during close will be logged as a warning and not thrown.
-
getConcurrency
public final int getConcurrency()
Gets the number of connections that are currently busy.
-
getConnectionCount
public final int getConnectionCount()
Gets the number of connections currently connected.
-
getConnection
public C getConnection() throws I extends Throwable, E extends Throwable
Gets either an available connection or creates a new connection, warning when a connection is already used by this thread.If all the connections in the pool are busy and the pool is at capacity, waits until a connection becomes available.
- Returns:
- Either a reused or new connection
- Throws:
I- when interruptedE- when an error occurs, or when a thread attempts to allocate more than half the poolI extends Throwable- See Also:
getConnection(int),AutoCloseable.close()
-
getConnection
public C getConnection(int maxConnections) throws I extends Throwable, E extends Throwable
Gets either an available connection or creates a new connection.If all the connections in the pool are busy and the pool is at capacity, waits until a connection becomes available.
- Parameters:
maxConnections- The maximum number of connections expected to be used by the current thread. This should normally be one to avoid potential deadlock.The connection will continue to be considered used by the allocating thread until released (via
AutoCloseable.close(), even if the connection is shared by another thread.- Returns:
- Either a reused or new connection
- Throws:
I- when interruptedE- when an error occurs, or when a thread attempts to allocate more than half the poolI extends Throwable- See Also:
getConnection(),AutoCloseable.close()
-
getConnectionObject
protected abstract C getConnectionObject() throws I extends Throwable, E extends Throwable
Creates a new connection.The returned connection must call
release(java.lang.AutoCloseable)onAutoCloseable.close(). This is to support use via try-with-resources, and is distinct fromisClosed(java.lang.AutoCloseable)andclose(java.lang.AutoCloseable), which must both work with the underlying connection.
-
getConnects
public final long getConnects()
Gets the total number of connects for the entire pool.
-
getMaxConnectionAge
public final long getMaxConnectionAge()
Gets the maximum age for connections.
-
getMaxConcurrency
public final int getMaxConcurrency()
Gets the maximum number of connections that have been busy at once.
-
getPoolSize
public final int getPoolSize()
Gets the maximum number of connections the pool will create at once.
-
getTotalTime
public final long getTotalTime()
-
getTransactionCount
public final long getTransactionCount()
-
isClosed
protected abstract boolean isClosed(C conn) throws E extends Throwable
Determine if the underlying connection is closed.Please note, this is distinct from the implementation of
AutoCloseablefor use in try-with-resources.
-
printConnectionStats
protected void printConnectionStats(Appendable out, boolean isXhtml) throws IOException
Prints additional connection pool details. Must have opened the<tbody>.- Throws:
IOException
-
printStatisticsHTML
public final void printStatisticsHTML(Appendable out, boolean isXhtml) throws IOException, E extends Throwable
Prints complete statistics about connection pool use.- Throws:
IOExceptionE extends Throwable
-
printStatisticsHTML
@Deprecated public final void printStatisticsHTML(Appendable out) throws IOException, E extends Throwable
Deprecated.Please specify if is HTML or XHTMLPrints complete statistics about connection pool use in XHTML.- Throws:
IOExceptionE extends Throwable
-
releaseConnection
@Deprecated public final void releaseConnection(C connection) throws E extends Throwable
Deprecated.Please release to the pool by closing the connection, preferably via try-with-resources.- Throws:
E extends Throwable- See Also:
AutoCloseable.close()
-
release
protected void release(C connection) throws E extends Throwable
Releases the databaseConnectionto theConnectionpool.It is safe to call this method more than once, but only the first call will have any affect.
If the connection is not from this pool, no action is taken.
-
logConnection
protected void logConnection(C conn) throws E extends Throwable
Perform any connection logging beforeresetConnection(java.lang.AutoCloseable)and/orclose(java.lang.AutoCloseable). This is only called on connections that are not closed.
-
resetConnection
protected abstract void resetConnection(C conn) throws I extends Throwable, E extends Throwable
Resets the given connection for release back to the pool.
-
run
public final void run()
The RefreshConnection thread polls every connection in the connection pool. If it detects a connection is idle for more than the pre-defined MAX_IDLE_TIME, it closes the connection. It will stop when the pool is flagged as closed.
-
newInterruptedException
protected abstract I newInterruptedException(String message, Throwable cause)
-
getLogger
public final Logger getLogger()
-
-