

複数の人が同時にアクセスするTomcat、IIS上で動作するWEBアプリケーションがあります。  
SQL文は、実行時に画面上からの入力値などを考慮してアプリケーション内で動的に組み立てています。  
（単なる文字列連結ではないです。）  
【補足】  
JdbcTemplate、NamedParameterJdbcTemplate使用

このSQL文組み立て処理に、スレッドセーフであるStringBufferクラスを使用していますが、  
StringBuilderに書き換えるよう求められて根拠を探していたところ、  
こちらのサイトで他の方の質問に対して[以下のような回答](https://ja.stackoverflow.com/a/71011/2808)を発見しました。

>
> さらにですが、StringBufferはかなり古いクラスで、特殊な条件がない限り現在では使われません。通常はStringBuilderクラスを使用してください。

StringBuffer#appendメソッドはsynchronizedですが、単に古いか新しいかの観点ではなく、  
WEBアプリケーションで使用するにあたり、StringBuilderを使用すべきとする根拠を教えてください。  
また、処理時間の長短については問わない場合、  
ここでいうところの「特殊な条件」とはどういったケースが該当するのか、  
想定される場面についても分かれば教えてください。


CC BY-SA 4.0
2022-11-21T01:26:42.130
92332
2022-11-21T08:31:12.437
2022-11-21T08:31:12.437
2808
question
java spring
SQL文組み立て処理のときStringBufferとStringBuilderのどちらを使用すべきか


文字列を連結して SQL 文を作成するのは見通しが悪い(=読み辛い)ので私はお薦めしません。  
プリペアードステートメントをお使いになるのがいいと思います。


CC BY-SA 4.0
2022-11-21T02:57:05.513
92333
2022-11-21T02:57:05.513
43029
92332
answer


こういう場合は、1次情報源、つまり公式リファレンスに当たるのが良いかと思います。

[`StringBuffer`](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/lang/StringBuffer.html):

> スレッドセーフな可変の文字列。  
>  (中略)  
>  JDK 5以降、このクラスは単一のスレッド`StringBuilder`により使用されるよう設計された等価のクラスで補足されています。
> `StringBuilder`クラスは、このクラスと同じ処理をすべてサポートしながらも高速であり、同期を実行しないので、通常はこのクラスに優先して使用される必要があります。

[`StringBuilder`](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/lang/StringBuilder.html):

> 文字の可変シーケンスです。 このクラスは、`StringBuffer`と互換性があるAPIを提供しますが、同期化は保証されません。
> このクラスは、文字列バッファが単一のスレッド(一般的なケース)により使用されていた場合の`StringBuffer`の簡単な代替として使用されるよう設計されています。
> このクラスは、ほとんどの実装で高速に実行されるので、可能な場合は、`StringBuffer`よりも優先して使用することをお薦めします。  
>  (中略)  
>  `StringBuilder`のインスタンスは、複数のスレッドで使用するには安全ではありません。
> このような同期が必要な場合は、`StringBuffer`を使用することをお薦めします。

ということで、

> StringBuilderを使用すべきとする根拠を教えてください。

に対しては、公式がそう言っているから、ということになります。  
公式がそう言っている根拠は、(既に質問者の方も理解されているように見受けられますが) `StringBuffer`
は(一般的なケースでは必要のない)スレッド安全性を担保するため `StringBuilder` よりパフォーマンスが劣るためです。

> ここでいうところの「特殊な条件」とはどういったケースが該当するのか、

引用文中にある"一般的"ではないケース、すなわち複数スレッドがひとつの文字列バッファにアクセスすることが想定される場合です。

* * *

公式リファレンスの書きっぷりからわかるとおり、どちらかというと、なぜ `StringBuilder` でなく敢えて `StringBuffer`
を使う必要があるのかが問われます。

> スレッドセーフであるStringBufferクラスを使用していますが

とありあますが、そのスレッドセーフティは必要なのか？が争点です。


CC BY-SA 4.0
2022-11-21T08:28:32.667
92347
2022-11-21T08:28:32.667
2808
92332
answer