【问题标题】:Servlet questions [duplicate]Servlet问题[重复]
【发布时间】:2018-05-19 12:01:05
【问题描述】:

我写了一个简单的 Servlet 连接到数据库,检索一些信息结束写一个 json 响应。我正在使用 tomcat。

关于 servlet 的几个问题:

1) 据我了解容器,如果接收到同时请求,将它们放入队列中,最后一次只执行一个 Servlet,是这样吗?还是容器使用不同的 Servlets 实例并行化请求?

2)为了连接到数据库,我在另一个类中创建连接,该类在 contextInitialized 中实现 ServletContextListener 并在 contextDestroyed 中关闭它。这是正确的方法吗?如果我想并行化,我应该使用不同的连接,对吗?

【问题讨论】:

    标签: tomcat servlets jakarta-ee


    【解决方案1】:
    1. 不,不是。这些请求使用单个 servlet 实例同时执行。只有当 tomcat 线程池中没有可用的线程来处理请求时,它们才会排队。

    2. 不,不是。每个事务都应该从连接池(一个数据源,通常由 Tomcat 在 JNDI 中公开)获取自己的连接,使用此连接完成其工作,提交或回滚,然后关闭连接以将其返回给池。

    【讨论】:

    • 好的,谢谢。 “使用单个 setvlet 实例”是什么意思?为了同时执行,它们(servlet 实例)是否需要为每个请求一个?如果只有一个实例,它们如何同时被执行?
    • 嗯,多个线程同时调用唯一的 servlet 对象方法。如果您认为一个对象一次只能由一个线程使用,那么您需要阅读有关线程的教程,因为您真的误解了线程。
    • 好的,谢谢。我得到了线程部分。另一个小问题:关于数据源,我已经在 Tomcat 中定义它并在应用程序中使用它,但我怀疑,在实现 ServletContextListener 的类中创建连接就足够了,还是我必须进行查找和为每个请求创建连接?
    • 再次阅读我的答案。第 2 点说:每个事务都应该从数据源获得自己的连接。如果您在侦听器中创建一次连接,然后在任何地方使用它,那么您显然没有遵循该规则。
    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 2020-08-03
    • 2015-03-14
    • 2020-01-10
    • 2011-04-04
    • 2023-03-07
    相关资源
    最近更新 更多