6

インスタンス変数がSpring IOCによって管理され、設計がステートレスでスレッドセーフと呼ばれるシングルトンである場合、このタイプの設計は結果としてクラスタ化されたサーバーにスケーリングされる可能性があると想定しました。以下に概説する私の仮定は正しいですか?

@Repository("myDao")
public class MyDao implements Dao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Value("${sqlFoo}")
    private String foo;

    @Override
    public Integer getMyInt(String str) {
      return jdbcTemplate.queryForInt(foo, str);
    }

次に、次のように注入されます。

@Service("myService")
public class MyServiceImpl {

    @Resource(name = "myDao")
    Dao dao;

    @Override
    @Transactional(readOnly = true)
    public int getScore(String str) {
      return dao.getMyInt(str);
    }
}
4

1 に答える 1

14

Spring Bean には状態 (フィールド) があるため、ステートレスではありません。注入されたフィールドはいつでも変更できるため、技術的には不変ではありません。

finalただし、フィールドとコンストラクター注入を使用して、Spring Bean を簡単に不変にすることができます。また、このような状態であってもスケーラビリティの観点からは問題ありません。Bean に時間の経過とともに変化する可変値が含まれている場合、これはクラスタリング時の大きな問題です。しかし、Spring サービスでは通常、ブートストラップ時に注入された依存関係のみが含まれます。したがって、それらは実質的にステートレスで不変です。

同じ Spring アプリケーションを実行するサーバーの数は関係ありません。Bean と依存関係自体は安全です。ただし、Spring Bean にカウンター、キャッシュ、可変マップなどが含まれている場合は、それらについて考える必要があります。

于 2012-06-25T13:07:13.720 に答える