2017-05-18 12 views
-1

私の春のMVCアプリケーションでは、以下の問題があります。我々は春には新しく、春3.xを使用しています。以下の問題を説明しますが、明確でない場合はコメントしてください。 Spring MVCアプリケーションが同期していない

  • 我々はサービスと リポジトリ豆の下に、以下のコードに示すSampleBeanにオブジェクトが後でトリガリクエストで上書き を取得していると同時に同時要求をトリガ

    。コメントを次のように言い換える

  • は、スレッド1におけるSampleBeanにの値がスレッドで2

スケルトンコードをSampleBeanにする値で上書き
を得ています。

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 
    } 
} 

更新: 私は、サービスクラスのメソッドすべてのものに同期を追加する場合要求としてうまくいく1つずつエストが処理されています。追加することなくこれを修正する方法を同期させました。

+0

シングルトンに状態を保存しないでください。デザインに欠陥があります。あなたの 'SampleBean'はそこにあるべきではありません。これはメソッドの引数としてのみ存在し、 '@ ModelAttribute'で注釈が付けられることが望ましい。 –

答えて

0

MyServiceの@Serviceは、デフォルトではsingletonであり、SampleBeanも同じです。 SampleBeanスコープをシングルトンから別のものに変更しようとすることができます。より良い方法は、SampleBeanのインスタンス変数を使用せず、代わりにMyServiceのupdateDetailsToDBメソッド要求ごとに新しいインスタンスを作成することです。 - おめでとうございます。

-1

実際には、インスタンス変数を使用しているため、設計が間違っています。 MyAppviceクラスの@Scope("prototype")または@Scope( "request")(Webアプリケーションの場合)を使用すると、それを動作させることができます。

+0

私はデフォルトでMyServiceで@Serviceを使用していますが、これはシングルトンの権利ですか? – prabu

+1

@prabuあなたは正しいです。 MyServiceの@Serviceはデフォルトではシングルトンであり、SampleBeanも同じです。 SampleBeanスコープをシングルトンから別のものに変更しようとすることができます。より良い方法は、SampleBeanのインスタンス変数を使用せず、代わりにMyServiceの 'updateDetailsToDB'メソッドリクエストごとに新しいインスタンスを作成することです。 – HaoChih

+0

申し訳ありません、プロトタイプを追加してください。 – DineshPandian

関連する問題