OSCahce에 존재하지 않는 데이터를 반복적으로 호출하는 경우, 쓰레드 락이 걸려서 어플리케이션이 문제 될 수 있다.

 

List result = null;
try {
  result = (List) admin.getFromCache("aaa");
} catch (NeedsRefreshException e) {
  throw e;

}

 

OSCache GeneralCacheAdministrator 객체안에 Cache가 있고, updateStatus라는 object를 이용하여 key에 대한 wait를 하고, notify하는 구조로 되어 있다.

즉, get을 할 때는 wait() 콜을, set을 할 때는 notifyAll()로 구성되었다.

 

웹에서는 한꺼번에 리퀘스트가 몰려오거나, 리스타트시에 자주 발생될 수 있다.

현상은 CLOSE_WAIT가 많이 생기고 apache full이 일어나면서 L4에서 서버가 빠진다.

 

이 문제를 해결하기 위해서는 미리 oscache에 데이터를 미리 넣어두는 것이 최고다. 그게 어렵다면.. putIncache나 cancelupdate () 메소드를 호출해서 notifyAll() 시켜라~

 

List result = null;
try {
  result = (List) admin.getFromCache("aaa");
} catch (NeedsRefreshException e) {

  admin.cancelUpdate("aaa"); // 내부적으로 notifyAll()을 호출. wait하고 있는 객체를 깨움

 // 또는 admin.putInCache(...);

  throw e;

}

 

 

 

 

Posted by 김용환 '김용환'

댓글을 달아 주세요

 

https://issues.apache.org/jira/browse/DBCP-270

 

common-pool 1.4와 common-dbcp 1.2.2 을 사용하면 데드락이 일어날 수 있다. 

 

common-dbcp 1.3에서 패치되었다.

 

Posted by 김용환 '김용환'

댓글을 달아 주세요

DB 커넥션을 웹 서버마다 붙이면, DB는 커넥션 유지를 위해서 메모리와 해당 커넥션 관리를 해야 한다. 특히 자바의 특성상 connection pool을 써야 하기에 어쩌다 쓰는 쿼리를 위해서 써야만 했다.

이를 위해서 대충 조사를 해봤다.

 

sqlrelay나 c-jdbc를 테스트해보 쓸 수 있으면 써야 겠다.

 

 

 

상용 솔루션

-       BEA tuxedo : 이건 미들웨어형태로 제공합니다. UI/모니터링/로깅/자바/EJBAPI/로드밸런싱 지원합니다.

-       Tmaxsoft Tmax: 턱시도와 비슷

-       웹로직 – Multipools

-       나머지는 비주류 

Free 솔루션

-       Sqlrelay: http://sqlrelay.sourceforge.net/ - Linux GPL license

n  Database connection pooling을 지원하고, 프록싱과 로드밸런싱을 지원합니다.

n  장점 : 외국에서는 많이 사용되는 경우인 것으로 보임. 바로 사용 가능. 문서화 잘되어 있고, 웬만한 DB와 프로그래밍 언어 API를 지원합니다

n  단점 : UI 제공 없고, 재시작할 떄 오래 걸리고, 커넥션 문제시 해결을 위해서는 재시작해줘야 함 -> 시스템적으로 풀어야 하는 솔루션 ( + 나머지는 개발 필요),  

n  버전 : 0.40  (최신버젼이 나옴, 2009.1.8)

n  설명 잘된 한국어 웹 페이지 : http://kldp.org/node/45012

 

-        C-jdbc (http://c-jdbc.objectweb.org/) Apache LGPL license

n  Database connection pooling을 지원하고, 프록싱과 로드밸런싱을 지원하는 클러스터 DB 미들웨어.

n  장점 : JMX 기반의 모니터링과 어드민 지원,순수 자바로 개발. 문서화와 및 개발 커뮤니티가 제공됩니다. 트랙잰션/failover/로깅/모니터링 제공합니다.

n  단점 : 아직 모름.

n  버전 : 2.10.10 (2008.5.7)

n  설명 잘된 한국어 웹 페이지 : http://blog.empas.com/holyjohn/list.html?p=2

 

Posted by 김용환 '김용환'

댓글을 달아 주세요

 

 #!/bin/sh

# defines constant
default_timeout=5

timeout=$default_timeout
if [ -z $1 ]; then
    echo 'Usage: rsh.sh [-t timeout] command'
    echo ' ex) rsh.sh -t 5 a5555.google.com '
    echo ' ex) rsh.sh a5555.google.com '
    exit;
fi

param=$*
while getopts ":t:" opt; do
    case $opt in
        t ) timeout=$OPTARG;;
        \? ) echo "invalid option"
             exit;;
    esac
done

#$1->$0
shift $(($OPTIND - 1))

# background process
rsh "$@" &
backprocess=$!
sleep $timeout; kill -9 $backprocess; echo "time out $timeout seconds"
exit -1;

 

사용법


#!/usr/bin/perl
# rcmd(host, rcmd, lcmd)
sub rcmd {
  my $RSH = "/home/www/work/rsh.sh -t 1";
  chomp $RSH;
  my $RESULT = "";
  if($#_ == 1) {
     $RESULT = `$RSH $_[0] $_[1]`;
  } else {
    $RESULT = `$RSH $_[0] $_[1] | $_[2]`;
  }
  chomp $RESULT;
    return $RESULT;
}
rcmd("a55384", "ls -al");



 

 

Posted by 김용환 '김용환'

댓글을 달아 주세요

rsh에는 timeout 기능이 없다. 있긴 한데.. 디폴트값으로 45초~1분사이의 값인 것 같다.

rsh을 쓰는 경우.. timeout이 걸릴때까지 시간이 소요되면, 동작이 잘 안될 수 있다.

 

겨우 찾은 샘플 소스..

백그라운드로 돌리고, 프로세스 id를 받아놓고, wait했다가 바로 kill 해주는 센스!!

 

 

 

http://groups.google.com/group/comp.unix.admin/msg/a0a2aefc71b7c631

 

 

 

 #!/bin/sh

timeout=$1
case $timeout in
[1-9]*) shift;;
*) timeout=10;;
esac

case $# in
0) echo 'Usage: timeoutrsh [timeout] cmd' >&2; exit;;
esac

rsh "$@" &
p=$!
(sleep $timeout; kill -1 $p) &
k=$!

wait $p
exit=$?
#  Normal exits are 0..127, signals are 128+signo
case $exit in
129)
        echo '(timed out)' >&2
        ;;
*)
        #  Kill the killer.
        kill $k
        ;;
esac
exit $exit

Posted by 김용환 '김용환'

댓글을 달아 주세요

쿼리 스트링 ID를 가지고 특정 action(URL)로 보내되, 파라미터는 날린다.  (QSA 반대)

 

Rewritecond를 이용하여 query string을 비교하고,

RewriteRule의 Substitute 의 query string을 날릴 수 있다.

 

Rewritecond %{query_string} ^id=(.*)
RewriteRule   ^/google/flash.axs                    http://flash.google.com/%1?  [R,L]

 

 

Posted by 김용환 '김용환'

댓글을 달아 주세요

    RewriteCond %{REQUEST_URI} !^/common/(.*)$
     RewriteRule ^.*$ http://www.google.com/gmail.php [R,L]

 

rewrite룰을 이렇게 사용하여 exclude 개념을 쓸 수 있다.

뒤에 더 나오는 RewriteRule의 영향을 받지 않기 하기 위해서, 꼭 L 옵션을 넣어주어야 한다.

Posted by 김용환 '김용환'

댓글을 달아 주세요

자바스크립트 Dom 객체 생성하기

 

  var type = document.createElement("input");
  type.name = "type";
  type.value = document.underform.value;
  document.underform.appendChild(type);

 

 

 

 

<form method="post" action="/under/emergency.nhn" name="underform">
 <input type="hidden" name="m" value="update"/>
    <input type="hidden" name="underid" value="${under.underid}" />
    <input type="hidden" name="listUrl" value="${param.listUrl}"/>

Posted by 김용환 '김용환'

댓글을 달아 주세요

jsp 2.0 사용시 예제

java UI 2009. 1. 1. 04:18

http://pdf.coreservlets.com/JSP-EL.pdf

 

 

 

 <script language="javascript">

 function preview(form) {
  window.open("", "previewPopup", "width=800, height=600");
  form.m.value = "preview";
  form.target = "previewPopup";
  form.submit();
 }
 </script>   

 

 


 <c:forEach items="${list}" var="page" varStatus="status">
 <form method="post" action="/under/emergencyui.nhn" name="ui${status.index}">
    <tr>   
      <td>
       ID : <input name="id" value="${page.id}" size=1 disabled=true/>의  내용
      </td>
      <td>
       <textarea name="content" rows=15 cols=90><c:out value="${page.content}" escapeXml="true" /></textarea><br>
      </td>
      <td>
        <c:out value="${status.index}" />
   <input type="hidden" name="m" value="preview"/>
   <input type="button" value="미리보기" onclick="preview(ui${status.index})">
      <input type="button" value="저장" onclick="save()">
    </td>
    </tr>
    </form>
 </c:forEach>

 

 

'java UI' 카테고리의 다른 글

WindowBuilder Pro  (0) 2011.09.01
jsp 2.0 사용시 예제  (0) 2009.01.01
quartz 를 이용하기  (0) 2008.01.22
File Connection Optiobal Package  (0) 2006.02.28
[펌] DataSource의 복제를 통한 다중 플레이어 생성방법  (0) 2005.12.02
jtable tutorial  (0) 2005.02.16
Posted by 김용환 '김용환'

댓글을 달아 주세요

사용예는 freemarket 공식 홈페이지보다 이게 더 나은 것 같음...

 

출처

http://www.mimul.com/pebble/default/2007/02/12/1171290600000.html

 

 

FreeMarker는 Velocity와 마찬가지로 templating 언어이다.
우리가 Jsp를 코딩하다보면 날코딩으로 생산성이 떨어진다. 그래서 우리는 좀더 편리하게 사용하기위해서 템플릿 엔진을 사용한다.
그리고 가장 큰 장점은 아래의 1번에서 보듯이 매크로 기능으로 기능을 만들어서 사용할 수 있다는 점이다.
다음은 FreeMarker의 사용 방법을 기술했다.

1. @macro
 - 프리마커 템플릿 전역에서 공통으로 사용되는 UI 디펜던트한 함수는 매크로로 만들어 여러 ftl에서 사용할 수 있도록 해준다. 샘플을 참고하도록 한다.
 - 형식 : <@매크로명 변수1, 변수2, ... />
 - 샘플1) 긴 문자열을 적당한 크기로 자르는 기능의 매크로
   *사용법 : <@trimX ${item.title}, 20 />
   *매크로 :
   <#macro trimX src max><#compress>
   <#if src?length &gt; max>
      ${src[0..max-1]}..
   <#else>
      ${src}
    </#if>
   </#compress></#macro>

 - 샘플2) YYYYMMDD 형식의 문자열을 YYYY.MM.DD 형식으로 변환하는 매크로
   *사용법 : <@parseDay ${item.regdate} />
   *매크로 :
   <#macro parseDay src><#compress>
   <#if src?length == 8>
        ${src[0..3]}.${src[4..5]?number}.${src[6..7]?number}
   <#else>
      ${src}
    </#if>
   </#compress></#macro>

2. #list
 - 배열 형식의 오브젝트를 루핑 처리할때 사용하는 프리마커 지시자이다. “로컬엘리어스_index” 라는 변수는 0부터 시작하는 시퀀스번호이다.
 - 형식 : <#list 배열객체 as 로컬엘리어스명></#list>
 - 샘플1)
   <#list LIST as item>
      번호 : ${item_index+1} | 이름 : ${item.name} | 아이디 : ${item.id}
   </#list>

3. #if
 - 프리마커 조건문에 사용되는 지시자이다.
 - 형식 : <#if 조건식></#if>
 - 샘플1) string 비교
   <#if ENTITY.usergrade == “A” >......</#if>
 - 샘플2) number 비교
   <#if ENTITY.userclass?number == 3>.....</#if>
 - 샘플3) boolean 비교
   <#if ENTITY.isAuth()>.....</#if>

4. #break
 - Loop문을 중단하고 다음 스크립트로 넘어가려고 할때 사용되는 지시자이다.
 - 형식 : <#break>
 - 샘플1) 루프문을 실행하는 중 5번째에서 escape 하는 예
 <#list LIST as item>
  <#if item_index &gt; 3><#break></#if>
 </#list>

5. #assign
 - 프리마커내에서 사용자 정의 로컬변수가 필요할 때 사용하는 지시자이다.
 - 형식 : <#assign 로컬변수명 = 초기화값>
 - 샘플1) <#assign CHECK = item_index>

6. [x...y]
 - 문자열의 일정 범위를 자를때 사용하는 함수
 - 형식 : ${문자열[1..5]}
 - 샘플1) ${item.name[1..5]}

7. ?has_content
 - 리스트형 오브젝트가 null이 아니고 최소 1개 이상의 컨텐츠를 가지고 있는지 체크하는함수로써 ?has_content는 ?exists와 ?size>0 두가지 체크를 동시에 해주는 함수이다.
 - 형식 : 리스트오브젝트?has_content
 - 샘플1) <#if LIST?has_content>.....</#if>

8. ?exists
 - NULL체크 함수. if_exists는 <#if 지시자 없이도 사용할 수 있게 해주는 표현식이다.
 - 형식 : 오브젝트?exists
 - 샘플1) <#if ENTITY.username?exists>${ENTITY.username?substring(0, 5)}</#if>
 - 샘플2) <#if LIST?exists && LIST?size &gt; 0>.....</#if>
 - 샘플3) ${ENTITY.username?if_exists}

9. ?default
 - NULL값을 대체해주는 함수
 - 형식 : 오브젝트?default(디폴트값)
 - 샘플1) ${item.userclass?default(“99”)}
 - 샘플2) ${item.age?default(20)}

10. ?string
 - 문자열로 형변환하는 함수
 - 형식 : 오브젝트?string
 - 샘플1) <#if item.age?string == “29”>.....</#if>
 - 샘플2) ${item.regdate?string(“yyyy/MM/dd HH:mm”)}
 - 샘플3) 숫자를 통화표시로 나타내는 예
  <#assign MONEY = 1234567>
  ${MONEY?string(",##0")}

11. ?number
 - 숫자로 형변환하는 함수
 - 형식 : 오브젝트?number
 - 샘플1) <#if item.userclass?number &gt; 3>.....</#if>
 - 샘플2) ${LIST_POINTS[item.gid?number].entityname?default(“”)}

12. ?js_string
 - 문자열을 자바스크립트에 유효하도록 필터링해주는 함수. 문자열내에 싱글쿼테이션(‘)등이 포함되어 스크립트에 오류가 나는것을 방지하기 위하여 사용되는 함수이다. 화면상에는 HTML 태그로 취급된다.
 - 형식 : 오브젝트?js_string
 - 샘플1) 문자열 <img src=’/image/enterprise.gif’>을 js_string으로 처리했을때 소스보기를 하면 <img src=\’/image/enterprise.gif\’>으로 출력된다.
 - 샘플2) <a href=”javascript:getName(‘${item.homeurl?js_string}’);”>

13. ?html
 - 문자열을 HTML Symbolic Entity로 필터링해주는 함수. 문자열내의 HTML태그등을 깨뜨려 화면상으로 출력되도록 할때 사용하는 함수이다. 화면상에 HTML태그가 아닌 일반 문자열로 취급된다.
 - 형식 : 오브젝트?html
 - 샘플1) 문자열 <img src=’/image/enterprise.gif’>을 html로 처리하면 화면상에 <img src=’/image/enterprise.gif’> 로 출력되고 소스보기를 하면 &lt;img src=’/image/enterprise.gif’&gt;로 출력된다.

14. ?index_of
 - 특정 문자(열)가 시작되는 위치를 정수형으로 반환한다. 인덱스는 0부터 시작됨.
 - 형식 : 오브젝트?index_of(특정문자)
 - 샘플1) “abcde”?index_of(“c”) 는 2를 반환한다.

15. ?replace
 - 문자열의 일부를 주어진 문자로 대체하는 함수
 - 형식 : 오브젝트?replace(찾을문자열, 대체할문자열)
 - 샘플1) ${item.content?replace(“>”, “&gt;”)}

16. item_has_next
 -리스트 객체의 다음 컨텐츠가 존재하는지(EOF) 체크하는 함수
 -형식 : 리스트엘리어스이름_has_next
 -샘플1) 이름과 이름사이에 , 를 찍어주되 마지막은 찍지 않는 경우의 예
  <#list LIST as item>
      ${item.name?default(“”)}<#if item_has_next>,</#if>
  </#list>

 

 

Posted by 김용환 '김용환'

댓글을 달아 주세요