我的項目核心業務邏輯的一部分必須執行鏈接數據搜索。目前,我已經使用像這樣的單例會話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,我應該如何實現它?
在此先感謝。
使SparqlEngine EJB成爲Singleton的基本原理是什麼?通過每個EJB容器只有一個bean,您將獲得哪些好處?爲什麼要創建額外的SLSB來返回SearchResult?爲什麼不向這個Engine SLSB添加一個方法來返回轉換? – basav
我實際上沒有設計這樣的架構的堅實理由,我也不確定它是否是最好的方式。因爲初始化並不是一項簡單的任務,而且需要時間,所以我認爲在部署時做一次這樣的做法可能是一個好主意,並讓單身人員在已經初始化的模型上處理所有數據庫訪問任務(這對於應用程序快速響應查詢)。 –
我介紹了Endpoint做一些鬆散的耦合和關注點分離。實際上有一個SparqlEngineLite EJB,它使用轉儲文件初始化模型,並在NoSQL集羣不可用的測試環境中使用。 Endpoint EJB可能在將來還有其他任務,與實際的引擎沒有多大關係。最後,Web服務EJB也將在未來增加。然而,這一切都只是我自己的思維方式,如果有人能指導我實現更好的目標,那將是非常愉快的。 –