0

DataSource複数のスレッドからアクセスできる、を格納する静的なfinal属性があります。これDataSourceは、Tomcatの起動時に一度設定されます。

これへのアクセスを同期する必要がありますDataSourceか?私の懸念は、おそらく内部状態がDataSource1つのスレッドによって変更され、別のスレッドには表示されない可能性があることです。

「読み取り専用」の静的フィールドに同期なしでアクセスできるかどうか、またはいずれの場合でも必須であるかどうかは、まだわかりません。

私はこの回答を読んで、おそらく属性を初期化するメソッドだけを同期する必要があるので、私のコードは大丈夫でしょう:

public static final DataSource myDataSource;
static {
    InitialContext context = new InitialContext();
    myDataSource = (DataSource) context.lookup("jdbc/DataSource");
}

しかし、それは本当に大丈夫ですか?これをパフォーマンス面で行うための最良の方法は何ですか?

4

2 に答える 2

3

データソース参照へのアクセスは、以前の方法で初期化した後はスレッドセーフです。

データソース自体のメソッドのスレッドセーフは、まったく別の問題であることを忘れないでください。オブジェクト参照を適切に取得したとしても、非同期で多くのスレッドがアクセスすると、その内部状態が無効になる可能性があります。

ところで:なぜそれをそのように書いてみませんか:

public static final DataSource myDataSource = (DataSource) new InitialContext().lookup("jdbc/DataSource");
于 2013-03-05T14:30:07.820 に答える
1

java.sql.DataSourceはインターフェースであり、そのAPIはトレッドの安全性について何も述べていないため、実装によって異なります。たとえば、apache-dbcp BasicDataSourceは、メソッドが同期されているため、スレッドセーフです。

于 2013-03-05T14:33:42.917 に答える