我想创建一个容纳数据库连接的C ++(11)容器(可以使用boost)。我希望能够在容器中插入连接指针,但是std :: vector不知道插入时间,所以我可以使用这样的东西。
当连接开始执行时,它也会推入 现在有时间的容器()。
如果连接完成了db中的作业,则连接将是 从容器中删除。
理想情况下,我的类将有一个清理方法,它将定期检查连接是否在容器中超过特定时间间隔,即30秒。如果确实如此,则将从数据库中释放连接。
任何想法,有没有标准的解决方案?
答案 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());