【发布时间】:2012-08-30 14:55:39
【问题描述】:
我项目核心的部分业务逻辑必须对链接数据执行搜索。目前,我已经使用像这样的单例会话 bean 实现了这一部分(SPARQL 是 RDF 模型上的一种查询语言,它是使用链接数据构建的)。
@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 向我的应用程序的其他部分公开,该 EJB 负责将 ResultSet 转换为更舒适的 SearchResult 对象,该对象包含字符串形式的模型,具有指定的语法由客户端、结果总数和其他元数据。 SparqlEndpoint EJB 就是@Stateless,并且有一个本地接口供客户端使用。这些客户端包括 JSF 托管 bean 和几个将其公开为 SOAP 和 RESTful Web 服务的 EJB。
这是我想到的最合理的架构,但我需要知道我是否做得对。我应该像现在一样使用Singleton bean 来实现核心,还是使用Stateless 会话bean 更合适?数据库连接初始化通常至少需要几秒钟,注意它可能比它是 NoSQL 并且不支持事务更有用。我不打算向这个 bean 添加诸如 write 方法之类的任何东西。其他 EJB 是无状态的是否正确?如果我想将我的索引引擎(对数据库执行写入)公开为另一个 EJB,我应该如何实现它?
提前致谢。
【问题讨论】:
-
使 SparqlEngine EJB 成为单例的基本原理是什么?每个 EJB 容器只有一个 bean 有什么好处?为什么要创建额外的 SLSB 来返回 SearchResult?为什么不向这个 Engine SLSB 添加一个方法来返回转换?
-
我实际上没有充分的理由来设计这样的架构,我也不确定它是否是最好的方式。由于初始化不是一项简单的任务并且需要时间,我认为在部署时执行一次并让单例处理已经初始化的模型上的所有数据库访问任务可能是一个好主意(这对于应用程序至关重要快速响应查询)。
-
我引入了 Endpoint 来进行某种松散耦合和关注点分离。实际上有一个 SparqlEngineLite EJB,它使用转储文件初始化模型,并用于我们的 NoSQL 集群不可用的测试环境。 Endpoint EJB 将来可能还有其他与实际引擎关系不大的任务。最后,Web 服务 EJB 也将在未来添加。不过,这一切只是我自己的想法,如果有人能指导我取得更好的成绩,我将不胜感激。
标签: jakarta-ee architecture singleton ejb stateless-session-bean