什么是最好的方式来设置你的游泳池:-

  1. 你什么时候建立的连接?
  2. 当你的密切联系,并就关闭所有的人?
  3. 做你的测试连接仍然良好。何时以及如何?
  4. 你怎么想出一个好的数量的最大数量的连接?
  5. 什么样的监测做你必须到位,以确保用户的游泳池很乖?你能阻止一个不好的代码采取一切?
  6. 你有没有写你自己的游泳池,或者使用第三方图书馆?

我相信这是一个不可知的问题,但是评论有关"功能"的特别数据库/语言的欢迎。例如,它可能会减慢或更昂贵的连接在一些数据库比其他人。

为了澄清,我不打算写一个游泳池是从零开始,这个问题更多关于如何配置现有库,并汇集。

有帮助吗?

解决方案

我在Java中为数据库编写了一个连接池,它只是一个设计模式,而不是一个公共库。现在我使用Tomcat中内置的那个。

我使用一个线程来监视池的几个方面以及几个控制其行为的参数......

  1. minimumInPool =" 3" ...前三个是在发布时创建的。游泳池永远不会低于三。
  2. maximumIdleTimeBeforeRemoval =" 60" ...如果连接空闲一小时,则将其删除并创建一个新连接。空闲时间可能意味着池中只有至少三个。
  3. maximumInUseTimeBeforeRemoval =" 30" ...如果已经检出给定连接超过30分钟,则可能出现问题。回想一下,并终止连接。
  4. maximumTimeBeforeRemoval =" 60" ...如果超过60分钟,请将其删除。
  5. maximumUsageBeforeRemoval =" 1000" ...如果已经超过1000次检出,则将其删除。
  6. monitorInterval =" 15" ...每15分钟检查一次上述参数。
  7. 这对我来说非常好用了几年。我见过的最高的游泳池是疯狂偷看的151个连接。通常情况下,在大量使用期间,游泳池大约有十几个,并且在凌晨时分闲置至最少三个。

    我使用了Oracle的JDBC瘦驱动程序并连接到Oracle数据库。

其他提示

以下是我最近实施的基本原理。

  1. 您的连接池中有两种连接。第一个是准备好的,意思是开放但客户没有使用。第二个是活动的,意味着客户使用。

  2. 让您的连接池保持少量就绪连接,最小N和最大M. N可以根据客户端请求连接的峰值速度进行调整。如果就绪连接数量下降到零,则需要更大的N.如果数字一直很高(例如大于10),则需要更低的N.

  3. 当客户想要连接时,给他们一个准备好的连接(使其处于活动状态),然后立即打开一个新的,如果现在已经准备好了N(但不要让客户等待这个完成,否则你将失去合并的优势)。这可确保始终至少有N个就绪连接。如果在客户需要时没有准备好,他们将不得不在你创建一个新的时候等待。

  4. 当客户端使用活动连接完成时,如果少于M个就绪连接,则将其返回到就绪状态。否则关闭它。这可以防止您拥有超过M个就绪连接。

  5. 定期回收就绪连接以防止过时连接。如果有超过N个就绪连接,则只需关闭最旧的连接。否则关闭它并重新打开另一个。

  6. 这样做的好处是可以在连接池中提供足够的就绪年轻连接,而不会使服务器过载。

雅加达的知识共享可持续发展已经做了所有的东西,你列出:

  • 它创造连接的需要并管理他们在一个游泳池
  • 它可以关闭连接,如果他们没有被用于某一段时间
  • 它可执行查询的连接上之前交给它出,如果有错误,连接被扔掉和一个新的创建。连接也可以定期测试而闲置。
  • 你可以设定限制的连接,将创建和最低数量的连接必须做好准备。限制当然在很大程度上取决于应用程序。
  • 我不知道怎样,但可持续发展知道什么时候一个连接不是被封闭和关闭是为了你扔的一个例外,你知道发生了什么事,当你看到你的记录。
  • 可持续发展已经超时参数,这是非常有用的。如果所有连接在游泳池被使用,它将等待一段时间的连接能回到游泳池,如果没有任何可用的达到限制时,你会得到一个错误。

你可以微调游泳池玩具的数量最少的连接,最大数目的接待建立和超时。一个较长的时间超时会让你有一个下限的连接,同时一个较短的时间超时可能会需要一个更大的数目。这在很大程度上取决于什么你的应用程序和如何使用的连接。

我同意亚光b,我们不应该重新发明轮子。

然而,根据的回答,使用Commons DBCP是有争议的。这个这个问题。 有更好的替代方案,如 c3po proxool

或者您可以使用依赖于rdbms的连接池机制。

我不确定什么样的上下文中,你使用的你的连接,但我可以分享什么似乎我的工作。

我用SQL服务器作为我的回端和结合使用缓存与它获得更好的业绩。我的做法是保持连接只开放,如果我真的需要它并不游泳池的连接,以便他们清理了,我可以看到在SQL活动监测完全是什么活动以及什么不是。每个连接所占的记忆,所以这是很好的保持沉闷的咆哮的时候他们不是必要的。

在我回答的连接打开和关闭问题,让我说,缓存是非常重要的。得到一个对象出来的高速缓存是要救你一吨的时间。在一些我的asp.net 应当缓存在,在开发我们发现,我几乎可以衡量的延迟而一个数据库叫它可能需要的任何地方从15毫秒到45ms来完成的话,这甚至不是考虑其他的延迟因素或载荷。其他方法,我使用的是一个很好的对象结构对于我的数据,因此,我只作一个数据库更新如果有什么变化。我已经实施了一些方法上我的对象o确保我做点IO为可能。

这就是说我们都知道,我们需要访问并写信给我们的DB在某一点所以我遵循两项原则:

  1. 保持门窗紧闭以节省能源。打开连接在一个地方意味着它不是在另一个(或存储器和其他资源的更多的限制)。我们已经把池关闭,因为它已导致更好的业绩。

  2. 我做尽可能多的批次或一次我可以当的连接是开放的。这是一个比较复杂,所以让我来解释一下。

    • 一种方法,我们使用的是通过我的连接物管如此,所有对象可以使用一个连接的对象。这种结果在一个连接正在打开和关闭而不是的也许10个或更多取决于你的应用程序。一个很好的例子,这是一个我们的采购模式,它利用电SQL服务器,用于收集统计数据和散列出复杂的订购模式。它没有任何意义,以保持开放和关闭连接的,当你做达到200+DB查找或任何应用程序。另一部分是,当我使用对象我尽量捆绑我的更新,以减少时间,我保持连接打开。这样做的一个scope_identity在插入的电话让我照顾我的两个入和查询的唯一ID加入到我目前缓存。早在一天当我第一次是发展中asp应用程序,我会实际上是开放的连接,尽快页开始载荷并将其关闭之后。我不建议这样做了。现在一天有一大受益于这些各种各样的抽象和层,我会建议任何新的程序员采取谨慎的关注。

我的两个分:

高速缓存数据!高速缓存数据!高速缓存数据!做点数据库访问尽可能的时候,你不能存,然后高速缓存数据!

为什么重新发明轮子?

有人已经解决了这个问题,而且更好。

如果您在Java世界中,可以使用 Commons DBCP

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top