2017-07-25 48 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對象設置爲單例,那麼創建的對象數量將會非常少,從而提高性能。

相關問題