qicosmos/ormpp

connection_pool create_connection失败

Closed this issue · 3 comments

在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;
  }

我是这么使用的

    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;
    }

connection_pool中的args_类型是(std::tuple<const char *, const char *, const char *, const char *, int, int>)。const char *需要自己维护

tuple里面改成string是不是就可以了,你验证一下看看。