是否有标准的连接池模型
除了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
,如果池为空,则检查已处置的实例.如果您不能依赖客户端来关闭或处理实例,或者在MyObjectImpl
1上实现终结器(并在调试版本中将其报告为错误),那么也需要这样做.
1这不能在MyObject上完成,因为在MyObject完成时,MyObjectImpl实例可能已经完成.
实际上现在我知道了更多,我想我会使用我选择的IoC 容器中的一个功能 - Castle Windsor。其中一种内置生活方式是“池化”,这意味着每当您向容器请求使用此生活方式注册的对象时,它都会为您提供池化对象之一(如果可以的话),否则创建一个新的对象。
我认为你想实现“对象池”。以下是一些看起来很有希望的事情:
当然,对于池化对象,您需要小心并发性和线程同步等。
对于数据库连接:
您可以使用连接字符串中的选项控制 .NET 连接池中的连接数:“最大池大小”,如下所述:http://msdn.microsoft.com/en-us/library/8xx3tyca(VS. 71).aspx
如果可以的话,尽量避免实现自己的。
归档时间: |
|
查看次数: |
3161 次 |
最近记录: |