2010-02-17 79 views
1

我需要實現由外部系統返回的會話池, 這樣我就可以迅速只要一個需要(創建會話需要一段時間)重用他們。 我已經使用數據源創建了一個數據庫連接池(來自Apache的DBCP),並且它是 一個實現的解決方案。對象池:HOWTO

我們在一般情況下,用什麼來凝聚任意對象,以及是否有實現的解決方案,即對象,而不是接口,對付痛苦的任務是什麼?

第二個問題是,我們如何測試會話是否還活着?在對象池中是否存在一個特定的方法,用於查詢Session自己的方法?

第三個非常重要的問題是,如果對象池對象是靜態的?我從系統中提取的一系列對象必須在不同的Web應用程序之間共享。所以說,我們提取5個會話。應用程序A查詢POOL並獲得第一個可用的會話。現在剩下4場會議。另一個應用程序B啓動並查詢相同的池。等共享池。在相同的Web應用程序的不同實例之間,運行在同一臺機器上。

+1

如果你已經熟悉了下議院DBCP,那麼這是基於共享池,這是一個通用對象池庫。 – skaffman 2010-02-17 08:23:26

+0

@skaffman這可能是,但在這裏我只看到一些什麼也不做的實現http://commons.apache.org/pool/apidocs/org/apache/commons/pool/package-summary.html這還不夠有效。有更具體的東西嗎? – EugeneP 2010-02-17 08:46:02

+1

你需要擴展'BaseObjectPool',這很簡單。你需要做一些*工作... – skaffman 2010-02-17 08:50:04

回答

1
  1. 對於對象的通用池, 你有那一個Apache Commons project
  2. 對於測試 表示一個會話存在,有 不同的方式,但其中很多是 不可靠。而可靠的 (在dual上進行查詢)很慢。 你可以看看c3p0, 它有內置的功能。
  3. 只要你的許多webapps在同一個WAR文件中,我想你可以使用這個靜態池對象。儘管個人而言,我更喜歡單身人士比靜態對象更多,而靜態對象只有實用方法和常量。

一般來說,我是Hibernate的忠實粉絲......你有沒有考慮過將它用於你的應用程序?您仍然可以通過它進行簡單的SQL查詢,併爲您處理您的池和緩存。

+0

@mlaverd第3段 - 我稍微修改了我的問題以進一步解釋「應用程序之間共享」是什麼意思 – EugeneP 2010-02-17 08:39:23

+0

@EugeneP相應地更新了我的答案。 – malaverdiere 2010-02-18 04:40:32

1

如果您使用的是J2EE應用服務器,然後考慮建設實現了Java連接器架構(JCA)的組件。組件的每個實例都訪問單個會話,並將容器配置爲最多創建5個(來自您的示例)實例。容器管理池和組件的生命週期。此外,部署在該應用程序服務器上的所有應用程序都共享組件的池。

如果我沒記錯的話(它已經有一段時間)還有一個辦法以通知的情況下死亡的容器。在這種情況下,容器將刪除死實例並實例化一個新實例。

某些非J2EE應用程序服務器支持JCA組件,因此即使您未使用傳統的J2EE容器,也要檢查它。

+0

JCA確實支持池化,但用於入站/出站連接。國際海事組織,如果你只是想集中,這有點矯枉過正。 – ewernli 2010-02-17 12:40:19

+0

這個問題提到管理由外部系統提供的會話池並在獨立應用程序之間共享。像這樣的需求通常會在類似許可的情況下限制來自單個源(如盒子或CPU)的連接數量。 – Faron 2010-02-17 12:56:16

+0

你其實很對。 JCA可能是適當的。如果池爲不同的Web應用程序共享,它也可以解決Classloader問題。 (無論如何我已經投票支持你)。 – ewernli 2010-02-17 18:40:42