过期时间为

时间:2017-02-02 09:54:46

标签: c++ c++11 boost

我想创建一个容纳数据库连接的C ++(11)容器(可以使用boost)。我希望能够在容器中插入连接指针,但是std :: vector不知道插入时间,所以我可以使用这样的东西。

  • 当连接开始执行时,它也会推入 现在有时间的容器()。

    如果连接完成了db中的作业,则连接将是 从容器中删除。

理想情况下,我的类将有一个清理方法,它将定期检查连接是否在容器中超过特定​​时间间隔,即30秒。如果确实如此,则将从数据库中释放连接。

任何想法,有没有标准的解决方案?

2 个答案:

答案 0 :(得分:1)

有各种可能的解决方案满足您的需求。

你仍然可以使用std :: vector<>但是包含一个由你定义的结构,它包含数据库连接实例和时间,即(大致记录的代码):

struct TimedConnection {
  DBConnection& connection;
  time_t connected_time;
};
std::vector<TimedConnection> myConnections;

或者,使用std::pair<DBConnection, time_t>作为矢量项。

请注意,自定义结构选项将为您提供更大的自由,以便将来进化或改进,因为它不仅限于std::pair<>这两个数据。

如果只使用这样的容器来定期检查是否有超过X秒前启动的数据库连接,您也可以查看std::priority_queue<>,可能在项目结构上使用自定义比较运算符(或对)。

答案 1 :(得分:1)

你可以使用一对矢量。其中每对的第一个元素是插入时间,第二个元素是连接指针。

std::vector<std::pair<int, ConnectionPtr*>> connections_vec;

此外,您可以使用STL std::partition以消除过期的连接:

connections_vec.erase(std::partition(connections_vec.begin(), 
                                     connections.vec.end(),
                                     [](auto &&p){return (time_now - p.first) > 30secs;}), 
                                     connections_vec.end());