Java 如何在J2EEWeb应用程序中从服务层调用DAO方法
通常,现在很多应用程序都使用Spring,它负责应用程序中pojo类的生命周期。但是,如果我的应用程序由于其他一些问题而无法使用Spring呢。如何从应用程序的服务层转到DAO层 目前这就是我正在做的Java 如何在J2EEWeb应用程序中从服务层调用DAO方法,java,design-patterns,concurrency,object-lifetime,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 MyServiceImpl{
private static MyDAO daoInstance=new MyDAO();
public void someMethod(){
daoInstance.methodToCall();
}
}
public class MyDAO{
public void methodToCall(){
}
}
将MyServiceImpl中的DAO实例保持为静态可以确保所有ServiceImpl对象中只有一个实例。但是,如果许多用户同时访问同一段代码,这不会产生并发问题吗
但是,如果我不保持静态,那么每个MyServiceImpl对象都会有一个DAO实例。这不会在堆中留下这么多对象。如何管理这些对象的生命周期
我想了解从应用程序的一个层导航到另一个层的正确方法是什么,同时考虑并发性、性能和其他类似因素
谢谢您的帮助。这取决于您的要求和设计 你想控制资源吗?然后确保每个人都从一个位置(即singleton)获得它们 你担心表现吗?然后确保考虑所有因素,包括线程数(并发访问)、I/O、内存使用与对象等。 很难平衡所有非功能性需求,但理想情况下,在设计应用程序时,您必须根据需求和业务目标进行权衡
有关更多信息,请参阅。使DAO实例为静态与多线程无关。即使您将其声明为
myservicecimpl
的实例变量,您仍然可以有多个线程访问MyDAO
我仍然将您的
MyDAO
声明为实例变量,因为它占用的内存空间非常小。DAO应该没有太多(如果有的话)实例状态。这还应该确保它也是线程安全的。首先,服务类不应该直接调用DAO实例
服务和DAO之间的交互应该始终通过接口进行,以便使其松散耦合
您可以在服务类中将DAO实例创建为singleton,并且是线程安全的(即spring框架默认使用singleton),确保DAO中不使用全局变量
如果将DAO对象设置为singleton,则创建的对象数量将非常少,从而提高性能。如果daoInstance是静态的,并且假设有多个用户访问web应用程序中的同一someMethod()。行为是可预测的(线程安全的)吗?