diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-08-18 17:56:18 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-08-18 17:56:18 +0200 |
commit | a243907cfe4f39f9b74eea88a41bf535a42158ce (patch) | |
tree | 38ad3c7266908cd05a8152aba2c2cebd13814b93 /odb/mysql/connection-factory.hxx | |
parent | 35e514ddf8c5b1ca72ecfa841b05d3f047650132 (diff) |
Add connection_pool_factory, use it as the default
Diffstat (limited to 'odb/mysql/connection-factory.hxx')
-rw-r--r-- | odb/mysql/connection-factory.hxx | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/odb/mysql/connection-factory.hxx b/odb/mysql/connection-factory.hxx index ef86224..bb439a8 100644 --- a/odb/mysql/connection-factory.hxx +++ b/odb/mysql/connection-factory.hxx @@ -6,12 +6,18 @@ #ifndef ODB_MYSQL_CONNECTION_FACTORY_HXX #define ODB_MYSQL_CONNECTION_FACTORY_HXX +#include <vector> +#include <cstddef> // std::size_t + #include <odb/shared-ptr.hxx> #include <odb/mysql/version.hxx> #include <odb/mysql/forward.hxx> #include <odb/mysql/connection.hxx> +#include <odb/details/mutex.hxx> +#include <odb/details/condition.hxx> + namespace odb { namespace mysql @@ -47,8 +53,92 @@ namespace odb database (database_type&); private: + new_connection_factory (const new_connection_factory&); + new_connection_factory& operator= (const new_connection_factory&); + + private: database_type* db_; }; + + class connection_pool_factory: public connection_factory + { + public: + // The max_connections argument specifies the maximum number of + // concurrent connections this pool will maintain. If this value + // is 0 then the pool will create a new connection every time all + // of the existing connections are in use. + // + // The min_connections argument specifies the minimum number of + // connections that should be maintained by the pool. If the + // number of connections maintained by the pool exceeds this + // number and there are no active waiters for a new connection, + // then the pool will release the excess connections. If this + // value is 0 then the pool will maintain all the connections + // that were ever created. + // + connection_pool_factory (std::size_t max_connections = 0, + std::size_t min_connections = 0) + : max_ (max_connections), + min_ (min_connections), + in_use_ (0), + waiters_ (0), + db_ (0), + cond_ (mutex_) + { + } + + virtual shared_ptr<connection> + connect (); + + virtual void + database (database_type&); + + virtual + ~connection_pool_factory (); + + private: + connection_pool_factory (const connection_pool_factory&); + connection_pool_factory& operator= (const connection_pool_factory&); + + private: + class pooled_connection: public connection + { + public: + // NULL pool value indicates that the connection is not in use. + // + pooled_connection (database_type&, connection_pool_factory*); + + private: + static void + zero_counter (void*); + + private: + friend class connection_pool_factory; + + shared_base::refcount_callback callback_; + connection_pool_factory* pool_; + }; + + friend class pooled_connection; + typedef std::vector<shared_ptr<pooled_connection> > connections; + + private: + void + release (pooled_connection*); + + private: + const std::size_t max_; + const std::size_t min_; + + std::size_t in_use_; // Number of connections currently in use. + std::size_t waiters_; // Number of threads waiting for a connection. + + database_type* db_; + connections connections_; + + details::mutex mutex_; + details::condition cond_; + }; } } |