BLOG ARTICLE 분류 전체보기 | 226 ARTICLE FOUND

  1. 2008.11.21 JNI이용시 한글 깨짐 방지 방법
  2. 2008.11.21 [UNIX,LINUX] 오라클 클라이언트 설치 방법
  3. 2008.11.21 Oracle tablespace 관련
  4. 2008.11.21 리눅스 자바 한글 셋팅
  5. 2008.11.21 CString -> (char*) 변환


1. 자바 --> C 또는 C++로 문자열 변환                                       
package 패키지;
class 클래스 {
   public static native void 메쏘드(String 문자열아규먼트);
}
를 javah로 C 헤더파일로 뽑아내게 되면 다음과 같은 C 프로토타입 정의를 얻게된다.
JNIEXPORT void JNICALL Java_패키지_클래스_메쏘드(JNIEnv *env, jclass obj, jstring 문자열아규먼트);
그럼.. C (또는 C++)에서는 다음과 같이 문자열을 읽을 수 있다.
char sbuf[512];                        // 문자열을 담을 버퍼 준비
memset(sbuf, 0, sizeof(sbuf)/sizeof(sbuf[0]));  // 버퍼를 null로 설정
const char *pch = (const char *)env->GetStringUTFChars(문자열아규먼트, 0);  // 문자열아규먼트
sprintf (sbuf,"%s", pch);          // 문자열을 버퍼에 카피
env->ReleaseStringUTFChars(문자열아규먼트, pch);    // 종료..
이제 printf ("%s", sbuf) 를 하게 되면 자바에서 넘겨준 문자열을 C에서 출력할 수 있다..


2. 반대의 경우 C --> Java로 문자열을 넘겨줄때에는                    
jstring retval;
retval = env->NewStringUTF(sbout);
return retval;
하면 된다.
하지만, 문제는 윈도우즈에서는 한글이 깨져서 넘겨지게 된다.
(최소한 제 경우 그럼)
그래서, 윈도우즈에서는 조금 다른 방식으로 처리해야 한다.
즉, 먼저 윈도우즈 API로 직접 유니코드 문자열로 바꾼다음, 직접 이 유니코드 문자열을
넘겨야 한다.
방법은 다음과 같다.
   jchar sbuf2[512];
   int size = MultiByteToWideChar(CP_ACP, 0, sbuf, strlen(sbuf) + 1, sbuf2, 512);
   retval = env->NewString (sbuf2, size);
이렇게 하면, 아무 문제 없이 한글지원이 된다.
MultiByteToWideChar()에 대한 자세한 문서는 msdn에서 찾아보자..

AND


[ Oracle Instant Client 설치 -예제는 solaris64]

1. 다운로드 후 설치 파일 임의 디렉토리에 FTP 이용하여 올리기
http://www.oracle.com/technology/global/kr/tech/oci/instantclient/instantclient.html
(해당 클라이언트를 선택하여, 다운 받으시고 ftp 이용해 서버로 옮기시길...)

Instant Client Package - Basic
Instant Client Package - JDBC Supplement
Instant Client Package - SQL*Plus
Instant Client Package - SDK


2. 압축 해제 및 실행폴더로 복사
# unzip instantclient-basic-solaris64-10.2.0.3-20070101.zip
# unzip instantclient-jdbc-solaris64-10.2.0.3-20070101.zip
# unzip instantclient-sdk-solaris64-10.2.0.3-20070101.zip
# unzip instantclient-sqlplus-solaris64-10.2.0.3-20070101.zip
# cd instantclient_10_2
# mkdir /usr/lib/oracle
# mv * /usr/lib/oracle/


3. profile 및 tnsnames 파일 수정

# vi /etc/profile
-----------------------------------------------------------------
# for Oracle Instant Client
if [ -d /usr/lib/oracle ]
then
  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/oracle;export LD_LIBRARY_PATH
  PATH=$PATH:/usr/lib/oracle;export PATH;
  NLS_LANG=Korean_Korea.KO16KSC5601;export NLS_LANG;
  TNS_ADMIN=/usr/lib/oracle; export TNS_ADMIN;
  SQLPATH=/usr/lib/oracle; export SQLPATH;
fi
-----------------------------------------------------------------

# vi /usr/lib/oracle/tnsnames.ora
-----------------------------------------------------------------
ORA=
  (DEscRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST =211.XXX.XXX.XXX)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ora)
    )
  )
-----------------------------------------------------------------
혹시 재접속 에러가 발생하면 ^M 이 문자열에 있을 것입니다. 아마 복사해서 사용할 경우
발생할수도 있습니다. vi로 직접 입력하시던지 editplus를 이용해서...


4. 로그아웃 후 재접속. 테스트
# sqlplus user/passwd@ORA
SQL*Plus: Release 10.2.0.2.0 - Production on 화 10월 21 16:47:39 2007
Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.

다음에 접속됨:
Oracle10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 10.2.0.1.0 - Production
SQL>

AND



Logical Database Structure

  - database
  - tablespace
  - segment
  - extent
  - block

SYSTEM and NON-SYSTEM TABLESPACE

  - SYSTEM Tablespace : data dictionary 정보와 SYSTEM rollback segment을 가진다.
  - NON-SYSTEM Tablespace : Rollback segments, Temporary segments, data, index등을 가진다.

CREATE TABLESPACE

      CREATE TABLESPACE tablespace
            DATAFILE filespec [autoextend_clause],filespec [autoextend_clause]]...
            [MINIMUM EXTENT integer [K|M]]
            [DEFAULT storage_clause]
            [PERMANENT|TEMPOARY] --> default PERMANENT
            [ONLINE|OFFLINE] --> default ONLINE


      예) CREATE TABLESPACE data
                DATAFILE '/DISK4/app01.dbf' SIZE 100M,
                                              '/DISK5/app02.dbf' SIZE 100M
                MINIMUM EXTENT 500K
                DEFAULT STORAGE (INITIAL 500K NEXT 500K
                                              MAXEXTENTS 500 PCTINCREASE 0) ;


    - STORAGE PARAMETERS

          * INITIAL : 첫째 extent의 크기를 정한다. 최소 크기는 2 blocks ( 2 * DB_BLOCK_SIZE )
                      default는 5 bolcks ( 5 * DB_BLOCK_SIZE )
          * NEXT : 다음 extent의 크기를 정한다. 최소 크기는 1 block
                      default는 5 bolcks ( 5 * DB_BLOCK_SIZE )
          * MINEXTENTS : segment가 생성되었을 때 할당되는 extent의 갯수.
                      default는 1개
          * PCTINCREASE n : 다음에 extent가 생성될 때 이전 extent보다 n% 증가된 크기 ( PCT: percent )
                      default는 50
          * MAXEXTENTS : segment가 갖을 수 있는 extent의 최대 수

Temporary Tablespace

      CREATE TABLESPACE DATA
                        DATAFILE '/DISK2/DATA01.dbf' SIZE 50M
                        MINIMUM EXTENT 1M
                        DEFAULT STORAGE (INITIAL 2M NEXT 2M
                                                    MAXEXTENTS 500 PCTINCREASE 0)
                        TEMPORARY ;

TABLESPACE의 크기 설정 (data file을 추가)

      ALTER TABLESPACE DATA
            ADD DATAFILE '/DISK5/DATA02.dbf' SIZE 200M ;

DATA FILE이 FULL되면 자동으로 DATAFILE을 증가한다.

      ALTER TABLESPACE DATA
            ADD DATAFILE '/DISK6/app04.dbf' SIZE 200M
                          AUTOEXTEND ON NEXT 10M
                          MAXSIZE 500M ;


      * 3가지 방법이 있다.
          1. CREATE DATABASE을 한다.
          2. CREATE TABLESPACE DATAFILE을 한다.
          3. ALTER TABLESPACE ADD DATAFILE을 한다.

현재 DATAFILE의 크기를 다시바꾸는(resize) 방법


    ALTER DATABASE DATAFILE '/DISK5/app02.dbf' RESIZE 200M ;


Changing the Storage Settings

      ALTER TABLESPACE DATA
                          MINIMUM EXTENT 2M ;


      ALTER TABLESPACE DATA
                DEFAULT STORAGE (INITIAL 2M NEXT 2M
                                                                            MAXEXTENTS 999) ;


Tablespace OFFLINE/ONLINE

      - tablespace가 만들어지면 초기값(default)이 ONLINE이다.
      - OFFLINE이 되면 다른 사용자의 access가 불가능하다.
      - SYSTEM tablespace는 OFFLINE이 불가능하다.
      - transaction이 끝나지 않은 tablespace는 OFFLINE 불가능하다.

    ALTER TABLESPACE tablespace
          { ONLINE | OFFLINE [NORMAL|TEMPORARY|IMMEDIATE] }
      - Normal : checkpoint를 적용시키고 offline한다.
      - Temporary : datafile 중에서 online datafile에만 checkpoint를 적용시키고 offline한다.
      - Immediate : checkpoint 없이 offline한다.


    예) ALTER TABLESPACE DATA OFFLINE NORMAL; 특별한 경우가 아닌이상 이렇게 써라.NORMAL은 default이므로 생략가능

Moving Data File : ALTER TABLESPACE


      - 반드시 offline 한 상태에서 한다.
      - target data file이 반드시 존재해야 한다.


      ALTER TABLESPACE DATA
                          RENAME DATAFILE '/DISK4/DATA01.dbf'
                          TO '/DISK5/DATA01.dbf' ;


Moving Data File : ALTER DATABASE

      - 반드시 database가 mount 상태이어야 한다.
      - target data file이 반드시 존재해야 한다.
      - shutdown하고 host상태에서 datafile을 제거해야 한다.


      ALTER DATABASE
                    RENAME FILE '/DISK1/system01.dbf'
                    TO '/DISK2/system01.dbf' ;


READ-ONLY Tablespace 상태


      - 오직 select만 할 수 있다.
      - CREATE는 안되고... DROP은 할 수 있다.
      - 사용자들이 data변경을 못함, backup과 recovery가 쉽다.

      ALTER TABLESPACE DATA READ ONLY;


      ALTER TABLESPACE DATA READ WRITE; -- read only 상태를 다시 read write상태로 바꿔준다.


    * 주의해야 하는점
          - tablespace가 반드시 online상태여야 한다.
          - active transaction이 허용되지 않아야 한다.
          - tablespace가 active rollback segment를 갖고 있으면 안된다.
          - online backup중엔 못한다.


DROP TABLESPACE

      - file 삭제는 host에 나가서 삭제를 해야 한다.


      DROP TABLESPACE DATA
      INCLUDING CONTENTS ;

      * including contents를 안썼을 때, tablespace가 비워져 있어야만 drop이 된다.
            including contents는 데이터가 들어 있어도 tablespace를 삭제하겠다는 뜻이다.


DBA_TABLESPACES : tablespace 정보를 갖고 있음

      - TABLESPACE_NAME,
            NEXT_EXTENT,
            MAX_EXTENTS,
            PCT_INCREASE,
            MIN_EXTLEN,
            STATUS,
            CONTENTS


      SVRMGR> SELECT tablespace_name, initial_extent, next_extent,
                              2 max_extents, pct_increase, min_extlen
                              3 FROM dba_tablespaces ;

DBA_DATA_FILES : FILE에 관한 정보를 갖고 있다.


      - FILE_NAME, TABLESPACE_NAME, BYTES, AUTOEXTENSIBLE, MAXBYTES, INCREMENT_BY


      SVRMGR> SELECT file_name, tablespace_name, bytes, autextensible, maxbytes, increment_by
                              2 FROM dba_data_files ;

Contol File 정보


      - V$DATAFILE : ts#, name, file#, rfile#, status, enabled, bytes, create_bytes
      - V$TABLESPACE : ts#, name


      SVRMGR> SELECT d.file#, d.name, d.status, d.enabled, d.bytes, d.create_bytes, t.name
                              2 FROM v$datafile d, v$tablespace t
                              3 WHERE t.ts# = d.ts# ;


연습

1. 현재의 Tablespace와 Data file들을 확인

$ sqlplus system/manager
SQL> select * from dba_tablespaces ;
SQL> select file_name, tablespace_name, bytes
          2 from dba_data_files ;


2. DATA01 tablespace의 size를 늘이기 위해, datafile을 하나 추가

SQL> alter tablespace data01
          2 add datafile '$ORACLE_HOME/DATA/DISK6/data01b.dbf' size 500k ;
SQL> select file_name, tablespace_nmae, bytes
          2 from dba_data_files ;


3. 문제2 에서 추가한 datafil의 size를 1M 로 resize

SQL> alter database datafile
          2 '$ORACLE_HOME/DATA/DISK6/data01b.dbf'
          3 resize 1M ;
SQL> select file_name, tablespace_name, bytes
          2 from dba_data_files ;


4. 문제2 에서 추가한 datafile의 size가 자동적으로 extend 될 수 있도록 하자

SQL> alter database datafile
          2 '$ORACLE_HOME/DATA/DISK6/data01b.dbf'
          3 autoextend on next 100k maxsize 2m ;
SQL> select file_name, tablespace_name, bytes, autoextensible
          2 from dba_data_files ;

5. INDX01 tablespace의 datafile을 DISK6으로 옮기기

SQL> alter tablespace indx01 offline ;
SQL> select name, status from v$datafile ;
SQL> host
$ mv $ORACLE_HOME/DATA/DISK3/indx01.dbf $ORACLE_HOME/DATA/DISK6/indx01.dbf
$ exit
SQL> alter tablespace indx01 rename datafile
          2 '$ORACLE_HOME/DATA/DISK3/indc01.dbf'
          3 to '$ORACLE_HOME/DATA/DISK6/indx01.dbf' ;
SQL> alter tablespace indx01 online ;
SQL> select name, status from v$datafile ;


6. RONLY Tablespace를 read only로 바꾸고, 추가적인 테이블을 생성하고 무슨 일이 발생하며 이유는 무엇인가?

SQL> create table t1(t1 number) tablespace ronly ;
SQL> alter tablespace ronly read only ;
SQL> select name, enabled, status from v$datafile ;
SQL> create table t2(t2 number) tablespace ronly ; ==> error 발생 확인!


7. RONLY Tablespace를 삭제

SQL> drop tablespace ronly including contents ;
SQL> select * from v$tablespace ;
SQL> host
$ rm $ORACLE_HOME/DATA/DISK1/ronly.dbf

AND

리눅스 - 자바에서 한글 깨질때
1. Test.java 소스

[root@image01 wsloader]# cat Test.java
import java.io.*;

public class Test {
        public static void main(String[] args) throws Exception {
                System.out.println("file.encoding="+System.getProperty("file.encoding"));
                System.out.println("테스트");
        }
}

2.테스트

[root@image01 wsloader]# env | grep LANG
LANG=ko_KR.eucKR
[root@image01 wsloader]# javac Test.java
[root@image01 wsloader]# java Test
file.encoding=EUC-KR
테스트
[root@image01 wsloader]# export LANG=c
[root@image01 wsloader]# java Test
file.encoding=ANSI_X3.4-1968
???
[root@image01 wsloader]# export LANG=ko_KR.eucKR
[root@image01 wsloader]# java Test
file.encoding=EUC-KR
테스트

AND

CString a;
char* b;
a="test";
b=a.getBuffer(a.getLength());
AND