有没有一个标准的连接池模型 (或API)类似于在.NET数据提供者 ,我可以用它来实现自己的连接池使用?
我问,因为我要实现我自己的连接池,我们在Web服务中使用专有的TCP / IP设备的要求。 目前的问题是,有很多的连接(读太多)到设备由于IIS下运行Web服务的线程特性。 我想限制使用我自己的连接池,这些连接的数量,似乎愚蠢推倒重来,如果有我可以用它来做到这一点的标准模型。
有没有一个标准的连接池模型 (或API)类似于在.NET数据提供者 ,我可以用它来实现自己的连接池使用?
我问,因为我要实现我自己的连接池,我们在Web服务中使用专有的TCP / IP设备的要求。 目前的问题是,有很多的连接(读太多)到设备由于IIS下运行Web服务的线程特性。 我想限制使用我自己的连接池,这些连接的数量,似乎愚蠢推倒重来,如果有我可以用它来做到这一点的标准模型。
有没有一个标准连接池模式
除了ADO.NET,没有。 但ADO.NET模型是不错的简单。 构造一个对象,以获得从池中的连接,或重新创建,并返回给关闭/物/敲定池。
从这可以立即确定实现模式:
有在执行一个选择。 当一个对象已经交了,请问池也需要保持一个参考? 如果它池需要跟踪哪些对象是活动的,哪些汇集; 否则,可以使用可用对象的简单集合。
就像是:
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
}
这并不满足的情况下, MyObject
被破坏。 如坚持分配弱引用的集合MyObject
的,如果池是处置情况下空检查。 这也是,如果你不能依赖客户端的关闭或实例部署,或执行上的finaliser需要MyObjectImpl
1(与本报告中的调试错误版本)。
1这不能在MyObject来,因为时间为MyObject完成定稿MyObjectImpl实例可能已经被敲定。
其实现在我知道更多,我想我会使用一个功能从我的IoC容器的选择- 温莎城堡 。 一个内置的生活方式是“ 合并 ”,这意味着只要你问的是与这种生活方式注册的对象的容器,它会给你,如果它能够汇集的对象之一,或者创建一个新的。
我认为,要实现“对象池”。 下面是一个看起来前途无量的几件事情:
当然,你的汇集对象,你需要小心并发和线程同步等。
对于数据库连接:
您可以控制在.NET连接池的连接数量与连接字符串中的选项:“最大池大小”中所述: http://msdn.microsoft.com/en-us/library/8xx3tyca(VS。 71)的.aspx
尽量避免实现自己的,如果你能。
Web服务方法意味着是无状态的(即没有对象保持存在调用之间在服务器上)。 你想要做的是保持调用之间在服务器上的专有连接对象的集合,从这个池每个方法调用分配现有的连接对象(而不是创建每个方法一个新的连接对象)。
一个简单的方法做,这是你的web服务的范围之内,但任何方法,像这样的范围之内声明的对象为“私有静态”的集合:
public class Service1 : System.Web.Services.WebService
{
private static List<CustomConnection> _connections =
new List<CustomConnection>();
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}
然后填充从Web服务的启动事件的收集(我不记得当时是什么事件 - 我会回来与它在第二)。 需要使用的连接会从该列表中得到一个连接对象,而不是创建一个新的任何方法(你必须处理分配的连接以及将它们标记为“使用中”等的方法)。
这会,如果你的Web服务通常称为(Web服务通常在20分钟不活动的,这将需要重建下一次呼叫连接池后关闭),做工精细。 如果你需要保持你超出了连接的集合,看看这篇文章:
http://msdn.microsoft.com/en-us/library/system.web.httpapplicationstate.aspx