2017-02-02 6 views
0

Я хочу создать контейнер C++ (11), который будет использоваться для подключения базы данных. Я хотел бы иметь возможность вставлять в контейнер указатель соединения, однако std :: vector не знает время вставки, поэтому я могу использовать что-то вроде этого.Контейнер C++ с истечением срока действия

  • Когда соединение начинает выполнение будет также проталкивается в контейнер со временем в настоящее время().

    Если соединение завершает работу в db, соединение будет удалено из контейнера .

В идеале мой класс будет иметь метод очистки, который будет периодически проверять, если соединение находится в контейнере для более определенного интервала времени, то есть 30 сек. Если это правда, соединение будет выпущено из базы данных.

Любые идеи, есть ли стандартное решение?

+1

Вы проверили, если драйвер базы данных поддерживает пул подключений? Возможно, стоит посмотреть, прежде чем изобретать половину этого колеса. – nvoigt

+0

Он поддерживает, однако некоторые запросы могут занять слишком много времени, удерживая строку базы данных заблокированной, и мы не хотим этого – cateof

ответ

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()); 
1

Существуют различные возможные решения для ваших нужд.

Вы все еще можете использовать зЬй :: вектор <> но содержащий определенный-структуру вас, что содержит как экземпляр соединения DB и время, то есть (грубо набросал код):

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

Или, в качестве альтернативы, используйте std::pair<DBConnection, time_t> в качестве элемента вектора.

Обратите внимание, что опция настраиваемой структуры позволит вам получить большую свободу для будущей эволюции или улучшения, поскольку она не ограничивается двумя данными как std::pair<>.

Если единственное использование такого контейнера - периодически проверять, произошло ли подключение к БД более X секунд назад, вы также можете посмотреть std::priority_queue<>, возможно, с помощью пользовательского оператора сравнения для элемента struct (или пары).

 Смежные вопросы

  • Нет связанных вопросов^_^