Class MultiHostConnectionProxy

java.lang.Object
com.mysql.jdbc.MultiHostConnectionProxy
All Implemented Interfaces:
InvocationHandler
Direct Known Subclasses:
FailoverConnectionProxy, LoadBalancedConnectionProxy, ReplicationConnectionProxy

public abstract class MultiHostConnectionProxy extends Object implements InvocationHandler
An abstract class that processes generic multi-host configurations. This class has to be sub-classed by specific multi-host implementations, such as load-balancing and failover.
  • Field Details

    • hostList

      List<String> hostList
    • localProps

      Properties localProps
    • autoReconnect

      boolean autoReconnect
    • thisAsConnection

      MySQLConnection thisAsConnection
    • proxyConnection

      MySQLConnection proxyConnection
    • currentConnection

      MySQLConnection currentConnection
    • isClosed

      boolean isClosed
    • closedExplicitly

      boolean closedExplicitly
    • closedReason

      String closedReason
    • lastExceptionDealtWith

      protected Throwable lastExceptionDealtWith
  • Constructor Details

    • MultiHostConnectionProxy

      MultiHostConnectionProxy() throws SQLException
      Initializes a connection wrapper for this MultiHostConnectionProxy instance.
      Parameters:
      props - The properties to be used in new internal connections.
      Throws:
      SQLException
    • MultiHostConnectionProxy

      MultiHostConnectionProxy(List<String> hosts, Properties props) throws SQLException
      Constructs a MultiHostConnectionProxy instance for the given list of hosts and connection properties.
      Parameters:
      hosts - The lists of hosts available to switch on.
      props - The properties to be used in new internal connections.
      Throws:
      SQLException
  • Method Details

    • initializeHostsSpecs

      int initializeHostsSpecs(List<String> hosts, Properties props)
      Initializes the hosts lists and makes a "clean" local copy of the given connection properties so that it can be later used to create standard connections.
      Parameters:
      hosts - The list of hosts for this multi-host connection.
      props - Connection properties from where to get initial settings and to be used in new connections.
      Returns:
      The number of hosts found in the hosts list.
    • getNewWrapperForThisAsConnection

      MySQLConnection getNewWrapperForThisAsConnection() throws SQLException
      Wraps this object with a new multi-host Connection instance.
      Returns:
      The connection object instance that wraps 'this'.
      Throws:
      SQLException
    • getProxy

      protected MySQLConnection getProxy()
      Get this connection's proxy. A multi-host connection may not be at top level in the multi-host connections chain. In such case the first connection in the chain is available as a proxy.
      Returns:
      Returns this connection's proxy if there is one or itself if this is the first one.
    • setProxy

      protected final void setProxy(MySQLConnection proxyConn)
      Sets this connection's proxy. This proxy should be the first connection in the multi-host connections chain. After setting the connection proxy locally, propagates it through the dependant connections.
      Parameters:
      proxyConn - The top level connection in the multi-host connections chain.
    • propagateProxyDown

      protected void propagateProxyDown(MySQLConnection proxyConn)
      Propagates the connection proxy down through the multi-host connections chain. This method is intended to be overridden in subclasses that manage more than one active connection at same time.
      Parameters:
      proxyConn - The top level connection in the multi-host connections chain.
    • proxyIfReturnTypeIsJdbcInterface

      Object proxyIfReturnTypeIsJdbcInterface(Class<?> returnType, Object toProxy)
      If the given return type is or implements a JDBC interface, proxies the given object so that we can catch SQL errors and fire a connection switch.
      Parameters:
      returnType - The type the object instance to proxy is supposed to be.
      toProxy - The object instance to proxy.
      Returns:
      The proxied object or the original one if it does not implement a JDBC interface.
    • getNewJdbcInterfaceProxy

      InvocationHandler getNewJdbcInterfaceProxy(Object toProxy)
      Instantiates a new JdbcInterfaceProxy for the given object. Subclasses can override this to return instances of JdbcInterfaceProxy subclasses.
      Parameters:
      toProxy - The object instance to be proxied.
      Returns:
      The new InvocationHandler instance.
    • dealWithInvocationException

      void dealWithInvocationException(InvocationTargetException e) throws SQLException, Throwable, InvocationTargetException
      Deals with InvocationException from proxied objects.
      Parameters:
      e - The Exception instance to check.
      Throws:
      SQLException
      Throwable
      InvocationTargetException
    • shouldExceptionTriggerConnectionSwitch

      abstract boolean shouldExceptionTriggerConnectionSwitch(Throwable t)
      Checks if the given throwable should trigger a connection switch.
      Parameters:
      t - The Throwable instance to analyze.
    • isMasterConnection

      abstract boolean isMasterConnection()
      Checks if current connection is to a master host.
    • invalidateCurrentConnection

      void invalidateCurrentConnection() throws SQLException
      Invalidates the current connection.
      Throws:
      SQLException
    • invalidateConnection

      void invalidateConnection(MySQLConnection conn) throws SQLException
      Invalidates the specified connection by closing it.
      Parameters:
      conn - The connection instance to invalidate.
      Throws:
      SQLException
    • pickNewConnection

      abstract void pickNewConnection() throws SQLException
      Picks the "best" connection to use from now on. Each subclass needs to implement its connection switch strategy on it.
      Throws:
      SQLException
    • createConnectionForHost

      ConnectionImpl createConnectionForHost(String hostPortSpec) throws SQLException
      Creates a new physical connection for the given host:port.
      Parameters:
      hostPortSpec - The host:port specification.
      Returns:
      The new Connection instance.
      Throws:
      SQLException
    • syncSessionState

      void syncSessionState(Connection source, Connection target) throws SQLException
      Synchronizes session state between two connections.
      Parameters:
      source - The connection where to get state from.
      target - The connection where to set state.
      Throws:
      SQLException
    • syncSessionState

      void syncSessionState(Connection source, Connection target, boolean readOnly) throws SQLException
      Synchronizes session state between two connections, allowing to override the read-only status.
      Parameters:
      source - The connection where to get state from.
      target - The connection where to set state.
      readOnly - The new read-only status.
      Throws:
      SQLException
    • doClose

      abstract void doClose() throws SQLException
      Executes a close() invocation;
      Throws:
      SQLException
    • doAbortInternal

      abstract void doAbortInternal() throws SQLException
      Executes a abortInternal() invocation;
      Throws:
      SQLException
    • doAbort

      abstract void doAbort(Executor executor) throws SQLException
      Executes a abort() invocation;
      Throws:
      SQLException
    • invoke

      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
      Proxies method invocation on the java.sql.Connection interface, trapping multi-host specific methods and generic methods. Subclasses have to override this to complete the method invocation process, deal with exceptions and decide when to switch connection. To avoid unnecessary additional exception handling overriders should consult #canDealWith(Method) before chaining here.
      Specified by:
      invoke in interface InvocationHandler
      Throws:
      Throwable
    • invokeMore

      abstract Object invokeMore(Object proxy, Method method, Object[] args) throws Throwable
      Continuation of the method invocation process, to be implemented within each subclass.
      Throws:
      Throwable
    • allowedOnClosedConnection

      protected boolean allowedOnClosedConnection(Method method)
      Checks if the given method is allowed on closed connections.