如果我有低於定義的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?
編輯:
所以會像這樣的代碼解決這個問題:
/*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 2013-03-13 21:22:26
你可以做的是使用一個臨時列表來調用'refreshAccounts()'中的數據庫。當它返回時,在'accounts'同步並將其重新分配給該列表。 – 2013-03-13 21:28:56
我會說肯定緩存/數據庫。自己管理併發很困難。通過緩存,您至少可以記住併發控制。如果你真的想要任何數量的請求,我會聲明範圍=原型。然後你遇到你所關心的負載問題。 – 2013-03-13 21:32:10