【问题标题】:How do I call a DAO method from Service layer in a J2EE web application如何从 J2EE Web 应用程序中的服务层调用 DAO 方法
【发布时间】:2017-07-25 19:12:27
【问题描述】:

如今,通常很多应用程序都使用 Spring,它负责处理应用程序中 pojo 类的生命周期。但是如果我的应用程序由于其他一些问题而无法使用 Spring 怎么办。如何从应用的 Service 层到 DAO 层。

目前这就是我正在做的事情。

public class MyServiceImpl{

    private static MyDAO daoInstance=new MyDAO();

    public void someMethod(){
        daoInstance.methodToCall();
    }

}

public class MyDAO{

   public void methodToCall(){


   }

}

将 MyServiceImpl 中的 daoInstance 保持为静态可确保所有 ServiceImpl 对象中只有一个实例。但是如果很多用户同时访问同一段代码,这不会造成并发问题吗?

但是,如果我不保持静态,每个 MyServiceImpl 对象都会有一个 daoInstance。这不会在堆中留下这么多对象吗?如何管理这些对象的生命周期。

我想了解从应用程序的一层导航到另一层的正确方法是什么,同时牢记并发性、性能和其他此类因素。

感谢您的帮助。

【问题讨论】:

    标签: java design-patterns concurrency object-lifetime


    【解决方案1】:

    首先,Service类不应该直接调用DAO实例。

    服务和 DAO 之间的交互应该始终通过接口进行,以使其松散耦合。

    您可以在服务类中将 DAO 实例创建为单例,并且是线程安全的(即 Spring 框架默认使用单例)确保 DAO 中不使用全局变量。

    如果将 DAO 对象设为单例,则创建的对象数量会非常少,从而提高性能。

    【讨论】:

      【解决方案2】:

      这取决于您的要求和设计。

      你想控制资源吗?然后确保每个人都从一个位置(即单身人士)获得它们。

      您担心性能吗?然后确保考虑所有因素,包括线程数(并发访问)、I/O、对象内的内存使用量等......

      平衡所有非功能性需求非常困难,但理想情况下,在设计应用程序时,您必须根据需求和业务目标进行权衡。

      更多信息请参考Non-Functional Requirements

      【讨论】:

      • 如果 daoInstance 是静态的,并且假设有多个用户在 Web 应用程序中访问同一个 someMethod()。行为是否可以预测(线程安全)?
      【解决方案3】:

      将 DAO 实例设为静态与多线程无关。即使您将其声明为MyServiceImpl 的实例变量,您仍然可以有多个线程访问MyDAO

      我仍然会将您的 MyDAO 声明为实例变量,因为它占用的内存空间非常小。 DAO 不应该有太多的实例状态(如果有的话)。这也应该确保它也是线程安全的。

      【讨论】:

        猜你喜欢
        • 2013-09-09
        • 1970-01-01
        • 2018-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多