+ check cached connection status before returning.
if PQstatus(conn) == CONNECTION_BAD attempt to create a new one + expose "conect_timeout" PG connection parameter default to 4 sec + throw mapnik::datasource exception if connection is 'bad' in mapnik::features(..)
This commit is contained in:
parent
15896b8ba9
commit
aa0e17afd1
4 changed files with 31 additions and 12 deletions
|
@ -105,11 +105,21 @@ public:
|
|||
#ifdef MAPNIK_DEBUG
|
||||
std::clog<<"borrow "<<(*itr).get()<<"\n";
|
||||
#endif
|
||||
usedPool_.push_back(*itr);
|
||||
itr=unusedPool_.erase(itr);
|
||||
return usedPool_[usedPool_.size()-1];
|
||||
if ((*itr)->isOK())
|
||||
{
|
||||
usedPool_.push_back(*itr);
|
||||
unusedPool_.erase(itr);
|
||||
return usedPool_[usedPool_.size()-1];
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog<<"bad connection (erase)" << (*itr).get()<<"\n";
|
||||
#endif
|
||||
unusedPool_.erase(itr);
|
||||
}
|
||||
}
|
||||
else if (unusedPool_.size() < maxSize_)
|
||||
if (unusedPool_.size() < maxSize_)
|
||||
{
|
||||
HolderType conn(creator_());
|
||||
if (conn->isOK())
|
||||
|
|
|
@ -51,12 +51,14 @@ public:
|
|||
boost::optional<string> const& port,
|
||||
boost::optional<string> const& dbname,
|
||||
boost::optional<string> const& user,
|
||||
boost::optional<string> const& pass)
|
||||
boost::optional<string> const& pass,
|
||||
boost::optional<string> const& connect_timeout)
|
||||
: host_(host),
|
||||
port_(port),
|
||||
dbname_(dbname),
|
||||
user_(user),
|
||||
pass_(pass) {}
|
||||
pass_(pass),
|
||||
connect_timeout_(connect_timeout) {}
|
||||
|
||||
T* operator()() const
|
||||
{
|
||||
|
@ -76,7 +78,8 @@ public:
|
|||
if (dbname_ && (*dbname_).size()) connect_str += " dbname=" + *dbname_;
|
||||
if (user_ && (*user_).size()) connect_str += " user=" + *user_;
|
||||
if (pass_ && (*pass_).size()) connect_str += " password=" + *pass_;
|
||||
connect_str += " connect_timeout=4"; // todo: set by client (param)
|
||||
if (connect_timeout_ && (*connect_timeout_).size())
|
||||
connect_str +="connect_timeout=" + *connect_timeout_;
|
||||
return connect_str;
|
||||
}
|
||||
|
||||
|
@ -86,7 +89,7 @@ private:
|
|||
boost::optional<string> dbname_;
|
||||
boost::optional<string> user_;
|
||||
boost::optional<string> pass_;
|
||||
|
||||
boost::optional<string> connect_timeout_;
|
||||
};
|
||||
|
||||
class ConnectionManager : public singleton <ConnectionManager,CreateStatic>
|
||||
|
|
|
@ -79,7 +79,8 @@ postgis_datasource::postgis_datasource(parameters const& params)
|
|||
params.get<std::string>("port"),
|
||||
params.get<std::string>("dbname"),
|
||||
params.get<std::string>("user"),
|
||||
params.get<std::string>("password")),
|
||||
params.get<std::string>("password"),
|
||||
params.get<std::string>("connect_timeout","4")),
|
||||
bbox_token_("!bbox!"),
|
||||
scale_denom_token_("!scale_denominator!"),
|
||||
persist_connection_(*params_.get<mapnik::boolean>("persist_connection",true)),
|
||||
|
@ -490,6 +491,10 @@ featureset_ptr postgis_datasource::features(const query& q) const
|
|||
boost::shared_ptr<IResultSet> rs = get_resultset(conn, s.str());
|
||||
return featureset_ptr(new postgis_featureset(rs,desc_.get_encoding(),multiple_geometries_,props.size()));
|
||||
}
|
||||
else
|
||||
{
|
||||
throw mapnik::datasource_exception("bad connection");
|
||||
}
|
||||
}
|
||||
return featureset_ptr();
|
||||
}
|
||||
|
|
|
@ -83,14 +83,15 @@ int main ( int argc, char** argv)
|
|||
boost::optional<std::string> dbname;
|
||||
boost::optional<std::string> user;
|
||||
boost::optional<std::string> password;
|
||||
|
||||
boost::optional<std::string> connect_timeout("4");
|
||||
|
||||
if (vm.count("host")) host = vm["host"].as<std::string>();
|
||||
if (vm.count("port")) port = vm["port"].as<std::string>();
|
||||
if (vm.count("dbname")) dbname = vm["dbname"].as<std::string>();
|
||||
if (vm.count("user")) user = vm["user"].as<std::string>();
|
||||
if (vm.count("password")) password = vm["password"].as<std::string>();
|
||||
|
||||
ConnectionCreator<Connection> creator(host,port,dbname,user,password);
|
||||
|
||||
ConnectionCreator<Connection> creator(host,port,dbname,user,password,connect_timeout);
|
||||
try
|
||||
{
|
||||
boost::shared_ptr<Connection> conn(creator());
|
||||
|
|
Loading…
Add table
Reference in a new issue