2017-07-25 99 views
2

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

我想了解从应用程序的一层导航到其他层保持并发性,性能和其他此类因素的正确方法。

感谢您的任何帮助。

回答

0

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

你想控制资源吗?那么确保每个人都从一个地方获得他们,即单身人士。

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

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

欲了解更多信息,请参阅Non-Functional Requirements

+0

如果daoInstance是静态的并且假定有多个用户在Web应用程序中访问相同的someMethod()。行为是否可预测(线程安全)? – Arunabh

0

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

我仍然会声明你的MyDAO为实例变量,因为它只占用很少的内存空间。在任何情况下,DAO都不应该有多少。这也应该确保它也是线程安全的。

1

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

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

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

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

相关问题