コード例 #1
0
ファイル: DBStorage.cs プロジェクト: catwalkagogo/Heron
 private IDbConnection GetConnection()
 {
     while(true) {
         PooledConnection conn = null;
         int idx;
         lock(this._Connections) {
             idx = this.FindPool();
             if(idx >= 0) {
                 conn = this._Connections[idx];
                 if(conn != null) {
                     // reuse
                     conn.Wait();
                     if(conn.State == ConnectionState.Open) {
                         return conn;
                     } else {
                         continue;
                     }
                 } else {
                     // new
                     conn = new PooledConnection(this._Factory.CreateConnection());
                     conn.ConnectionString = this._ConnectionString;
                     conn.Open();
                     this._Connections[idx] = conn;
                     conn.Wait();
                     return conn;
                 }
             }
         }
         if(idx < 0) {
             // wait
             WaitHandle.WaitAny(this._Connections.Where(c => c != null).Select(c => c.WaitHandle).ToArray());
         }
     }
 }