2017-02-02 4 views
0

Ich möchte einen C++ (11) -Container erstellen (Boost kann verwendet werden), der Datenbankverbindungen enthält. Ich würde gerne in der Lage sein, in den Container den Verbindungszeiger einzubringen, aber std :: vector kennt die Einblendzeit nicht, also kann ich sowas benutzen.C++ - Container mit Ablaufzeit

  • Wenn die Verbindung Ausführung beginnt es wird auch jetzt in dem Behälter mit der Zeit gedrückt().

    Wenn die Verbindung den Auftrag in der Datenbank beendet, wird die Verbindung aus dem Container gelöscht.

Idealerweise wird meine Klasse eine Reinigungsmethode, die in regelmäßigen Abständen überprüft, ob eine Verbindung in dem Behälter für mehr als ein bestimmtes Zeitintervall ist, das heißt 30 sec. Wenn es wahr ist, wird die Verbindung von der Datenbank freigegeben.

Irgendwelche Ideen, gibt es irgendeine Standardlösung?

+1

Haben Sie unterstützt, wenn Ihr Datenbanktreiber Verbindungspooling geprüft:

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

Zusätzlich Sie die Verwendung von STL std::partition um machen könnte zu der abgelaufenen Verbindungen wie loswerden? Vielleicht lohnt sich ein Blick, bevor Sie die Hälfte dieses Rades neu erfinden. – nvoigt

+0

Es unterstützt, aber einige Abfragen können zu viel Zeit dauern, die Datenbankzeile gesperrt, und das wollen wir nicht – cateof

Antwort

1

Sie könnten einen Vektor von Paaren verwenden. Das erste Element jedes Paares wäre die Einfügezeit und das zweite Element wäre der Verbindungszeiger.

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

Es gibt verschiedene mögliche Lösungen für Ihre Bedürfnisse.

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

Oder alternativ:

Sie können immer noch std :: vector <> aber enthält eine Struktur definiert, indem Sie diese enthält sowohl die DB-Verbindung Instanz und eine Zeit, dh (etwa jotted Code) verwenden Verwenden Sie eine std::pair<DBConnection, time_t> als Vektorelement.

Beachten Sie, dass die benutzerdefinierte Strukturoption Ihnen größere Freiheit für zukünftige Entwicklungen oder Verbesserungen bietet, da sie nicht auf 2 Daten beschränkt ist, wie std::pair<>.

Wenn die Verwendung eines solchen Containers nur in regelmäßigen Abständen überprüft wird, ob DB-Verbindungen vor mehr als X Sekunden gestartet wurden, können Sie auch std::priority_queue<> anzeigen, möglicherweise mit einem benutzerdefinierten Vergleichsoperator für die item struct (oder das Paar).