#pragma once #include "Pool.h" #define MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS 1 #define MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS 16 #define MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES 3 namespace mysqlxx { /** MySQL connection pool with support of failover. * Have information about replicas and their priorities. * Tries to connect to replica in an order of priority. When equal priority, choose replica with maximum time without connections. * * It could be configured without replicas, exactly as ordinary Pool: * * * mtstat01c* * 3306 * metrica * * Metrica * * * Or like this: * * * * mtstat01c * 3306 * metrica * * Metrica * 0 * * * mtstat01d * 3306 * metrica * * Metrica * 1 * * * * Or like this: * * * 3306 * metrica * * Metrica * * mtstat01c * 0 * * * mtstat01d * 1 * * */ class PoolWithFailover final { private: using PoolPtr = std::shared_ptr; using Replicas = std::vector; /// [priority][index] -> replica. using ReplicasByPriority = std::map; ReplicasByPriority replicas_by_priority; /// Number of connection tries. size_t max_tries; /// Mutex for set of replicas. std::mutex mutex; /// Can the Pool be shared bool shareable; public: using Entry = Pool::Entry; /** * config_name Name of parameter in configuration file. * default_connections Number of connection in pool to each replica at start. * max_connections Maximum number of connections in pool to each replica. * max_tries_ Max number of connection tries. */ PoolWithFailover(const std::string & config_name_, unsigned default_connections_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS, unsigned max_connections_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS, size_t max_tries_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES); PoolWithFailover(const Poco::Util::AbstractConfiguration & config_, const std::string & config_name_, unsigned default_connections_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS, unsigned max_connections_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS, size_t max_tries_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES); PoolWithFailover(const PoolWithFailover & other); /** Allocates a connection to use. */ Entry get(); }; }