2017-02-02 7 views
0

データベース接続を保持するC++(11)コンテナを作成したい(ブーストも可能)。私はコンテナの接続ポインタを押すことができるようにしたいと思います::ベクトルstd :: vectorは挿入時間を知らないので、私はこのようなものを使用することができます。有効期限のあるC++コンテナ

  • 接続が実行を開始すると、それはまた)(現在時刻と コンテナにプッシュされます。

    接続がdbでジョブを終了した場合、接続は がコンテナから消去されます。

理想的には私のクラスには、接続が特定の時間間隔よりも多くのための容器である場合、定期的にチェックしますクリーンアップ方法、すなわち30秒を持っています。真の場合、接続はデータベースから解放されます。

任意のアイデアは、標準的な解決策はありますか?

+1

データベースドライバは、接続プーリングをサポートしている場合、あなたがチェックしましたか?あなたはその車輪の半分を再考する前に一見価値があるかもしれません。 – nvoigt

+0

サポートしていますが、一部のクエリではデータベース行をロックしたままにするには時間がかかりすぎる可能性があります。 – cateof

答えて

1

ペアのベクトルを使用できます。各ペアの最初の要素は挿入時間になり、2番目の要素は接続ポインタになります。

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

ニーズに応じてさまざまな解決策があります。

あなたはまだSTDを使用することができます::ベクトル<>が、DB接続インスタンスと時間の両方が含まれていますによって定義された構造体を含む、すなわち(おおよそコードをjotted):

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

あるいは、ベクトル項目としてstd::pair<DBConnection, time_t>を使用してください。

カスタム構造体オプションは、std::pair<>という2つのデータに限定されないため、今後の進化または改良の自由度を高めることができます。

X秒前に起動されたDB接続があるかどうか定期的にチェックするのが唯一のコンテナの場合は、std::priority_queue<>を参照してください。おそらくアイテム構造体(またはペア)のカスタム比較演算子を参照してください。