MySQL Character set 때문에 하루종일 삽질 ㅡ,.ㅡ;

[작렬허접코딩/데이터베이스]

Tomcat 5.5.20
MySQL 5.0.xx community server
jsp

아주 쇼를 하는구나...
Tomcat의 JNDI 방식으로 Connection Pool을 사용할려구 하다가 MySQL charset 땜시 아주 미칠뻔 했다.
결국은 소 뒷걸음 치다가 쥐잡는 식으로 해결하긴 했다.

일단 MySQL의 환경은 다음과 같다.
show variables like '%c%'
아래에서  "character_set_database"이 "latin1" 이었다.

show variables like '%c%' (101 Records)

Variable_name Value
auto_increment_increment 1
auto_increment_offset 1
automatic_sp_privileges ON
back_log 50
binlog_cache_size 32768
character_set_client latin1
character_set_connection latin1
character_set_database euckr 
character_set_filesystem binary
character_set_results latin1
character_set_server latin1
character_set_system utf8
character_sets_dir c:\mysql\share\charsets\
collation_connection latin1_swedish_ci
collation_database euckr_korean_ci
collation_server latin1_swedish_ci
completion_type 0
concurrent_insert 1
connect_timeout 5
div_precision_increment 4
engine_condition_pushdown OFF
group_concat_max_len 1024
have_archive YES
have_blackhole_engine NO
have_compress YES
have_crypt NO
have_csv NO
have_dynamic_loading YES
have_ndbcluster NO
have_query_cache YES
init_connect  
innodb_autoextend_increment 8
innodb_checksums ON
innodb_commit_concurrency 0
innodb_concurrency_tickets 500
innodb_flush_log_at_trx_commit 1
innodb_force_recovery 0
innodb_lock_wait_timeout 50
innodb_locks_unsafe_for_binlog OFF
innodb_log_arch_dir  
innodb_log_archive OFF
innodb_max_dirty_pages_pct 90
innodb_sync_spin_loops 20
innodb_table_locks ON
innodb_thread_concurrency 8
interactive_timeout 28800
key_cache_age_threshold 300
key_cache_block_size 1024
key_cache_division_limit 100
lc_time_names en_US
license GPL
local_infile ON
log_bin_trust_function_creators OFF
lower_case_file_system ON
lower_case_table_names 1
max_allowed_packet 1048576
max_binlog_cache_size 4294967295
max_connect_errors 10
max_connections 100
max_error_count 64
max_prepared_stmt_count 16382
max_sp_recursion_depth 0
max_user_connections 0
max_write_lock_count 4294967295
multi_range_count 256
myisam_recover_options OFF
net_retry_count 10
optimizer_search_depth 62
prepared_stmt_count 0
protocol_version 10
query_alloc_block_size 8192
query_cache_limit 1048576
query_cache_min_res_unit 4096
query_cache_size 0
query_cache_type ON
query_cache_wlock_invalidate OFF
query_prealloc_size 8192
range_alloc_block_size 2048
relay_log_space_limit 0
rpl_recovery_rank 0
secure_auth OFF
skip_external_locking ON
slave_compressed_protocol OFF
slave_transaction_retries 10
slow_launch_time 2
sql_big_selects ON
ssl_ca  
ssl_capath  
ssl_cert  
ssl_cipher  
sync_binlog 0
sync_frm ON
table_cache 64
table_lock_wait_timeout 50
thread_cache_size 0
thread_stack 196608
transaction_alloc_block_size 8192
transaction_prealloc_size 4096
version_comment MySQL Community Edition (GPL)
version_compile_machine ia32
version_compile_os Win32


generated 2008-07-18 오후 4:13:18 by MySQL-Front 2.5

데이터베이스를 생성하고 다음의 명령으로 charset 변경
ALTER DATABASE MY_DATABASE DEFAULT CHARACTER SET euckr;
그 다음 mysql로 데이터를 백업받아서 생긴 sql  파일의 제일 상단에 다음의 한줄을 추가함
set names euckr;

그리고 커맨드에서 다음의 문장을 실행
mysql -u root -pxxxxxxx my_database < C:\my_database.sql

tomcat의 server.xml에서 context아래에 Resource를 정의한다.
<Resource name="jdbc/flexmate" auth="Container" type="javax.sql.DataSource"
     maxActive="100" maxIdle="30" maxWait="10000"
     username="root" password="" driverClassName="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost:3306/my_database?autoReconnect=true?&useUnicode=true&characterEncoding=euckr"/>

끝...

웹에서 조회할 때는 MySQL Front에서 한글이 정상적으로 표시되었다.
하지만 euckr로 변경하고 나니 MySQL Front에서 한글이 전부 ?로 표시된다...
젠장...

아 삽질의 끝은 어디인가?
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/07/18 16:19 2008/07/18 16:19

xampp 설치 + Apache + Tomcat 5.5.20 연동

[작렬허접코딩]
Apache Friend에서 xampp를 다운로드 받아서 설치하니 아주 좋구나
xampp 다운로드
설치매뉴얼은 위의 페이지에서 참고하길 바란다.

xampp 설치시 함께 설치되는 옵션은 다음과 같다.
Apache 2.2.8
MySQL 5.0.51a
PHP 5.2.5 + PHP 4.4.8 + PEAR
PHP-Switch win32 1.0 (please use the "php-switch.bat")
XAMPP Control Version 2.5 from www.nat32.com 
XAMPP Security 1.0
SQLite 2.8.15
OpenSSL 0.9.8g
phpMyAdmin 2.11.4
ADOdb 4.96
Mercury Mail Transport System v4.52
FileZilla FTP Server 0.9.25
Webalizer 2.01-10
Zend Optimizer 3.3.0a
eAccelerator 0.9.5.2 for PHP 5.2.5  (comment out in the php.ini)

* System Requirements:
  + 64 MB RAM (RECOMMENDED)
  + 200 MB free fixed disk
  + Windows 98, ME
  + Windows NT, 2000, XP (RECOMMENDED)

일단 설치는 'Next'만 반복하면 된다.
현재 나의 목표는
Apache + php + jsp이다.
위의 설치옵션에서 Tomcat5.5.20을 소스 카피형식으로 설정함
윈도우 환경변수에
CATALINA_HOME 추가
Path에 %CATALINA_HOME%\bin 추가
뭐 이정도 ^^

다음은 mod_jk.so 파일이 필요하다.
다음의 주소에서 다운로드 받길 바란다.
http://mirror.apache-kr.org/tomcat/tomc ··· .2.26%2F
여기에서 "mod_jk-1.2.26-httpd-2.2.4.so"를 다운로드 해서 mod_jk.so 파일로 이름을 변경한다.
다음 이 파일을 apache 디렉토리 아래의 modules 디렉토리에 복사한다.
그리고 conf\아래에 jk라는 폴더를 만들고 거기에 두개의 파일을 생성한다.
1. mod_jk.conf
2. workers.properties

다음은 문제의 아파치 설정이다.
1.3 부터 쭉 봐왔지만 httpd.conf 파일이 버전이 올라가면서 수시로 바뀐다.
일단 아파치를 설정하기 위해서는 xampp\apache로 이동한다.
여기가 아파치가 설치된 디렉토리이다.
conf디렉토리에서 httpd.conf 파일을 열어서 제일 아래에 mod_jk.conf를 incude하는 부분을 추가한다.
# include jk config file
include conf/jk/mod_jk.conf

그리고 저장~~~

mod_jk.conf 파일은 다음과 같이 생성한다.
#========================================
# Load mod_jk module
# Update this path to match your modules location
LoadModule    jk_module  modules/mod_jk.so

# Declare the module for (remove this line on Apache 2.x)
# AddModule     mod_jk.c
# Where to find workers.properties
# Update this path to match your conf directory location (put workers.properties next to httpd.conf)
JkWorkersFile conf/jk/workers.properties

# Where to put jk shared memory
# Update this path to match your local state directory or logs directory
JkShmFile     D:/APP/Tomcat5520/temp/jk2.shm

# Where to put jk logs
# Update this path to match your logs directory location (put mod_jk.log next to access_log)
JkLogFile     D:/APP/LOGS/mod_jk/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel    info

# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

# Send everything for context /examples to worker named worker1 (ajp13)
#JkMount  /jsp-examples/* worker1
# JkMount  /*.jsp worker1
# JkMount  /jjxweb/* worker1

# JkOptions     +ForwardURIEscaped
#================================================

workers.properties 파일은 다음과 같이 생성한다.
# workers.properties
#=====================================
# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
#========================================

여기까지는 그럭저럭 잘 넘어 왔다.
php는 태터툴즈를 설치해서 테스트 했는데 문제가 없이 잘 되었다.
하지만 java를 연동하니 jk가 동작하지 않는다.
아마도 virtualhost 셋팅 문제인 것 같다.
그래서 찾다보니 다음의 매뉴얼을 발견함
http://tomcat.apache.org/connectors-doc ··· che.html
여기에 설정하는 방법이 자세하게 나와 있다.
이 중에서 내가 선택한 방법은 아래의 부분이다.
conf/jk/mod_jk.conf에서 JkMount를 이용해서 java와의 연동부분을 설정하지 않고
실제 java가 동작하는 VirtualHost 정의부분에 설정해 주니 아주 잘 된다.

============================================================================Starting with mod_jk 1.2.6 for Apache 2.0/2.2 and 1.2.19 for Apache 1.3, it's possible to exclude some URL/URI from jk processing by setting the env var no-jk, for example with the SetEnvIf Directive.

You could use no-jk env var to fix problem with mod_alias or mod_userdir directive when jk and alias/userdir URLs matches.

  # All URL goes to tomcat except the one containing /home
  <VirtualHost *:80>
      ServerName testxxx.mysys
      DocumentRoot /www/testxxx/htdocs
  # Use SetEnvIf to st no-jk when /home/ is encountered
      SetEnvIf Request_URI "/home/*" no-jk
  # Now /home will goes to /home/dataxxx/
      Alias /home /home/dataxxx/
      <Directory "/home/dataxxx">
          Options Indexes MultiViews
          AllowOverride None
          Order allow,deny
          Allow from all
      </Directory>
  # Static files in all Tomcat webapp context directories are served by apache
  JkAutoAlias D:/APP/wwwroot/java

  # All requests go to worker1 by default
  JkMount /* worker1
  # Serve html, jpg and gif using httpd
  JkUnMount /*.html worker1
  JkUnMount /*.htm worker1
  JkUnMount /*.jpg worker1
  JkUnMount /*.gif worker1
JkUnMount /*.png worker1
JkUnMount /*.css worker1
JkUnMount /*.js worker1
</VirtualHost>

Use the mod_jk JkAutoAlias directive to map all web application context directories into Apache's document space.

Attempts to access the WEB-INF or META-INF directories within a web application context or a Web Archive *.war within the Tomcat Host appBase (webapps) directory will fail with an HTTP 403, Access Forbidden

위와 같이 설정하는 java가 돌아가는 폴더 하위의 WEB-INF 폴더의 내용은 웹브라우저를 통해서 조회가 되지 않는다.
아 삽질이 힘들구나...

이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/05/16 20:52 2008/05/16 20:52

Jakarta common-dbcp + oracle9i 사용시

[작렬허접코딩/자바]
문제점이 있다.

common-dbcp + 오라클 9i 이상을 함께 사용할 때 Oracle의 CLOB 컬럼을 읽어올 때 문제가 발생한다.
에러 내용은 다음과 같다.

org.apache.tomcat.dbcp.dbcp.DelegatingResultSet
        at kr.co.jinjin.jjxweb.sql.DBActor.getCLOB(Unknown Source)
        at kr.co.jinjin.jjxweb.BaseJob.readClob(Unknown Source)
        at kr.co.jinjin.jjxweb.Job.doAct(Unknown Source)
        at kr.co.jinjin.servlet.jjxwebservlet.doPost(Unknown Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav
a:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.p
rocessConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpo
int.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFol
lowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP
ool.java:684)
        at java.lang.Thread.run(Thread.java:595)

다음은 8i에서 CLOB를 읽어오기 위해 처리하던 부분이다.
public String getCLOB(String poolName,
   String tableName,
   String clobColumnName,
   String sqlstr) throws Exception {
 
  Connection con = null;
  Statement stmt = null;
  ResultSet rs = null;
  Reader m_reader = null;
  char[] m_buffer = null;
 
  StringBuffer readedStr = null;
  StringBuffer qry = new StringBuffer();
 
  qry.append("SELECT " + clobColumnName + " FROM " + tableName);
  qry.append((!sqlstr.trim().toUpperCase().startsWith("WHERE") ? " WHERE " : " ") + sqlstr);
 
  try {
   con = dbcon.getPooledConnection(poolName);
   stmt = con.createStatement();
   rs = stmt.executeQuery(qry.toString());
   
   if(rs.next()) {
    // 문제 발생시키는 놈 Class Casting이 안된다.
    CLOB clob = ((OracleResultSet)rs).getCLOB(clobColumnName);
   
    m_reader = clob.getCharacterStream();
    readedStr = new StringBuffer();
    m_buffer = new char[BUFFER_LENGTH];
   
    int readedIndex = 0;
    while ((readedIndex = m_reader.read(m_buffer)) != -1)  {
     for (int i=0; i<readedIndex; i++) {
      //System.out.print(buffer[i]);
      readedStr.append(new String(m_buffer, 0, readedIndex));
      m_buffer = new char[BUFFER_LENGTH];
     }
    }
   }
   
  } catch(Exception e) {
   throw new Exception("[Exception] DBActor.getCLOB()  : [" + tableName + "." + clobColumnName + "] " + e.getMessage());
  } finally {
   try {
    dbcon.release(rs, stmt, con);
    if(m_reader != null) m_reader.close();
   } catch(Exception e) {
    e.printStackTrace();
   }
  }
 
  return readedStr.toString();
 }

그럼 어떻게 처리해야 하나?
일반적인 varchar2 컬럼을 읽어오듯이
SELECT NORMAL_COL, CLOB_COL FROM MYTABLE WHERE....
이렇게 읽어오니 모든 데이터가 잘도 읽힌다.
참 환장하겠다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/04/04 22:50 2008/04/04 22:50