connection_pool create_connection失败
Closed this issue · 3 comments
BestUO commented
在connection_pool的get中强行执行create_connection()失败,报错Unknown MySQL server host
std::shared_ptr<DB> get() {
std::unique_lock<std::mutex> lock(mutex_);
while (pool_.empty()) {
if (condition_.wait_for(lock, std::chrono::seconds(3)) ==
std::cv_status::timeout) {
// timeout
return nullptr;
}
}
auto conn = pool_.front();
pool_.pop_front();
lock.unlock();
if (conn == nullptr || !conn->ping()) {
return create_connection();
}
// check timeout, idle time shuold less than 8 hours
auto now = std::chrono::system_clock::now();
auto last = conn->get_latest_operate_time() - std::chrono::hours(7);//这里使其强行执行create_connection
auto mins =
std::chrono::duration_cast<std::chrono::minutes>(now - last).count();
if ((mins - 6 * 60) > 0) {
return create_connection();
}
conn->update_operate_time();
return conn;
}
BestUO commented
我是这么使用的
template<class R>
R ExecuteCommand(std::function<R(std::shared_ptr<ormpp::dbng<ormpp::mysql>> conn)> f)
{
auto &pool = ormpp::connection_pool<ormpp::dbng<ormpp::mysql>>::instance();
auto conn = pool.get();//这里强行执行get中的create_connection失败
while(!conn)
{
LOGGER->info("connection_pool is not enough");
pool.return_back(conn);
conn = pool.get();
}
auto result = std::move(f(conn));
pool.return_back(conn);
return result;
}
bool InitConnectionPool(rapidjson::Document &config)
{
auto &pool = ormpp::connection_pool<ormpp::dbng<ormpp::mysql>>::instance();
try
{
pool.init(config["mysql_setting"]["mysql_connect_pool_size"].GetInt(),
config["mysql_setting"]["mysql_host"].GetString(),
config["mysql_setting"]["mysql_user"].GetString(),
config["mysql_setting"]["mysql_password"].GetString(),
config["mysql_setting"]["mysql_db"].GetString(),
config["mysql_setting"]["mysql_timeout"].GetInt(),
config["mysql_setting"]["mysql_port"].GetInt());
auto conn = pool.get();//这里没问题
}
catch (const std::exception &e)
{
LOGGER->info("InitConnectionPool err so return {}",e.what());
return false;
}
return true;
}
BestUO commented
connection_pool中的args_类型是(std::tuple<const char *, const char *, const char *, const char *, int, int>)。const char *需要自己维护
qicosmos commented
tuple里面改成string是不是就可以了,你验证一下看看。