ThreadLocalまとめ
3159 ワード
threadLocalはマルチスレッドプログラムに大量のsynchronied同期ロックを使用することを避けることができます.これは性能を低下させるので、マルチスレッドの安全問題がある変数をthreadLocalに入れるとokです.
Springコントロールのservice層dao層オブジェクトは一例で、springはthreadlocal方式で全メンバー変数を管理していますので、マルチスレッドの問題はありません.
-----------------
webアプリケーションでは、ユーザー情報をsessionに預けておくと、Action層だけがユーザ情報、service層、DB層、DB Interceptor層がユーザ情報を取得するには、ThreadLocalを使用するのに適しています.
ThreadLocalのメカニズムは、ブラウザから送信されるrequestスレッドとローカルスレッドをバインドすることです.を選択します.
GlobalDateはThreadLocalの付いた容器です.
GlobalDataはBaseアクションの構造方法ではなく、フィルターの中に置いたほうがいいです.
actionが一例であれば、request要求毎にその構造方法を呼び出すことはないからです.
DWRクエリ要求もrequest要求であり、フィルタも通過しますので、フィルタ方式で実行できます.
Springコントロールのservice層dao層オブジェクトは一例で、springはthreadlocal方式で全メンバー変数を管理していますので、マルチスレッドの問題はありません.
-----------------
webアプリケーションでは、ユーザー情報をsessionに預けておくと、Action層だけがユーザ情報、service層、DB層、DB Interceptor層がユーザ情報を取得するには、ThreadLocalを使用するのに適しています.
ThreadLocalのメカニズムは、ブラウザから送信されるrequestスレッドとローカルスレッドをバインドすることです.を選択します.
GlobalDateはThreadLocalの付いた容器です.
GlobalDataはBaseアクションの構造方法ではなく、フィルターの中に置いたほうがいいです.
actionが一例であれば、request要求毎にその構造方法を呼び出すことはないからです.
DWRクエリ要求もrequest要求であり、フィルタも通過しますので、フィルタ方式で実行できます.
package cia.common.base.bean;
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import cia.common.base.constants.Constants;
import cia.common.base.exception.DomainException;
public class GlobalData implements Serializable {
private static final long serialVersionUID = 1L;
private static ThreadLocal session = new ThreadLocal();
private BaseUserInfo baseUserInfo;
private String ip;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public BaseUserInfo getBaseUserInfo() {
return baseUserInfo;
}
public void setBaseUserInfo(BaseUserInfo baseUserInfo) {
this.baseUserInfo = baseUserInfo;
}
public static GlobalData getCurrentInstance() throws DomainException {
GlobalData gi = (GlobalData) session.get();
return gi;
}
public static GlobalData getCurrentInstanceWithoutException() {
GlobalData gi = (GlobalData) session.get();
return gi;
}
public static void setCurrentInstance(GlobalData gi) {
session.set(gi);
}
public static GlobalData getFromRequest(HttpServletRequest request) throws DomainException{
HttpSession httpSession = request.getSession(false);
GlobalData globalInfo = (GlobalData) httpSession
.getAttribute(Constants.GLOBAL_DATA);
return globalInfo;
}
}
BaseActionでは、requestとGlobalDataをバインディングします.
public BaseAction(){
try {
HttpServletRequest request = ServletActionContext.getRequest();
GlobalData globalInfo = GlobalData.getFromRequest(request);
GlobalData.setCurrentInstance(globalInfo);
} catch(NullPointerException e){
//
logger.info(""+e.getMessage());
} catch (Exception e) {
logger.error(" :"+e.getMessage(),e);
}
}
Service階で使う時は、GlobalDataからデータを取ります.
GlobalData globalInfo = GlobalData.getCurrentInstance();
BaseUserInfo userInfo = globalInfo.getBaseUserInfo();