依存性注入を介してWebアプリケーションに注入される以下に定義されたJavaクラスがある場合:
public AccountDao
{
private NamedParameterJdbcTemplate njt;
private List<Account> accounts;
public AccountDao(Datasource ds)
{
this.njt = new NamedParameterJdbcTemplate(ds);
refreshAccounts();
}
/*called at creation, and then via API calls to inform service new users have
been added to the database by a separate program*/
public void refreshAccounts()
{
this.accounts = /*call to database to get list of accounts*/
}
//called by every request to web service
public boolean isActiveAccount(String accountId)
{
Account a = map.get(accountId);
return a == null ? false : a.isActive();
}
}
スレッドセーフが気になります。Springフレームワークは、あるリクエストがリストから読み取られ、現在別のリクエストによって更新されている場合を処理しませんか?以前、他のアプリケーションで読み取り/書き込みロックを使用したことがありますが、上記のようなケースについてはこれまで考えたことがありません。
データベースの負荷を減らすために、Beanをシングルトンとして使用することを計画していました。
ちなみに、これは以下の質問のフォローアップです:
データベースの負荷を軽減するJavaメモリストレージ-安全ですか?
編集:
したがって、このようなコードでこの問題を解決できますか?
/*called at creation, and then via API calls to inform service new users have
been added to the database by a separate program*/
public void refreshAccounts()
{
//java.util.concurrent.locks.Lock
final Lock w = lock.writeLock();
w.lock();
try{
this.accounts = /*call to database to get list of accounts*/
}
finally{
w.unlock();
}
}
//called by every request to web service
public boolean isActiveAccount(String accountId)
{
final Lock r = lock.readLock();
r.lock();
try{
Account a = map.get(accountId);
}
finally{
r.unlock();
}
return a == null ? false : a.isActive();
}