2015년 8월 11일 화요일

DBCP validationQuery 설정

* 참고 사이트: http://linuxism.tistory.com/579
* 참고 사이트: Configuring the High Concurrency JDBC Connection Pool
* 참고 사이트: DBCP 설정 정리

에러 메시지 일부분
 - is longer than the server configured value of 'wait_timeout'.

원인 
 - 마지막으로 DB에 커넥션을 맺은후 사용이 없다 보니 데이터 베이스 커넥션이 끝겼다. 

해결책
 - 특정 시간마다 커넥션을 확인 하는 셋팅을 지정한다. 

적용 코드
 - MySQL
  • validationQuery="select 1"

 - 오라클의 경우
  • validationQuery="select 1 from dual"


상세 설명
mysql wait_timeout 설정(기본값 28800 , 8시간) 에 의해 커넥션이 연결된 이후 해당커넥션의 close 없이 8시간이 지나면 해당 커넥션을 종료 시키게 된다.
문제는 이렇게 종료된 커넥션을 dbcp의 connection pool 에선 여전히 가지고 있는 상태라는 것이다.이런 상황에서 DB 관련 프로그램이 호출되면 커넥션 관련 에러가 발생된다.
해결방법은 java에서 DB를 사용하기 전에 해당 connection 이 정상적인지 검사를 하도록 하는 것이다. 이 옵션이 validationQuery 파라미터이다.

* 추가 작업
 - timeBetweenEvctionRunsMillis - 사용되지 않는 커넥션을 추출하는 쓰레드의 실행 주기를 지정
    이값을 알맞게 지정해서 사용되지 않는 커넥션을 제거하는것이 좋다 보통 10~20분 단위 검사

 - testWhileIdle - true 일 경우 비활성화 커넥션을 추출할때 커넥션이 유효한지 여부를 검사해서 유효하지 않으면 제거


추가 적용 코드
  • validationQuery="select 1"
  • testWhileIdle="true"   
  • timeBetweenEvictionRunsMillis="30000"
 - testWhileIdle:컨넥션이 놀고 있을때, validationQuery 를 이용해서 유효성 검사를 할지 여부.
 - timeBetweenEvictionRunsMillis:해당 밀리초마다 validationQuery 를 이용하여 유효성 검사 진행.

* 더 추가 작업
 - 이렇게 설정하면 컨넥션을 풀에서 가져 올때도, validationQuery를 통해서 유효성 검사를 진행하게 되는데
 - 퍼포먼스가 문제 될거라고 생각된다면 testOnBorrow( default : true ) 값을 false 로 추가해주면 된다.
 - testOnBorrow : true일 경우 커넥션을 가져올 때 커넥션이 유효한지의 여부를 검사.

웹 프로젝트에 UTF-8 인코딩 설정




Tomcat 및 서블릿 컨테이너 설정 추가

$CATALINA_HOME/conf/server.xml
또는 이클립스 IDE > Servers 폴더 > server.xml 수정.
Connector 에 URIEncoding="UTF-8" 을 추가

web.xml 에 인코딩 필터 추가

     <!-- Encoding filter : UTF-8 -->  
     <filter>  
         <filter-name>EncodingFilter</filter-name>  
         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
         <init-param>  
             <param-name>encoding</param-name>  
             <param-value>UTF-8</param-value>  
         </init-param>  
     </filter>  
     <filter-mapping>  
         <filter-name>EncodingFilter</filter-name>  
         <url-pattern>/*</url-pattern>  
     </filter-mapping>  


JSP 파일에 내용 추가 (2가지 중 아무거나 가능)

1. jsp 파일: <%@ page contentType="text/html; charset=utf-8" %>
2. web.xml: jsp 2.1 부터 JSP의 모든 페이지의 인코딩을 web.xml에 설정 가능
     <!-- All jsp page encoding setting -->  
     <jsp-config>  
         <jsp-property-group>  
             <description>jsp page encoding</description>  
             <display-name>Encoding</display-name>  
             <url-pattern>*.jsp</url-pattern>  
             <el-ignored>false</el-ignored>  
             <page-encoding>UTF-8</page-encoding>  
             <scripting-invalid>false</scripting-invalid>  
             <is-xml>false</is-xml>  
         </jsp-property-group>  
     </jsp-config>  



blogspot tips

code formatting

web.xml sample

 <?xml version="1.0" encoding="UTF-8"?>  
 <web-app xmlns="http://java.sun.com/xml/ns/javaee"  
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
   version="2.5">  
   
   <!-- JDBC 연결을 위한 정보 -->  
   <resource-ref>  
     <description>OracleDatasource</description>  
     <res-ref-name>jdbc/myoracle</res-ref-name>  
     <res-type>javax.sql.DataSource</res-type>  
     <res-auth>Container</res-auth>  
   </resource-ref>  
   
   <context-param>  
     <param-name>ds</param-name>  
     <param-value>jdbc/myoracle</param-vlaue>  
   </context-param>  
   
   <!-- Filter 설정 (Encoding Filter) -->  
   <filter>  
     <filter-name>Encoding Filter</filter-name>  
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
     <init-param>  
       <param-name>encoding</param-name>  
       <param-value>UTF-8</param-value>  
     </init-param>  
   </filter>  
   
   <filter-mapping>  
     <filter-name>Encoding Filter</filter-name>  
     <servlet-name>action</servlet-name>  
   </filter-mapping>  
   
   <!-- servlet 설정 -->  
   <servlet>  
     <servlet-name>action</servlet-name>  
     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>  
     <init-param>  
       <param-name>config</param-name>  
       <param-value>/WEB-INF/struts-config.xml</param-value>  
     </init-param>  
     <init-param>  
       <param-name>debug</param-name>  
       <param-value>3</param-value>  
     </init-param>  
     <init-param>  
       <param-name>detail</param-name>  
       <param-value>3</param-value>  
     </init-param>  
     <load-on-startup>0</load-on-startup>  
   </servlet>  
   
   <servlet-mapping>  
     <servlet-name>action</servlet-name>  
     <url-pattern>*.do</url-pattern>  
   </servlet-mapping>  
   
   <!-- 세션 기간 설정 -->  
   <session-config>  
     <session-timeout>30</session-timeout>  
   </session-config>  
   
   <!-- 시작페이지 설정 -->  
   <welcome-file-list>  
     <welcome-file>index.jsp</welcome-file>  
   </welcome-file-list>  
   
   <!-- 존재하지 않는 페이지, 404에러시 처리 페이지 설정 -->  
   <error-page>  
     <error-code>404</error-code>  
     <location>/404.jsp</location>  
   </error-page>  
   
   <!-- 500에러시 처리 페이지 설정 -->  
   <error-page>  
     <error-code>500</error-code>  
     <location>/500.jsp</location>  
   </error-page>  
   
   <!-- NullpointException발생시 처리 페이지 설정 -->  
   <error-page>  
     <exception-type>java.lang.NullPointerException</exception-type>  
     <location>/null.jsp</location>  
   </error-page>  
   
   <!-- 태그 라이브러리 설정 (JSTL"coreTag"을(를) 사용)-->  
   <jsp-config>  
     <taglib>  
       <taglib-url>http://java.sun.com/jsp/jstl/core</taglib-url>  
       <taglib-location>/WEB-INF/tld/c.tld</taglib-location>  
     </taglib>  
   </jsp-config>  
 </web-app>  
   

A web.xml Deployment Descriptor Elements

web.xml elements order ?