#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 #define MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_CONNECTION_WAIT_TIMEOUT 5 /// in seconds namespace mysqlxx { /** MySQL connection pool with support of failover. * * For dictionary source: * 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. Highest priority is 0. 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; /// Timeout for waiting free connection. uint64_t wait_timeout = 0; public: using Entry = Pool::Entry; using RemoteDescription = std::vector>; /** * * Mysql dictionary sourse related params: * config_name Name of parameter in configuration file for dictionary source. * * * Mysql storage related parameters: * replicas_description * * * Mutual parameters: * 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. * wait_timeout_ Timeout for waiting free connection. */ 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 std::string & database, const RemoteDescription & addresses, const std::string & user, const std::string & password, 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, uint64_t wait_timeout_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_CONNECTION_WAIT_TIMEOUT, size_t connect_timeout = MYSQLXX_DEFAULT_TIMEOUT, size_t rw_timeout = MYSQLXX_DEFAULT_RW_TIMEOUT); PoolWithFailover(const PoolWithFailover & other); /** Allocates a connection to use. */ Entry get(); }; using PoolWithFailoverPtr = std::shared_ptr; }