Class AOPool<C,​E extends Exception,​I extends Exception>

  • All Implemented Interfaces:
    Runnable
    Direct Known Subclasses:
    AOConnectionPool

    public abstract class AOPool<C,​E extends Exception,​I extends Exception>
    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 ThreadLocal list of connections checked-out by the current thread is maintained. When getting a new connection, this is used to check again maxConnections instead 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: When connections are closed due to maxConnectionAge, automatically reconnect in the background. This would avoid the latency of the reconnect for the connection-using thread.
    Author:
    AO Industries, Inc.
    • Field Detail

      • 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 to System.err.
    • Constructor Detail

      • AOPool

        protected AOPool​(String name,
                         int poolSize,
                         long maxConnectionAge,
                         Logger logger)
      • AOPool

        protected AOPool​(int delayTime,
                         int maxIdleTime,
                         String name,
                         int poolSize,
                         long maxConnectionAge,
                         Logger logger)
    • Method Detail

      • close

        protected abstract void close​(C conn)
                               throws E extends Exception
        Throws:
        E extends Exception
      • 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 Exception,
                               E extends Exception
        Gets a connection, warning of a connection is already used by this thread.
        Throws:
        I - when interrupted
        E - when error
        I extends Exception
        See Also:
        getConnection(int)
      • getConnection

        public C getConnection​(int maxConnections)
                        throws I extends Exception,
                               E extends Exception
        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. Due to internal ThreadLocal optimizations, the connection returned must be released by the current thread, it should not be passed off to another thread before release.
        Parameters:
        maxConnections - The maximum number of connections expected to be used by the current thread. This should normally be one to avoid potential deadlock.
        Returns:
        either a reused or new connection
        Throws:
        I - when interrupted
        E - when error
        I extends Exception
      • getConnectionObject

        protected abstract C getConnectionObject()
                                          throws I extends Exception,
                                                 E extends Exception
        Creates a new connection.
        Throws:
        I - when interrupted
        E - when error
        I extends Exception
      • 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()
      • getPoolSize

        public final int getPoolSize()
      • getTotalTime

        public final long getTotalTime()
      • getTransactionCount

        public final long getTransactionCount()
      • isClosed

        protected abstract boolean isClosed​(C conn)
                                     throws E extends Exception
        Throws:
        E extends Exception
      • printConnectionStats

        protected void printConnectionStats​(Appendable out,
                                            boolean isXhtml)
                                     throws IOException
        Prints additional connection pool details. Must have opened the <tbody>.
        Throws:
        IOException
      • releaseConnection

        public final void releaseConnection​(C connection)
                                     throws E extends Exception
        Releases the database Connection to the Connection pool. It is safe to call this method more than once, but only the first call will have any affect and the second release will log a warning.
        Throws:
        E extends Exception
      • 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.
        Specified by:
        run in interface Runnable
        Overrides:
        run in class Thread
      • newException

        protected abstract E newException​(String message,
                                          Throwable cause)
      • newInterruptedException

        protected abstract I newInterruptedException​(String message,
                                                     Throwable cause)
      • getLogger

        public final Logger getLogger()