如何从J2EE Web应用程序中的Service层调用DAO方法

时间:2017-07-25 19:12:27

标签: java design-patterns concurrency object-lifetime

现在很多应用程序通常使用Spring来处理应用程序中pojo类的生命周期。但是如果我的应用程序由于其他一些问题而无法使用Spring会怎样。如何从应用程序的服务层转到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。这不会在堆中留下这么多对象。如何管理这些对象的生命周期。

我想了解从应用程序的一个层导航到其他层的正确方法是什么,同时考虑到并发性,性能和其他因素。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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

你担心表现吗?然后确保考虑所有因素,包括线程数(并发访问),I / O,对象内存使用情况等...

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

有关更多信息,请参阅Non-Functional Requirements

答案 2 :(得分:0)

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

我仍然会将你的MyDAO声明为实例变量,因为它在内存中占用的空间非常小。 DAO在所有实例状态下都不应该有多少。这也应该确保它也是线程安全的。