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要求であり、フィルタも通過しますので、フィルタ方式で実行できます.

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();