27 #include "../common/Enums.h"
28 #include "../common/STLUtils.h"
29 #include "../common/Translator.h"
30 #include "../dataaccess/datasource/ConnectionPoolManager.h"
41 #include <boost/thread/locks.hpp>
42 #include <boost/thread/mutex.hpp>
86 throw Exception(
TR_PGIS(
"The connection pool is already initialized!"));
91 std::map<std::string, std::string>::const_iterator itend = connInfo.end();
93 std::map<std::string, std::string>::const_iterator it = connInfo.find(
"PG_INITIAL_POOL_SIZE");
96 it = connInfo.find(
"PG_MIN_POOL_SIZE");
99 it = connInfo.find(
"PG_MAX_POOL_SIZE");
111 it = connInfo.find(
"PG_MAX_IDLE_TIME");
114 it = connInfo.find(
"PG_CLIENT_ENCODING");
131 std::string off =
"off";
133 std::string answer = PQparameterStatus(
m_pImpl->
m_connections.front()->m_pgconn,
"integer_datetimes");
147 boost::lock_guard<boost::mutex> lock(m_pImpl->m_mtx);
150 std::list<te::pgis::Connection*>::iterator it = m_pImpl->m_connections.begin();
151 std::list<te::pgis::Connection*>::iterator itend = m_pImpl->m_connections.end();
156 throw Exception(
TR_PGIS(
"There are opened connections. Please, close all connections before finalizing the connection pool."));
164 m_pImpl->m_connections.clear();
165 m_pImpl->m_poolSize = 0;
167 m_pImpl->m_initialized =
false;
173 boost::lock_guard<boost::mutex> lock(m_pImpl->m_mtx);
180 if((m_pImpl->m_maxIdleTime == 0) ||
182 (m_pImpl->m_maxPoolSize == m_pImpl->m_minPoolSize) ||
183 (m_pImpl->m_poolSize == m_pImpl->m_minPoolSize))
187 boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
190 std::list<te::pgis::Connection*>::iterator it = m_pImpl->m_connections.begin();
191 std::list<te::pgis::Connection*>::iterator itend = m_pImpl->m_connections.end();
195 if((*it)->m_inuse ==
false)
197 boost::posix_time::time_duration d = now - (*it)->m_lastuse;
199 if(d.seconds() >
static_cast<long>(m_pImpl->m_maxIdleTime))
201 std::list<te::pgis::Connection*>::iterator itaux = it;
204 m_pImpl->m_connections.erase(itaux);
205 --(m_pImpl->m_poolSize);
207 if(m_pImpl->m_poolSize == m_pImpl->m_minPoolSize)
221 boost::lock_guard<boost::mutex> lock(m_pImpl->m_mtx);
223 std::list<te::pgis::Connection*>::iterator it = m_pImpl->m_connections.begin();
224 std::list<te::pgis::Connection*>::iterator itend = m_pImpl->m_connections.end();
228 ConnStatusType status = PQstatus((*it)->m_pgconn);
230 if(status != CONNECTION_OK)
241 return m_pImpl->m_initialized;
246 return m_pImpl->m_ds;
251 return m_pImpl->m_poolSize;
256 return m_pImpl->m_initialPoolSize;
262 boost::lock_guard<boost::mutex> lock(m_pImpl->m_mtx);
264 m_pImpl->m_initialPoolSize = size;
269 return m_pImpl->m_minPoolSize;
275 boost::lock_guard<boost::mutex> lock(m_pImpl->m_mtx);
277 m_pImpl->m_minPoolSize = size;
282 return m_pImpl->m_maxPoolSize;
288 boost::lock_guard<boost::mutex> lock(m_pImpl->m_mtx);
290 m_pImpl->m_maxPoolSize = size;
296 boost::lock_guard<boost::mutex> lock(m_pImpl->m_mtx);
299 std::list<te::pgis::Connection*>::iterator it = m_pImpl->m_connections.begin();
300 std::list<te::pgis::Connection*>::iterator itend = m_pImpl->m_connections.end();
304 if((*it)->m_inuse ==
false)
306 (*it)->m_inuse =
true;
314 if(m_pImpl->m_poolSize < m_pImpl->m_maxPoolSize)
316 Connection* newConn =
new Connection(
this, m_pImpl->m_conninfo.c_str(), m_pImpl->m_cencoding.c_str(),
true);
317 m_pImpl->m_connections.push_back(newConn);
318 ++(m_pImpl->m_poolSize);
329 boost::lock_guard<boost::mutex> lock(m_pImpl->m_mtx);
332 conn->
m_lastuse = boost::posix_time::second_clock::local_time();
337 return m_pImpl->m_maxIdleTime;
343 boost::lock_guard<boost::mutex> lock(m_pImpl->m_mtx);
345 m_pImpl->m_maxIdleTime = t;
std::size_t getMinPoolSize() const
It returns the minimum number of connections managed by the pool.
bool isValid() const
It checks if all the connections in the pool are valid (the communication channel is ok)...
const std::map< std::string, std::string > & getConnectionInfo() const
It returns the set of parameters used to set up the access channel to the underlying repository...
boost::mutex m_mtx
A mutex for preventing reading/writing in the connection list.
ConnectionPool(DataSource *ds)
It creates a new connection pool for the database informed.
std::size_t getInitialPoolSize() const
It returns the initial number of connections opened by the pool at its startup.
void FreeContents(boost::unordered_map< K, V * > &m)
This function can be applied to a map of pointers. It will delete each pointer in the map...
void setMaxPoolSize(std::size_t size)
It sets the maximum number of connections managed by the pool.
A class that implements a connection pool for PostGIS.
void setInitialPoolSize(std::size_t size)
It sets the initial number of connections opened by the pool at its startup.
std::size_t getPoolSize() const
It returns the number of connections in the pool.
void setMinPoolSize(std::size_t size)
It sets the minimum number of connections managed by the pool.
std::size_t m_initialPoolSize
It indicates the initial number of connections opened by the pool.
unsigned int m_maxIdleTime
The number of seconds waiting for releasing connections.
void idle()
It releases the connections that are not in use for a long time.
void setTimeAsInteger(bool timeIsInteger)
An exception class for the PostGIS driver.
std::size_t m_minPoolSize
It indicates the minimum number of connections in the pool.
#define TR_PGIS(message)
It marks a string in order to get translated. This is a special mark used in the DataAccess module of...
te::pgis::DataSource * m_ds
The data source using the pool.
std::size_t getMaxPoolSize() const
It returns the maximum number of connections managed by the pool.
#define PGIS_DEFAULT_MAX_POOL_SIZE
This sets the default maximum number of connections in the pool.
bool m_initialized
A flag that indicates if the pool was initialized or not.
void release(Connection *conn)
It brings the informed connection back to the pool.
std::string m_conninfo
The connection info.
A class that implements a connection to a PostgreSQL database.
std::size_t m_maxPoolSize
It indicates the maximum number of connections in the pool.
~ConnectionPool()
Destructor.
#define PGIS_DEFAULT_MIN_POOL_SIZE
This sets the default minimum number of connections to be kept in the pool.
A class that implements a connection to a PostgreSQL database.
unsigned int getMaxIdleTime() const
It returns the maximum idle time in seconds that a connection can be maintained in the pool without b...
bool isInitialized() const
It returns true if the connection pool is initialized, otherwise it returns false.
void initialize()
It initializes the connections to be managed by the pool.
#define PGIS_DEFAULT_MAX_IDLE_TIME
This sets the default maximum time that a connection can be in the pool without being used...
ConnectionPoolImpl * m_pImpl
A pointer to the pool implementation.
std::string m_cencoding
Client encoding.
void finalize()
It closes all connections and clears all resources managed by the pool.
void setMaxIdleTime(unsigned int t)
It sets the maximum idle time that a connection can be maintained in the pool without being used...
Utility functions for PostgreSQL.
ConnectionPoolImpl(te::pgis::DataSource *ds)
std::list< te::pgis::Connection * > m_connections
The list of available connections ready to be used.
boost::posix_time::ptime m_lastuse
It marks the last time this connection was used.
static ConnectionPoolManager & getInstance()
It returns a reference to the singleton instance.
#define PGIS_DEFAULT_INITIAL_POOL_SIZE
This sets the default initial number of connections opened by a connection pool.
te::pgis::DataSource * getDataSource() const
std::string MakeConnectionStr(const std::map< std::string, std::string > &dsInfo)
std::size_t m_poolSize
It indicates the maximum number of connections in the pool.
Connection * getConnection()
It returns a connection from the pool.
bool m_inuse
Tells if the connection is in use or not.
Implementation of the data source for the PostGIS driver.