2012-09-21 68 views
1

連接到UNIX機器,我知道,在數據庫連接池機制可以讓你保持許多交易數據庫之間的打開,然後只在最後關閉數據庫。 我使用的sshxcute(http://code.google.com/p/sshxcute/)從Java代碼連接到UNIX機器。但是如果我必須執行來自不同java文件的unix命令,則整個過程就會從連接到機器發生。我想保持會議之間打開這臺機器的很多電話。如何實現這一目標。基本上,我想要一些某種機制像連接池,它可以讓我打開(連接)到UNIX機器只有一次,當我從不同的Java類或方法要最後一次爲所有關閉會話/連接到UNIX機器執行儘可能多的指令。 。連接池機制,從Java代碼

+0

你真的需要一個池嗎?或者你只需​​要在你的類之間傳遞SSHExec實例? – MarkOfHall

+0

我不確定它是否可以正常工作,因爲這些調用是從不同的java類中的事件監聽器方法生成的,我如何從監聽器傳遞sshxcute實例。那麼他們怎麼能在第一個地方得到相同的sshxcute實例.. – stallion

回答

0

我不得不建立這樣池。這並不難。簡而言之,我的一般方法是:

  1. 創建一個類來管理池。

  2. 在該類中,創建一個Collection來保存可用的連接。 (哦,很好的韻律)。可能是一個LinkedList,但它可能是一個ArrayList等。創建第二個Collection來保存當前正在使用的連接。最初這些集合是空的。

  3. 在該類中創建一個可以調用以請求連接的函數。該函數檢查池中是否有連接。如果是這樣,它將選擇一個,將其從可用集合中刪除,將其添加到使用的集合中,然後將其返回給調用者。如果沒有,則創建一個新的,將其添加到使用的集合中,並將其返回給調用者。

  4. 創建一個可以調用來釋放連接的函數。該函數將集合作爲參數,將其從已用集合中移除,並將其添加到可用集合中。 (如果它不是用來收藏的,這意味着有人得到了一個沒有通過池去的連接。您可能希望將其添加到現有的集合反正,或者只是關閉它,把它扔掉。)

基本上就是這樣。當然,有一些細節需要考慮。像:

如果有上的最大連接數有限制嗎?如果是這樣,你必須保持計算你已經發出的連接數量,並且如果新的請求將超過該限制,則拋出異常而不是返回連接。 (或者可能返回null,具體取決於您想如何處理它。)

應該對可用池中保留的連接數有限制嗎?如果是這樣,當一個連接被釋放,而是將其自動添加到可用池,檢查池已經是最大尺寸,如果是,關閉連接,而不是將其返回到池。

get-connection函數在返回之前測試連接是個好主意。例如,當連接坐在游泳池中時,連接可能已超時。也許你可以發送一些低成本的消息,並確保你得到有效的回覆。

擁有已使用集合的主要原因是您可以監視連接泄漏,即有人請求連接,然後永不放棄它。我不是直接將連接放入已使用的集合中,而是通常創建一個包裝對象來保存它,同時也保留了它所發出的時間。然後,我放入一個函數,該函數使用一個計時器調用,該函數循環遍歷所使用的集合,並檢查是否有任何已經存在的可觀的長時間。根據連接的類型,您可能能夠檢查它最後一次實際使用的時間,或者做一些其他測試以查看調用者是否真的仍在使用它,或者如果它是連接泄漏。如果您知道您可以識別連接泄漏,您可以關閉它或將其返回到可用池。否則,您至少可以向日志中寫入消息,並定期檢查日誌以查看是否存在泄漏問題並將其解決。如果你沒有做任何連接泄漏跟蹤,那麼使用的集合可能是多餘的,可以消除。

0

這裏有幾個想法:
A.使用對象池。例如,您可以使用this之一。
這將讓你擁有幾個Unix連接池。 B.在應用程序級別進行某種類型的會話管理,
並擁有一個會話上下文,該會話上下文將保存從池中獲取的對象的引用。
會話開始後 - 您將嘗試從池中獲取連接。
一旦會話結束,您將返回連接到池。

請記住,您的應用程序會話與池中保存的對象之間可能沒有1:1的比例。
處理這個問題的一個可能的策略是在初始大小X處創建一個池,並且如果需要的話,讓它長到Y的大小。

,你將需要處理的另一個問題,是可能有某種「保活」請檢查您的連接活着
兩個策略我能想到的這裏有:
A.有定期檢查在連接上(比方說 - 使用ping)。
B.如果池中的某個連接斷開,則創建一個新連接。