3

我项目核心的部分业务逻辑必须对链接数据执行搜索。目前,我已经使用像这样的单例会话 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 由另一个名为 EJB 的 EJB 暴露给我的应用程序的其他部分,该 EJBSparqlEndpoint负责将 EJB 转换ResultSet为更舒适的SearchResult对象,该对象包含字符串形式的模型,其语法由客户端指定,结果总数和其他元数据。SparqlEndpointEJB 很简单,@Stateless并且具有客户端使用的本地接口。这些客户端包括 JSF 托管 bean 和几个将其公开为 SOAP 和 RESTful Web 服务的 EJB。

这是我想到的最合理的架构,但我需要知道我是否做得对。我应该像现在这样使用Singletonbean 来实现核心,还是Stateless会话 bean 更合适?数据库连接初始化通常至少需要几秒钟,注意它可能比它是 NoSQL 并且不支持事务更有用。我不打算向这个 bean 添加诸如 write 方法之类的任何东西。其他 EJB 是无状态的是否正确?如果我想将我的索引引擎(在数据库上执行写入)公开为另一个 EJB,我应该如何实现它?

提前致谢。

4

2 回答 2

2

这很容易,使用单例,您可以更轻松地处理并发访问资源的问题。您可以使用容器管理的并发或 bean 管理的并发。

通过使用无状态会话 bean,您将获得性能,EJB 容器创建一个包含这些无状态 bean 的许多实例的池,并在请求到来时将它们借给客户端。即更好的多用户访问。

于 2012-08-30T19:05:13.733 回答
1

..我认为在部署时执行一次并让单例处理已初始化模型上的所有数据库访问任务可能是个好主意(对于应用程序快速响应查询至关重要)...

不应在 SLSB 内手动管理与 DB 的连接。您应该考虑利用 Datasource api。管理网络资源(例如数据库连接等)最好留给应用服务器 - 特别是在像您拥有的容器管理环境中。App Server 初始化并维护一个连接池。

... Endpoint EJB 将来可能还有其他与实际引擎关系不大的任务。最后,Web 服务 EJB 也将在未来添加...

您在此评论中两次使用了未来一词。这是推测并引入了意外复杂性。当需要时,您总是可以重新考虑因素。旨在保持简单。为未来设计和编码总是很昂贵的。

..dump 文件,用于我们的 NoSQL 集群不可用的测试环境......

为什么不使用一个好的模拟框架而不是使用转储文件?单元测试不应该依赖于环境

于 2012-08-30T17:55:32.447 回答