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

2024-06-23

有没有标准连接池模型(或API)类似于所使用的.net 中的数据提供者我可以用它来实现我自己的连接池吗?

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


是否有标准的连接池模型

除了 ADO.NET 之外,没有。但 ADO.NET 模型非常简单。构造一个对象以从池中获取连接,或重新创建一个对象,并在 Close/Dispose/Finalise 时将其返回到池中。

由此可以立即确定一种实现模式:

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

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

就像是:

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 (totalObjects >= 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 implement

}

This doesn't cater for instances of MyObject being destroyed. E.g. hold a collection of weak references to allocated MyObject's, and if the pool is empty check for disposed instances. This would also be needed if you cannot rely on client's to Close or dispose of instances, or implement a finaliser on MyObjectImpl1 (and report this as an error in debug builds).

1 This cannot be done on MyObject because by the time MyObject was finalised the MyObjectImpl instance could already have been finalised.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 在子目录中构建共享库

    我正在尝试构建一个使用一些 C 代码的 R 包 我有一个编译为可执行文件的 C 库 可以从命令行调用 有一个与之关联的 Makefile 我正在尝试获取信息here http cran r project org doc manuals R
  • 如何将 CroppedBitmap 转换为 BitmapImage

    我正在尝试将 CroppedBitmap 转换为 BitmapImage 编辑 不使用内存流 我尝试过直接转换它 似乎这不是一个选择 这应该没那么难 我正在尝试剪切 BitmapImage 的一部分 并创建一个仅包含新裁剪的 Bitmap
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 在异步方法中使用时 HttpClient 标头被清空

    我正在使用 NET Framework 4 6 1 我的 Web api 中有一个控制器 其中有静态 HttpClient 来处理所有 http 请求 在 IIS 上托管我的应用程序后 大约每月一次 我的应用程序的所有传入请求都会出现以下异
  • 在宏中使用 # [重复]

    这个问题在这里已经有答案了 请解释一下代码 include
  • C# Visual Studio 动态代码片段

    我正在开发一个 WinForms 项目 每天都会执行一些重复性的任务 所以我认为创建代码片段 https msdn microsoft com en us library ms165394 v vs 110 aspx会帮助我 但它仅适用于固
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • 如何在cj api中根据类别检索产品目录?

    我正在使用 CJ API 我们需要根据类别检索所有产品目录 任何人使用过此类概念请与我分享 更新答案我编写的一个小脚本 用于在 Commission Junction 测试 REST API PHP代码
  • 使用私有构造函数的 C# 单元测试类?

    好吧 我刚刚收到一个作业 我必须对具有私有构造函数的类执行单元测试 现在 当所有方法也都是非静态时 我该如何在不初始化类的情况下进行单元测试 有什么方法可以对具有私有构造函数的类进行单元测试 无需反射 如果您无法将类公开 您仍然可以通过以下
  • 如果 .txt 文件不存在,则创建一个,如果存在则追加新行

    我想创建一个 txt 文件并写入它 如果该文件已经存在 我只想添加更多行 string path E AppServ Example txt if File Exists path File Create path TextWriter t
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 链接错误:xxx 已在 *****.LIB 中定义:: 究竟出了什么问题?

    Problem 我正在尝试使用一个名为DCMTK http dicom offis de dcmtk它使用了一些其他外部库 zlib libtiff libpng libxml2 libiconv 我已经从同一网站下载了这些外部库 LIB
  • 如何从另一个线程阻止 UI 线程或强制表单在 UI 线程内运行

    我的应用程序的一个要求是 如果它失去数据库连接 那么它必须弹出一个大模式 无连接 稍后重试 对话框 阻止所有用户交互 直到重新获得连接为止 我通过在应用程序启动时启动 DeviceMonitor 类的实例来实现此目的 该类创建一个 Syst
  • Subsonic 3 ActiveRecord 嵌套选择导致 NotIn 错误?

    我有以下 Subsonic 3 0 查询 其中包含嵌套的 NotIn 查询 public List
  • 将 R 值传递给采用 L 值的函数时出现过载歧义

    我有 2 个重载函数 一个采用 L 值 另一个采用 R 值 目的是让该函数可以像这样调用 Obj obj foo obj OR foo Obj 所以 我写了2个重载函数 template
  • PC 上 XNA 中的信箱和缩放

    有没有一种方法可以让我基本上以 1080p 或 720p 作为默认分辨率来开发 XNA 游戏 然后根据设置的分辨率将游戏中的所有内容缩放到适当的大小 而不必在每个 Sprite 中设置缩放因子Draw 方法 我的想法是 我可以基于 1080
  • RC4 实现与 openssl 输出不匹配

    我的目标是在 C C 中实现 RC4 流密码 并确保它产生与使用时相同的输出openssl命令 按照伪代码维基百科 https en wikipedia org wiki RC4 该实现似乎有效 因为它可以加密和解密内容 但是 加密的输出与
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不

随机推荐

  • 使用 angular2 将图像上传到 asp.net core

    所以我有 Angular2 的 ASP NET Core 应用程序 现在我想上传图像 如果我将其上传为 byte 我就成功了 但后来我无法检查文件是否真的是后端的图像 所以我尝试寻找其他解决方案 我发现了这个关于文件上传的博客 https
  • 如何将一个整数拆分为一个数字列表?

    假设我有一个输入整数12345 我怎样才能把它分成一个列表 比如 1 2 3 4 5 将数字转换为字符串 https docs python org 3 library functions html func str这样你就可以迭代它 然后
  • DispatcherTimer Stop 不停止

    更新 我把完整的代码放出来供参考 我正在尝试使用 Dispatcher 方法而不是 Forms Timer 我在方法结束时停止了 但在停止之前它一直循环多次 什么地方出了错 顺便说一句 我必须提到我确实在计时器 if 语句中使用了 Mess
  • 如何清除android中的微调器值

    当我在第一个微调器中选择项目 第一个项目除外 时 我有两个微调器 该微调器保存在数组中 它会填充来自网络服务的第二个微调器中的数据 我希望当我再次选择第一个数据 即微调器的标题 时 它应该清除第二个微调器中的所有值 我使尽了一切招数却束手无
  • 问号和点运算符是什么?在 C# 6.0 中是什么意思?

    在 VS2015 预览版中的 C 6 0 中 我们有一个新的运算符 可以这样使用 public class A string PropertyOfA get set var a new A var foo bar if a Property
  • Android:上传图像而不丢失Exif数据

    在我们的应用程序中 用户多年来一直使用 大致 以下代码上传数百万张图像 BitmapFactory Options bmOptions new BitmapFactory Options bmOptions inJustDecodeBoun
  • 组合框 ext 4.0 中的动态滚动

    我正在使用 extjs 4 0 并有一个带有 queryMode remote 的组合框 我用服务器的数据填充它 问题是来自服务器的记录数量太大 所以我认为最好分部分加载它们 我知道组合框有一个标准的分页器工具 但它并不方便 因为需要总记录
  • WebAuthn - “凭证公钥”的字节长度

    In WebAuthn the authenticator data contains the variable length attested credential data followed by the extensions if a
  • Python 类型错误:“List”对象不可调用

    我在使用 Python27 的这段小代码内容时遇到此错误 谁能帮我这个 提前致谢 运行时错误回溯 最近一次调用最后一次 文件 5eb4481881d51d6ece1c375c80f5e509 py 第 57 行 在 print len ar
  • 在Matlab中,是否可以终止脚本,但将其所有内部变量保存到工作区?

    我正在运行一个脚本 但它花费的时间太长 所以我想终止该脚本 然而 它计算了很多数据 我理想情况下不想扔掉这些数据 有没有替代方案ctrl C用什么将内部函数变量保存到工作区 理想情况下我正在寻找一个Matlab键盘快捷键如ctrl C 但如
  • 单调性和启发式的可接受性之间有什么区别?

    我正在阅读我的人工智能教科书 我很好奇启发式的单调性和可接受性之间有什么区别 我知道它们并不相互排斥 据我所知 可接受的启发式方法仅仅意味着您可以确保获得解决方案的最短路径 如果存在 我正在努力解决的是单调属性的概念 有人可以用我可以理解的
  • 在 wxWidgets 中将控制台与 GUI 连接起来

    我正在编写一个 wxWidgets GUI 应用程序 但它也使用一些控制台对象 我需要一种显示标准输出和访问标准输入的方法 最好的方法是显示控制台和 GUI 如果用户从命令提示符 shell 等运行程序 但在应用程序运行时命令提示符不会自动
  • 如何使用自定义设置器来检查参数的有效性?

    我是 Kotlin 新手 无法解决一个极其基本的问题 我想要一个自定义设置器并检查参数值是否有效 如果无效则抛出异常 My code class Test var presni Int 1 set value if value lt 0 t
  • 使用 Enum 作为参数的 Hibernate 查询

    我没有运气让休眠 使用 HSQLDB 查询工作 查询代码如下 Query query session createQuery from tableName where CURRENCY currency query setParameter
  • 我的返回类型需要定义吗?

    前向声明 http en cppreference com w cpp language class Forward declaration让我们推迟定义实际类型直到实现文件 对于前向声明类型的指针或引用 在标头中允许这样做 有人告诉我 h
  • 为什么在 Python 中创建类比实例化类慢得多?

    我发现类的创建比类的实例化慢得多 gt gt gt from timeit import Timer as T gt gt gt def calc n return T class Haha object pass timeit n lt
  • Tarjan 算法的非递归版本

    我有以下 Tarjan 算法的 递归 实现来查找图中的强连接组件 并且工作正常 public class StronglyConnectedComponents public static List
  • 等待回调完成的最佳方法

    在下面的代码中 main 函数调用request 函数 该函数内部调用th request async 函数 其中mm th done cb 仅在执行 mm th done cb 后 在 main 中继续进行的最佳且有效的方法是什么 虚拟代
  • 失去 MPRemoteCommandCenter 的“正在播放”状态

    我正在为 iOS 创建一个应用程序 可以使用MPRemoteCommandCenter 这很好用 更改应用程序时AVAudioSession类别来自AVAudioSessionCategoryPlayback to AVAudioSessi
  • 在 .net 中是否有实现专有连接池的标准方法?

    有没有标准连接池模型 或API 类似于所使用的 net 中的数据提供者我可以用它来实现我自己的连接池吗 我之所以这么问 是因为我需要将自己的连接池实现到我们在 Web 服务中使用的专有 TCP IP 设备 当前的问题是 由于 IIS 下运行