1

我知道数据库中的连接池机制使您可以在许多事务之间保持数据库打开,然后仅在最后关闭数据库。我正在使用 sshxcute( http://code.google.com/p/sshxcute/ ) 从 java 代码连接到 unix 机器。但如果我必须从不同的 java 文件执行 unix 命令,则从连接到机器的整个过程都会发生。我想在对这台机器的多次调用之间保持会话打开。如何实现这一点。基本上我想要一些机制,比如连接池,它让我只打开(连接)到 unix 机器一次,并从不同的 java 类或方法执行尽可能多的指令,最后一次关闭到 unix 机器的会话/连接。 .

4

2 回答 2

0

这里有几个想法:
A. 使用对象池。例如,您可以使用这个
这将使您拥有一个包含多个 Unix 连接的池。B. 在您的应用程序级别进行某种会话管理,
并拥有一个会话上下文,该上下文将包含对从池中获取的对象的引用。
一旦会话开始 - 您将尝试从池中获取连接。
会话结束后,您会将连接返回到池。

请记住,您的应用程序会话与池中保存的对象之间可能没有 1:1 的比例。
处理此问题的一种可能策略是创建一个初始大小为 X 的池,并在需要时让它增长到大小 Y。

您需要处理的另一个问题可能是进行某种“保持活动”检查以查看您的连接是否
有效 我可以在这里想到的两种策略是:
A. 定期检查连接(比如说 - 使用平)。
B. 如果池中的一个连接断开,则创建一个新连接。

于 2012-09-21T16:34:26.427 回答
0

我不得不创建这样的池。这并不难。简而言之,我的一般方法是:

  1. 创建一个类来管理池。

  2. 在该类中,创建一个 Collection 来保存可用的连接。(哦,押韵很好。)可能是 LinkedList,但也可能是 ArrayList 等。创建第二个 Collection 来保存当前正在使用的连接。最初这些集合是空的。

  3. 在该类中创建一个可以调用以请求连接的函数。该函数检查池中是否有任何连接。如果是这样,它会选择一个,将其从可用集合中删除,将其添加到已使用的集合中,然后将其返回给调用者。如果没有,它会创建一个新的,将其添加到已使用的集合中,并将其返回给调用者。

  4. 创建一个可以调用以释放连接的函数。该函数将集合作为参数,将其从已使用的集合中删除,并将其添加到可用的集合中。(如果它不在 used 集合中,这意味着有人在没有通过池的情况下获得了连接。您可能希望将其添加到可用集合中,或者只是将其关闭并将其丢弃。)

基本上就是这样。当然,还有很多细节需要考虑。喜欢:

是否应该限制最大连接数?如果是这样,您必须计算已发出的连接数,并且如果新请求会使您超过该限制,则抛出异常而不是返回连接。(或者可能返回 null,具体取决于您要如何处理它。)

是否应该限制保留在可用池中的连接数?如果是这样,当释放连接时,不是自动将其添加到可用池中,而是检查池是否已经达到最大大小,如果是,则关闭连接而不是将其返回到池中。

get-connection 函数在返回连接之前测试连接是个好主意。例如,当它位于池中时,连接可能已超时。也许您可以发送一些低成本的消息并确保您得到有效的回复。

使用已用集合的主要原因是您可以观察连接泄漏,即有人请求连接,然后再不返回。我通常不会将连接直接放入已使用的集合中,而是创建一个包装器对象来保存它,该对象还保留它被分配的时间。然后我放入一个用计时器调用的函数,该计时器循环遍历已使用的集合并检查是否有任何东西已经存在了很长时间。根据连接的类型,您可以检查它最后一次实际使用的时间或进行一些其他测试以查看调用者是否真的仍在使用它,或者它是否是连接泄漏。如果您确信可以识别​​连接泄漏,则可以将其关闭或将其返回到可用池中。否则,您至少可以将消息写入日志,并定期检查日志以查看是否存在泄漏问题并进行追踪。如果您不进行任何连接泄漏跟踪,那么使用的集合可能是多余的并且可以被消除。

于 2012-09-21T16:33:59.253 回答