有没有人有一个很好的资源来实现一个共享对象池策略,对于一个有限的资源,就像 Sql 连接池一样?(即将完全实现,它是线程安全的)。
要对@Aaronort 请求进行后续澄清,池的使用将用于对外部服务的负载平衡请求。把它放在一个可能更容易立即理解的场景,而不是我的直接情况。我有一个会话对象,它的功能类似于来自 NHibernate 的 ISession
对象。每个唯一的会话管理它到数据库的连接。目前,我有一个长时间运行的会话对象,并遇到问题,我的服务提供商是速率限制我的使用这个单独的会话。
由于他们没有期望一个会话会被当作一个长时间运行的服务帐户,所以他们显然把它当作一个正在打击他们的服务的客户端。这就引出了我的问题,我不会只有一个单独的会话,而是创建一个不同的会话池,并将请求分散到多个会话的服务中,而不是像以前那样创建一个单独的协调中心。
希望这些背景知识能够提供一些价值,但也能直接回答你的一些问题:
问: 创建这些对象是否很昂贵?
没有对象是一个有限资源池
问: 他们会经常被收购/释放吗?
A: 是的,它们可以再次被认为是 NHibernate ISessions,通常在每个页面请求期间获取并释放1。
问: 一个简单的先到先得的服务就足够了吗? 还是你需要一些更智能的东西,比如能够防止饥饿的东西?
A: 一个简单的循环类型分布就足够了,关于饥饿,我假设您的意思是如果没有可用的会话,那么调用者就会被阻塞,等待释放。这实际上并不适用,因为会话可以由不同的调用方共享。我的目标是将使用分布在多个会话之间,而不是单个会话。
我相信这可能与对象池的正常使用有所不同,这就是为什么我最初省略了这一部分,并计划仅仅调整模式以允许共享对象,而不是允许出现饥饿情况。
问: 优先级、懒惰与渴望加载等事情怎么样?
答: 没有涉及优先级,为了简单起见,假设我将在创建池本身时创建可用对象池。