现在很多应用程序通常使用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。这不会在堆中留下这么多对象。如何管理这些对象的生命周期。
我想了解从应用程序的一个层导航到其他层的正确方法是什么,同时考虑到并发性,性能和其他因素。
感谢您的帮助。
答案 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在所有实例状态下都不应该有多少。这也应该确保它也是线程安全的。