是否有在.net中实现专有连接池的标准方法?

Vin*_*eJS 5 .net c# api pooling

是否存在类似于.net中的数据提供程序使用的标准连接池模型(或API),我可以使用它来实现自己的连接池?

我问,因为我需要将我自己的连接池实现到我们在Web服务中使用的专有TCP/IP设备.当前的问题是由于在IIS下运行的Web服务的线程性质,设备有很多连接(读取太多).我想使用我自己的连接池来限制这些连接的数量,如果有一个我可以使用的标准模型,重新发明轮子似乎很愚蠢.

Ric*_*ard 6

是否有标准的连接池模型

除了ADO.NET,没有.但是ADO.NET模型很简单.构造一个对象以从池中获取连接,或者重新创建一个对象,并在Close/Dispose/Finalize上将其返回到池中.

从这一点可以立即确定一个实现模式:

  • 客户端类型是真实类型的代理,并且具有从创建到关闭/ ...的生命周期.它是真实对象的代理.提供转发到真实连接的方法和属性.
  • 真正的连接是由池创建的长期实例,在代理下发出,然后在代理的末尾返回.

实施中有一个选择.当一个对象被分发时,池是否还需要保留引用?如果它确实需要跟踪哪些对象是活动的以及哪些对象是合并的; 否则,可以使用简单的可用对象集合.

就像是:

internal class MyObjectImpl {
  // The real object that holds the resource
}

internal static class MyObjectPool {
  private static object syncRoot = new object();
  private static Queue<MyObjectImpl> pool = new Queue<MyObject>();
  private static int totalObjects = 0;
  private readonly int maxObjects = 10;

  internal MyObjectImplGet() {
    lock (syncRoot) {
      if (pool.Count > 0) {
        return pool.Dequeue();
      }
      if (totalOjects >= maxObjects) {
        throw new PoolException("No objects available");
      }
      var o = new MyObjectImpl();
      totalObjects++;
      return o;
    }
  }

  internal void Return(MyObjectImpl obj) {
    lock (syncRoot) {
      pool.Enqueue(obj);
    }
  }
}

public class MyObject : IDisposable {
  private MyObjectImpl impl;

  public MyObject() {
    impl = MyObjectPool.Get();
  }

  public void Close() {
    Dispose();
  }

  public void Dispose() {
    MyIObjectPool.Return(impl);
    // Prevent continuing use, as the implementation object instance
    // could now be given out.
    impl = null;
  }

  // Forward API to imp

}
Run Code Online (Sandbox Code Playgroud)

这不适合MyObject被摧毁的情况.例如,保存对已分配的弱引用的集合MyObject,如果池为空,则检查已处置的实例.如果您不能依赖客户端来关闭或处理实例,或者在MyObjectImpl1上实现终结器(并在调试版本中将其报告为错误),那么也需要这样做.

1这不能在MyObject上完成,因为在MyObject完成时,MyObjectImpl实例可能已经完成.


Nei*_*ell 4

更新

实际上现在我知道了更多,我想我会使用我选择的IoC 容器中的一个功能 - Castle Windsor。其中一种内置生活方式是“池化”,这意味着每当您向容器请求使用此生活方式注册的对象时,它都会为您提供池化对象之一(如果可以的话),否则创建一个新的对象。

之前...

我认为你想实现“对象池”。以下是一些看起来很有希望的事情:

当然,对于池化对象,您需要小心并发性和线程同步等。


对于数据库连接:

您可以使用连接字符串中的选项控制 .NET 连接池中的连接数:“最大池大小”,如下所述:http://msdn.microsoft.com/en-us/library/8xx3tyca(VS. 71).aspx

如果可以的话,尽量避免实现自己的。