次の問題があります。
リサイクルされた(プールに戻された)データベース接続があります。
例えば:
{
session sql(conn_str); // take connection from pool
sql.exec("insert into ...")
} // at the end of the scope return connection to pool
ただし、場合によっては、リサイクルが間違っている可能性があります。たとえば、切断やその他の重大なエラーです。
したがって、接続がリサイクルされるのを自動的に防ぎたいと思います。次の手法を使用して実装したいstd::uncaught_exception
ので、exec() 関数は例外を検出し、リサイクルを防ぎます。
session::exec(...)
{
guard g(this)
real_exec(...);
}
どこでガード:
class guard {
public:
guard(session *self) : self_(self) {}
~guard() {
if(std::uncaught_exception()) {
self->mark_as_connection_that_should_not_go_to_pool();
}
}
}
今、私はhttp://www.gotw.ca/gotw/047.htmを認識していますが、他のケースでの使用は推奨されていません
std::uncaught_exception
が、私のコードにも問題はありません。説明されている例が提供されています。
このコードに問題がある可能性はありますか。
ノート:
- この変更を邪魔にならないようにして、SQL バックエンドがすべてのケースをスローして、それが重要かどうかをチェックしないようにしたいと考えています。
- ユーザーがそれについて何か行動を起こしてほしくないので、彼にとって透過的です。