Tomcat Servlet问题

Tomcat Servlet问题,tomcat,servlets,jakarta-ee,Tomcat,Servlets,Jakarta Ee,我编写了一个简单的Servlet,它连接到数据库,检索一些信息,并编写一个json响应。我在用tomcat 关于servlet,有几个问题: 1) 就我所理解的容器而言,如果同时接收请求,将它们放入队列中,最后每次只执行一个Servlet,这是真的吗?或者容器使用不同的servlet实例并行化请求 2) 为了连接到DB,我在另一个类中创建了连接,该类在contextInitialized中实现ServletContextListener,并在contextDestroyed中关闭它。这是正确的方

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

关于servlet,有几个问题:

1) 就我所理解的容器而言,如果同时接收请求,将它们放入队列中,最后每次只执行一个Servlet,这是真的吗?或者容器使用不同的servlet实例并行化请求

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

  • 不,不是。这些请求使用单个servlet实例并发执行。只有在tomcat线程池中没有可用线程来处理请求时,它们才会排队

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


  • 好的,谢谢。“使用一个setvlet实例”是什么意思?为了并发执行,它们(servlet实例)不需要每个请求都有一个吗?如果只有一个实例,那么它们如何同时被导出呢?好吧,多个线程同时调用唯一的servlet对象方法。如果您认为一个对象一次只能由一个线程使用,那么您需要阅读关于线程的教程,因为您确实误解了线程。好的,谢谢。我得到了线的部分。另一个小问题:关于我在Tomcat中定义的数据源,我正在应用程序中使用它,但我怀疑,在实现ServletContextListener的类中创建连接就足够了,还是我必须进行查找并为每个请求创建连接?请再次阅读我的回答。第2点说:每个事务都应该从数据源获得自己的连接。如果您在侦听器中创建了一次连接,并且在任何地方都使用它,那么您显然没有遵循该规则。