2017-05-18 67 views
-1

在我的Spring MVC應用程序中,我們遇到了以下問題。我們是春季新手,並使用spring 3.x.請解釋下面的問題,如果不明確,請評論。Spring MVC應用程序不同步

  • 當我們在觸發同時下面的服務和 庫豆,在以下代碼中所示的SampleBean對象越來越 與後觸發請求重寫併發請求。

  • 換句話說,SampleBean在線程1中的值是變
    與SampleBean的值覆蓋在線索2

骨架代碼帶註釋如下。

MyService.java

@Service public class MyService { 
     @Autowired private SampleBean sampleBean; 
     @Autowired private MyDao myDao; 
     public void updateDetailsToDB() throws Exception { 
      sampleBean.setXXX("xxx"); 
      sampleBean.setYYY("yyy"); 
      myDao.updateDetailsToDB(sampleBean); 
     } 
    } 

MyDao.java

@Repository 
public class MyDao { 
    @Autowired private SampleBean sampleBean; 
    @Autowired private MyDao myDao; 
    public void updateDetailsToDB(SampleBean sampleBean) throws Exception { 
     //Step 1: Print the data in sampleBean to console - *At this point the the sampleBean object prints the correct value specific to the thread.* 
     //Step 2: Insert data to table 1 into db using **jdbcTemplate**, the data will be taken from the bean 
     sampleBean getters. 
     //Step 3: Print the data in sampleBean to console.- *At this point the sampleBean value always print the values of the second request and it overwrites the value of the bean in first request as well which is not the case in Step 1.* 
     //Step 4: Insert data to table 2 
    } 
} 

更新: 如果我添加同步在服務類中的方法,然後每一件事按要求正常工作ests正在逐一處理。如何解決這個問題,而不需要添加同步

+0

你不應該保持在單身國家,你的設計是有缺陷的。你的'SampleBean'不應該在那裏。它應該只作爲方法參數存在,最好用'@ ModelAttribute'註釋。 –

回答

0

默認情況下,MyService中的@Service是單例,SampleBean也是。您可以嘗試將SampleBean範圍從singleton更改爲另一個。也許更好的方法是不使用SampleBean的實例變量,而是爲MyService的每個updateDetailsToDB方法請求創建一個新實例。 - 感謝郝池

-1

其實你的設計是錯誤的,因爲你使用的是實例變量。 但在MyService類中使用@Scope("prototype")或@Scope(「request」)(如果它是web應用程序),則可以使其工作。

+0

因爲我在默認情況下在MyService中使用@Service,它將會是單身權利嗎? – prabu

+1

@prabu你是對的。 MyService中的@Service默認爲singleton,SampleBean也是如此。您可以嘗試將SampleBean範圍從singleton更改爲另一個。也許更好的方法是不使用SampleBean的實例變量,而是爲MyService的每個'updateDetailsToDB'方法請求創建一個新實例。 – HaoChih

+0

對不起添加原型.. – DineshPandian