요즘엔 보통 Tomcat 5~6버전 혹은 Tomcat 7 버전을 WAS로 사용하는 경우가 있을 겁니다. 제가 일하는 곳의
환경은 꽤 구형 시스템을 사용하고 있고 프로그램에서 DB 커넥션 시 JDBC로 바로 연결하고 있어 부하가 상당히 걸리는
편이라 개선을 해보고자 DBCP를 사용하여 커넥션을 얻어오도록 테스트를 해봤습니다. 요즘엔 각종 프레임워크에서
손쉽게 설정 가능 하지만 이곳 상황이 그렇지 못하기 때문에 좀 삽질을 했습니다.
먼저 DBCP를 사용하기 위해서는 자카르타 DBCP API인 Commons-dbcp-1.2.1.jar, Commons-collections-3.1.jar,
Commons-pool-1.2,jar 가 반드시 필요합니다.(꼭 버전이 맞아야 하는것은 아닙니다.)
그리고 중요한 것은 이 세개의 라이브러리가 톰캣 설치 디렉토리의 commons/lib 디렉토리에 위치해야 하며 어플리케이션이
위치하는 컨텍스트에 이 라이브러리들이 중복해서 등록됐을경우 오류를 발생 시킵니다.
1. Tomcat - Server.xml 수정
- 톰캣이 설치된 디렉토리의 conf/server.xml을 수정합니다. 여기서 Resource의 name속성에 지정된 명칭은
나중에 JNDI를 통해 가져올 이름으로 이후에 수정할 컨텍스트 내의 web.xml의 명칭과 동일 해야 합니다.
혹은 전역적으로 설정하기 위해 <GlobalNamingResources> 내부에서 <Context>를 제외하고 아래 내용을 사용해도 됩니다.
<Context path="" docBase="ROOT" debug="0">
<Resource name="jdbc/erpdb" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/erpdb">
<parameter>
<name>username</name>
<value>test</value>
</parameter>
<parameter>
<name>password</name>
<value>test</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.sybase.jdbc2.jdbc.SybDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:sybase:Tds:111.222.222.111:4444/erpdb?charset=eucksc</value>
</parameter>
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>removeAbandonedTimeout</name>
<value>60</value>
</parameter>
</ResourceParams>
</Context>
설정후 이 부분을 보면 jdbc:sybase:Tds:111.222.222.111:4444/erpdb?charset=eucksc 뒤에 파라미터로 캐릭터셋을
지정해 줬습니다. 여기서는 DB의 캐릭터셋을 지정해 주면 됩니다. Sybase에서 혹 안되면 eucksc 대신 euc-kr 로 해보면 될 것
같습니다. 여기서 좀 삽질을 했는데 DB의 캐릭터셋이 euc-kr이라 위에서 설정시 <parameter>에 넣고 설정해 봤는데 아래와
같으 오류가 발생했습니다. JNDI를 통해서 커넥션을 가져오면서 나오는 에러였는데 위와 같이 설정해 줌으로 해결됐습니다.
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (JZ004: DriverManager.getConnection(..., Properties)에 사용자 이름 속성이 없습니다.)
2. web.xml 수정(컨텍스트/WEB-INF/web.xml)
프로그램에서 JNDI를 통해 커넥션을 가져오기 위해 위에서 서버쪽의 server.xml에서 설정한 Resource name 과 동일하게
설정 해줍니다. 동일하지 않을경우 커넥션을 받을 수 없으므로 오류가 발생하게 됩니다.
<resource-ref>
<description>ERP DB</description>
<res-ref-name>jdbc/erpdb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
2. 프로그램에서의 테스트
Connection conn = null;
InitialContext initContext = null;
Context ctx = null;
DataSource dataSource = null;
try{
initContext = new InitialContext();
//ctx = (Context) initContext.lookup("java:comp/env");
//dataSource = (DataSource) ctx.lookup("jdbc/erpdb");
dataSource = (DataSource) initContext.lookup("java:comp/env/jdbc/erpdb");
}catch(Exception e){
System.out.println(e);
}
conn = dataSource.getConnection();
여기서 한가지 주의할 점은 경우에 따라 JDBC API도 톰캣 설치디렉토리의 common/lib 에만 위치 시키고 컨텍스트의lib 디렉토리에서 중복될 경우 아래와 같은 오류가 발생할 수 있습니다.
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.sybase.jdbc2.jdbc.SybDriver'
여기까지 설정후에 확인해보시면 아마 제대로 되지 않을까 싶습니다. 그나저나 기존 소스에 JDBC 커넥션 맺는 부분을
어떻게 효과적으로 바꿀지가 더 고민이 되는군요. 파일이 수만개가 넘고 거의 모든곳에서 커넥션을 맺는 행위를 서블릿에서
init() 호출시 하도록 되어 있습니다. 노가다의 끝판왕을 보게 될 듯 싶네요 ㅎㅎ. 어쨋든 톰캣 구 버전을 사용할때 위 내용을
참고하면 될 듯 싶습니다.
'웹서버관련정보 > 리눅스' 카테고리의 다른 글
[강좌] Fedora Core(Linux) 에서 APM설치하기 (0) | 2007.06.14 |
---|---|
[강좌-스크랩] 리눅스에서 Vsftpd(FTP서버)설치하기 (0) | 2007.04.04 |
[강좌] 리눅스 생초보를 위한 VMWARE를 사용한 웹서버 설치방법(2/2) (0) | 2007.04.04 |
[강좌] 리눅스 생초보를 위한 VMWARE를 사용한 웹서버 설치방법(1/2) (0) | 2007.04.04 |