私はその下に定義されたJavaクラスは、依存性注入を経由して自分のWebアプリケーションに注入されている場合:春シングルトンスレッドセーフ
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 Memory Storage to Reduce Database Load - Safe?
EDIT:
だから、この問題を解決するため、次のようにコーディングします。
/*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();
}
このJavaクラス(またはアプリケーションコンテキストフィックス)に含まれるコードを介してこの修正プログラムを簡単に使用できますか、キャッシュ/データベースソリューションをお勧めしますか? – thatidiotguy
あなたができることは、 'refreshAccounts()'のデータベースを呼び出すために一時的なリストを使うことです。それが返ってくると、 'accounts'に同期して、それをそのリストに再割り当てします。 –
私は間違いなくキャッシュ/データベースと言うでしょう。同時実行性を自分で管理するのは難しいです。キャッシングを使用すると、少なくとも並行性の制御を覚えることができます。任意の数のリクエストが本当に必要な場合は、スコープ=プロトタイプを宣言します。次に、あなたが懸念していた負荷の問題にぶつかります。 –