2012-08-30 82 views
3

我的項目核心業務邏輯的一部分必須執行鏈接數據搜索。目前,我已經使用像這樣的單例會話bean來實現此部分(SPARQL是使用鏈接數據構建的RDF模型上的查詢語言)。Java EE應用程序體系結構中的Singleton vs Stateless bean

@Singleton 
@Startup 
public class SparqlEngine { 

    @PostConstruct 
    private void init() { 
     // Initialiaze the model by connecting to the database 
    } 

    public ResultSet searchBySparql(String sparqlQuery) { 
     // Perform the search on the model which is stored in the database 
    } 

    @PreDestroy 
    private void cleanup() { 
     // Close database connection 
    } 

} 

這個EJB被命名爲SparqlEndpoint另一個EJB負責轉換ResultSet到包含在由指定的語法的字符串形式的模型更舒適SearchResult對象暴露在我的應用程序的其他部分客戶端,結果總數和其他元數據。 SparqlEndpoint EJB簡單地爲@Stateless,並且具有由客戶端使用的本地接口。這些客戶端包括JSF託管的bean和一些將其公開爲SOAP和RESTful Web服務的EJB。

這是我想到的最合理的建築,但我需要知道我是否做得對。我應該使用Singleton bean來實現我現在正在執行的核心,還是使用Stateless會話bean更合適?數據庫連接初始化通常至少需要幾秒鐘的時間,並且它可能比NoSQL更有用,並且不支持事務。我不打算在這個bean中添加諸如寫入方法之類的東西。其他EJB是否無狀態是正確的?如果我想將我的索引引擎(在數據庫上執行寫操作)公開爲另一個EJB,我應該如何實現它?

在此先感謝。

+3

使SparqlEngine EJB成爲Singleton的基本原理是什麼?通過每個EJB容器只有一個bean,您將獲得哪些好處?爲什麼要創建額外的SLSB來返回SearchResult?爲什麼不向這個Engine SLSB添加一個方法來返回轉換? – basav

+0

我實際上沒有設計這樣的架構的堅實理由,我也不確定它是否是最好的方式。因爲初始化並不是一項簡單的任務,而且需要時間,所以我認爲在部署時做一次這樣的做法可能是一個好主意,並讓單身人員在已經初始化的模型上處理所有數據庫訪問任務(這對於應用程序快速響應查詢)。 –

+0

我介紹了Endpoint做一些鬆散的耦合和關注點分離。實際上有一個SparqlEngineLite EJB,它使用轉儲文件初始化模型,並在NoSQL集羣不可用的測試環境中使用。 Endpoint EJB可能在將來還有其他任務,與實際的引擎沒有多大關係。最後,Web服務EJB也將在未來增加。然而,這一切都只是我自己的思維方式,如果有人能指導我實現更好的目標,那將是非常愉快的。 –

回答

1

..我認爲這可能是一個好主意,在部署時做一次,並讓單身人士處理已初始化模型上的所有數據庫訪問任務(這對於應用程序響應查詢至關重要快速)...

到DB的連接管理不應該在SLSB內手動執行。你應該看看利用數據源API。管理網絡資源(例如數據庫連接等)最好留給應用服務器 - 特別是在您擁有的容器管理環境中。 App Server初始化並維護一個連接池。

...... Endpoint EJB在將來可能還有其他與實際引擎無關的任務。最後,也是Web服務EJB是受在未來增加...

你用這個詞未來兩次此評論。這是猜測,並介紹Accidential Complexity。當需要出現時,您可以隨時重新考慮因素。旨在保持簡單。設計和編碼未來永遠是昂貴的..

..dump文件,並在測試環境中,我們的NoSQL集羣不可用......

爲什麼不使用好mocking框架,而不是使用轉儲文件?單元測試不應該依賴於環境

+0

謝謝你的回答。我查看了HBase的JDBC驅動程序,並調查讓應用程序服務器管理我們的HBase連接。但是,我使用的庫利用HBase自己的API,我不確定我可以使用glassfish提供的數據源進行連接。如果是這樣的話,你認爲更好的方法是什麼?單身bean還是無狀態bean?關於未來,這指向下一個星期左右。我很確定這些EJB中的每一個都會很快變得更加厚實。嘲諷框架也是一個非常好的建議。我會調查它。再次感謝。 –

+0

看看你是否使用Apache DBCP來連接你的連接 - http://commons.apache.org/dbcp/ – basav

2

這很容易,使用單例可以更輕鬆地處理併發訪問資源的問題。您可以使用容器管理的併發或bean管理的併發。

通過使用無狀態會話bean,您將獲得性能,EJB容器將創建這些無狀態bean的許多實例池,並在請求即將發佈時將它們借給客戶端。即更適合多用戶訪問。