在 HttpServlet 中声明自己的方法是线程安全的吗?
Is it thread safe to declare own methods in a HttpServlet?
我有一个 servlet,它获取数据然后保存它。这是一个粗略的片段:
@WebServlet("/ListenerServlet")
public class ListenerServlet extends HttpServlet {
@Inject
private PersistService service;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String toPersist = getDataFromRequest();
service.persist(toPersist);
}
我的问题
- 这样通过 CDI 注入 (requestScoped) 服务可以吗?
- 我可以在 servlet 中创建自己的(非静态)方法并且是线程安全的吗?我需要同步关键字吗?
自己的方法:
private void doPersist(String toPersist) {
service.persist(toPersist);
}
拥有自己的方法绝对没问题 - 只要它们也是线程安全的。注入 PersistService 是将后备存储放入 servlet 的好方法,但 PersistService 也是线程安全的仍然很重要。例如,如果您在 class 中有一个静态 EntityManager,那么它是 而不是 线程安全的,无需一些额外的同步。但是,如果您以线程安全的方式进行持久化,那么您应该没问题。
总的来说,您使用的模式是我用过很多次并且效果很好的模式。
你可以参考这些问题:
Regarding thread safety of servlet
Why Servlets are not thread Safe?
If my Servlet instance variable is of type StringBuffer, is it thread-safe?
我有一个 servlet,它获取数据然后保存它。这是一个粗略的片段:
@WebServlet("/ListenerServlet")
public class ListenerServlet extends HttpServlet {
@Inject
private PersistService service;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String toPersist = getDataFromRequest();
service.persist(toPersist);
}
我的问题
- 这样通过 CDI 注入 (requestScoped) 服务可以吗?
- 我可以在 servlet 中创建自己的(非静态)方法并且是线程安全的吗?我需要同步关键字吗?
自己的方法:
private void doPersist(String toPersist) {
service.persist(toPersist);
}
拥有自己的方法绝对没问题 - 只要它们也是线程安全的。注入 PersistService 是将后备存储放入 servlet 的好方法,但 PersistService 也是线程安全的仍然很重要。例如,如果您在 class 中有一个静态 EntityManager,那么它是 而不是 线程安全的,无需一些额外的同步。但是,如果您以线程安全的方式进行持久化,那么您应该没问题。
总的来说,您使用的模式是我用过很多次并且效果很好的模式。
你可以参考这些问题:
Regarding thread safety of servlet
Why Servlets are not thread Safe?
If my Servlet instance variable is of type StringBuffer, is it thread-safe?