私は、このトピックに関する情報がほとんどないことを発見しました。誰かが私に情報と可能なサンプルコードを案内することを期待していました。C#アプリケーションでスレッド間のdb接続を共有していますか?
答えて
私は接続オブジェクト自体を共有しないでください。新しい接続を作成し、ADO.netが接続プーリングを処理できるようにします。
私は同意しがちですが、データベースサーバは接続プールを管理するように設計されています。そうするように設計されている。 –
通常、接続はスレッドセーフではありません(SqlConnection、MySqlConnection、OracleConnectionは特にスレッドセーフではありません)。
スレッド間の接続を共有しないでください。
非常に、非常に、悪い考えで(ほとんど)誰もそれをしないので、野生にサンプルコードはありません。むしろ彼らを解雇よりも、私は接続へのアクセスを同期するために役立つDbCommand
を包むだろう、問題の実際のパラメータに対応するため
(場合、あなたは絶対に持っている唯一の場合)。
public class SyncedDbCommand : DbCommand
{
private DbCommand _cmd;
private object _sync;
public SyncedDbCommand(DbCommand cmd, object sync)
{
_cmd = cmd;
_sync = sync;
}
// omitted basic proxy method overrides
protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
{
Monitor.Enter(_sync);
return _cmd.ExecuteReader();
}
public override int ExecuteNonQuery()
{
Monitor.Enter(_sync);
return _cmd.ExecuteNonQuery();
}
public override object ExecuteScalar()
{
Monitor.Enter(_sync);
return _cmd.ExecuteScalar();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
Monitor.Exit(_sync);
}
base.Dispose(disposing);
}
}
サンプルを使用するには、接続のすべての使用で共有され、実際のDbCommand
などいくつかのオブジェクトインスタンスとそれをインスタンス化する必要があります。最も単純な使い方では、接続オブジェクト自体をロックオブジェクトとして渡すことさえできます。インスタンス化はusing
ステートメントで行われる必要があります。これは、あなたの使用要件が何であるか、そしてクラスとロックがどのように機能するかを正確に知ることから免れません。
スレッド間で接続の使用状況を同期する必要があります。これを行う方法の1つが上記の方法です。
これを絶対にしないでください。これを行う理由がなく、アプリケーションのパフォーマンスに影響します。上記の応答状態のように接続プーリングを使用します。 –
「いい理由はない?彼のコードのアーキテクチャを知らなければ、あなたはそれをどのように主張できますか?接続の共有に関しては、MSDTCに昇格せずにトランザクションを有効にする方法としてよく知られています。これは大きなパフォーマンス上の利点です。それにもかかわらず、最初から始めて、当然のことながら私の答えに記載されているアプローチは助言しません。しかし、質問者を尊重し、彼の質問*の詳細に答えることは、これが私のお勧めです。 –
まだ悟りを待っています... –
- 1. スレッド間の接続の共有
- 2. プロセスプールでDB接続を共有する
- 3. C global static - スレッド間で共有されていますか?
- 4. python:キューとスレッド間でsqlite接続を共有するには?
- 5. C#:スレッド間でクラスメンバーを共有する
- 6. 多くのアプリケーション間で接続文字列を共有する
- 7. スレッド間のC++データの共有C++
- 8. プロセス間でスレッドを共有していますか?
- 9. C++ - スレッド間でデータを共有
- 10. jettyはスレッドを共有してWebソケット接続を処理しますか
- 11. ActiveMQクライアント:セッション間の接続を共有しますか?
- 12. re-structure共通のオープンdb接続を共有するFlaskルート
- 13. スレッド間でフレームバッファを共有
- 14. C++でスレッドを共有するスレッド
- 15. スレッドはWebモジュール間で共有されていますか?
- 16. Celery worker間の共有XMPP接続
- 17. 共有オブジェクト間のデータベース接続
- 18. Tomcat JDBC接続プールはインスタンス間で共有されますか?
- 19. さまざまなデータベースクエリ間で接続オブジェクトを共有する
- 20. アプリケーション間でコアデータエンティティを共有しようとしています
- 21. python/djangoのスレッド間でトランザクションスコープを共有していますか? (PostgreSQL)
- 22. サーブレット - 多くのコンテキスト - db接続を共有するには?
- 23. 共有フォルダ内のDBへのMSアクセスを介して接続する
- 24. jdbc接続プールの共有可能な接続と共有できない接続の違い?
- 25. SQLite接続が共有キャッシュモードで一時テーブルを共有しますか?
- 26. C#とWCFのスレッド間でオブジェクトを共有する
- 27. C#でmysql dbに接続しようとしています
- 28. 共有接続は
- 29. スレッド間でXPObjectオブジェクトを共有する
- 30. Dのスレッド間でバリアを共有
私はこれもデータベースとは違うと思います... mysql、ms sql、sqlite ... – tuinstoel