当前位置: 首页 > 面试题库 >

通过Servlet正确使用有状态Bean

勾长卿
2023-03-14
问题内容

当前,我们将一个有状态的bean注入到Servlet中。问题在于,有时Caused by: javax.ejb.ConcurrentAccessException: SessionBean is executing another request. [session-key: 7d90c02200a81f-752fe1cd-1]在有状态Bean上执行方法时会得到。

public class NewServlet extends HttpServlet {  
    @EJB  
    private ReportLocal reportBean;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
           String[] parameters  = fetchParameters(request);
           out.write(reportBean.constructReport(parameters));
        } finally { 
            out.close();
        }
    } 
}

在上面的代码中,constructReport将检查是否需要打开到报表中指定的数据库的新连接,然后根据查询创建HTML中的报表,该查询是根据指定的参数构建的。

之所以选择在无状态Bean上使用有状态Bean,是因为我们需要打开与未知数据库的数据库连接并对其执行查询。对于无状态Bean,重复地打开和关闭与该Bean的每个注入实例有关的数据库连接的效率极低。


问题答案:

这不是打算使用有状态会话Bean(SFSB)的对象。它们旨在保留会话状态,并绑定到用户的http会话以保留该状态,就像将状态直接存储在会话中的重量级替代方法一样。

如果您想保留数据库连接之类的东西,那么有更好的方法来解决它。

最好的选择是使用连接池。您应该 始终
使用连接池,并且如果您在应用程序服务器中运行(如果您使用的是EJB,则在其中),那么您可以轻松地使用应用程序服务器的数据源配置来创建连接池,并使用在您的
无状态 会话bean(SLSB)中。



 类似资料:
  • 我已经开始学习ReactJS,有一个关于无状态和有状态组件的问题。一般来说,我遵循组件和容器的分离,如下所示。有状态函数在组件文件夹中,其他逻辑操作在容器文件夹下。文件夹结构 让我们思考材料UI下拉列表。 为了打开和关闭下拉菜单和方法更改打开状态,这意味着它是有状态组件。但没有其他变化(省略年龄设置)。它似乎是可重用的组件,但包括状态与非常简单的操作,如打开和关闭。我应该放入哪个文件夹?容器还是组

  • 我正在使用Glassfish服务器(一个简单的购物车)尝试我的第一个EJB。我打算为每个Http会话使用CartBean。如果我的车豆跟着-

  • 我正在开发一个小待办事项应用程序,作为使用React的练习。我有一个这样的模拟服务: 在我的React应用程序中,我有一些包含TODO的状态: 是一个函数,我将它传递到我的组件中,当我想完成这样一个Todo时使用: 因此,每当用户单击复选框并使用调用时,就会从服务对象中删除它,并且状态应该更新,但最奇怪的事情发生了。 当调用时,todo将被正确删除,但当调用时,旧的todo仍然存在!如果我将内容写

  • 我读过关于使用和注释及其差异的不同文章,包括这篇文章。从定义上看,当客户端/web层之间需要/创建会话时,使用,而在业务逻辑层中需要。但是,在实施它们时,我仍然没有掌握真正的区别。下面是一个简单的例子 bean如何维护给定用户和服务器之间的Http会话?也就是说,如果我在不同的计算机上打开了购物车,我应该能够看到我的购物车,它与我的用户配置文件相关联。这是如何建立的 谢谢。

  • HTTP 请求和 HTTP 响应消息的格式是类似的,结构如下: 初始状态行 + 回车换行符(回车+换行) 零个或多个标题行+回车换行符 一个空白行,即回车换行符 一个可选的消息主体,比如文件、查询数据或查询输出 例如,服务器的响应头如下所示: HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (Blan

  • 我想添加一个监视器来检测不正常的服务,并在这种情况下发送警报。我已经公开了一个简单的REST API - ,它返回一个JSON,例如。 然后,我已将 添加到我的 site24x7 帐户,将内容检查响应格式设置为 JSON,现在我应该提供要断言的 JSONPath。 在JSONPath在线测试器中,当我使用时,我得到。但我想我应该尝试断言该返回值。 使用以下表达式不起作用 我想我应该使用或过滤来评估