ASP.NETでデータベースの接続オブジェクトを管理

今までPHPばっかり書いてきた反動かASP.NETが割と楽しいです。
今回はオブジェクト間でデータベースの接続及びトランザクションを管理すると言うものを書いてみました。

単純に1つのメソッド内で接続・トランザクションが終わってくれればいいのですが、
今回可読性・メンテナンス性を上げるために1つのトランザクション内で複数の別のオブジェクトを扱います。

適当にどっかに保存して使えばいいだろうと思って書いたら、複数スレッド走った時にかなり深い穴にはまり大分反省しました。
というわけで、[ThreadStatic]とSingleton パターンを利用して接続オブジェクトの引き出しを作りました。


    public sealed class LibDBConnection
    {
        [ThreadStatic]
        private static LibDBConnection _singleInstance;

        public static LibDBConnection GetInstance()
        {
            if (_singleInstance == null)
            {
                        _singleInstance = new LibDBConnection();
            }
            return _singleInstance;
        }

        private LibDBConnection()
        {
        }
        
        //Connection保持
        public SqlConnection connection;
    }

こんな感じで生成するオブジェクトの変数をスレッド毎のStatic変数にして、
Singleton パターンを使うことで
「スレッド内だけの固有接続オブジェクトを取得する」という目的が達成できました。
この後受け取った側で内部のコネクションフラグを見て、接続するか再利用するかを決めています。
トランザクションも同様に開始してるかしてないかを管理しています。

大した話でもないですが、深い沼にはまってしまったことを自分メモみたいな形で残したいと思います。

Comments are closed.