0

我有一个在 Apache Tomcat 上运行的 Java 开发的休息服务。该服务由一个类实现,我为它显式定义了一个构造函数。我正在对其进行负载测试,我发现构造函数被多次调用。然后在构造函数中分配的资源数量不断增加,并且可能比 GC 释放资源的速度更快。我试图理解构造函数被多次调用的原因。我想 Apache 卸载服务的速度太快了,然后必须再次创建它来处理新请求。关于为什么会发生这种情况的任何提示?

这只是我所拥有的一个片段:

@Path("/myservice")
public class ProcessService
{
    private DBConnection conn;
    final static public String APP_ID = "MY_APP";

    public ProcessService()
    {
        System.out.println("-----------------------CONSTRUCTOR CALLED --------------------------");
        conn = new DBConnection(APP_ID);
        System.out.println("-----------------------CONSTRUCTOR CALLED-2 --------------------------");
        ...
    }
...

提前致谢。

4

1 回答 1

1

这是非 CDI JAX-RS 应用程序的正常行为。您的问题的可能解决方案:

  • 使用 CDI(例如 JBoss)将您的应用程序移动到 EE 容器中,或者使用Weld将您的 Tomcat 变成支持 CDI 的容器并使用 CDI 范围

    @Path("/myservice")
    @ApplicationScoped
    public class ProcessService
    
  • 如果您的服务在每个请求上都被实例化,则以不会造成任何严重问题的方式重构您的应用程序。例如

    final static public String APP_ID = "MY_APP";
    private static DBConnection conn = new DBConnection(APP_ID);
    
    public ProcessService() {
        System.out.println("-----------------------CONSTRUCTOR CALLED --------------------------");
        // conn is now a static variable so the connection is created only once
        System.out.println("-----------------------CONSTRUCTOR CALLED-2 --------------------------");
    }
    
于 2013-10-25T17:40:34.227 回答