【问题标题】:Singleton vs Stateless beans in the architecture of a Java EE applicationJava EE 应用程序架构中的单例与无状态 bean
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    您在此评论中两次使用了未来这个词。这是猜测并介绍Accidential Complexity。当需要时,您总是可以重新考虑因素。旨在保持简单。为未来设计和编码总是很昂贵的。

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

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

    【讨论】:

    • 感谢您的回答。我查看了 HBase 的 JDBC 驱动程序,并将研究让应用服务器管理我们的 HBase 连接。但是,我使用的库利用了 HBase 自己的 API,我不确定是否可以使用 glassfish 提供的数据源进行连接。如果是这样,您认为更好的方法是什么?单例 bean 还是无状态 bean?关于未来,这指向下一周左右。我很确定这些 EJB 很快就会变得更厚。 mocking 框架也是一个非常好的建议。我会调查的。再次感谢。
    • 看看你是否使用 Apache DBCP 来池化你的连接 - commons.apache.org/dbcp
    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2012-03-13
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多