개발/DB (6)
Mybatis #과 $의 차이

PrepareStatment(#)와 Statment($)를 정확히 모르고 사용하시는 분들이 있어 정리해봤습니다.

 - 간혹 Statment를 숫자일때 사용한다.. 라고 생각하시는 분들고 계시고 정확한 의미를 모르는 분들이 계십니다.  정리된 내용 보시기 바랍니다.


1. #의 사용 (PrepareStatment)

 - #을 사용할 경우 오라클의 PreparedStatment를 사용하게 된다.


  예제(name=John)

   a. mybatis mapper

      SELECT NAME FROM TEST WHERE NAME=#{name}

   b. 오라클에서 받은 쿼리

      SELECT NAME FROM TEST WHERE NAME = ?


실제 수행 쿼리

SELECT NAME FROM TEST WHERE NAME='John'


2. $의 사용(Statment)

 - $는 간단히 스트링 자체를 변환(REPLACE)해 버린다


  예제(score=99)

   a. mybatis mapper 

      SELECT NAME FROM TEST WHERE SCORE=${score}

   b. 오라클에서 받은 쿼리 

      SELECT NAME FROM TEST WHERE SCORE=99


실제 수행 쿼리

SELECT NAME FROM TEST WHERE NAME=99


3. 차이

두 가지가 똑같아 보이지만 붉게 처리된 부분을 볼 경우 1번은 오라클에서 변수를 바인드 처리 하기 때문에

NAME 값이 달라질 경우 같은 쿼리로 인식하게 됩니다.

(반드시는 아니지만 일반적으로 오라클의 쿼리 파싱, 캐시 등의 이점으로 CPU 및 수행 속도 차이가 나게 됩니다)


2번의 경우 b부분을 봤을때 쿼리 자체가 변경되어 들어가기 때문에 SCORE가 다른값이 올 경우

오라클은 이를 완전 다른 쿼리로 인식하기 때문에 새로 파싱 등의 작업을 하게 되고 속도가 느려질 우려가 있습니다.


그럼 Statment의 경우 어떻때 쓰는게 좋을까요?


SELECT ${column_name} FROM SCORE


위 쿼리같이 Bind를 할수 없는 경우 Statment를 사용하게 됩니다.

하지만 문자열 자체가 변형되기 때문에 보안상 취약할 수 있습니다.


예를 들면 아래와 같은 경우입니다.

user를 'admin'--로 세팅, password='aaa'

SELECT * FROM USER WHERE ID=${user} AND PASSWORD=${password}

실제 수행 쿼리

SELECT * FROM USER WHERE ID='admin'-- AND PASSWORD='aaa'


녹색 부분이 주석처리되어 admin으로 접속이 가능하게 되었습니다.


'개발 > DB' 카테고리의 다른 글

Mybatis #과 $의 차이  (1) 2014.11.10
몽고DB 설치  (0) 2014.01.22
테이블 정보(컬럼 정보, 코멘트 등등)  (0) 2013.11.11
테이블 사이즈 구하기(컬럼 길이, 컬럼 길이 평균)  (0) 2013.03.12
[ORACLE] 달력  (0) 2012.09.14
[ORACLE] 디비 락 해제  (0) 2012.01.09
1  Comments,   0  Trackbacks
  • 행인
    안녕하세요 글 잘봐습니다 좋은 글 감사합니다~ 다만 글에 약간 오해의 소지가 있을 수 있어 글남겨요~ Java가 오라클은 맞습니다만, 잘 모르시는 분이 보시면 잘 이해를 못하실 것 같아요. java.sql 페키지의 PreparedStatement 객체(인터페이스)를 사용하고, 이 PreparedStatement는 MyBatis 없이 Java Servlet을 통해 웹개발을 할 때 SQL문을 만드는 객체입니다. 바인드 변수는 맨 처음 SQL문을 하드파싱하고, 실행계획 생성하고, 캐싱을합니다. 이 캐싱 된것을 반복적으로 재사용할 수 있어 좋습니다. 바인드 변수를 사용할 때 단점이 같은 조건이라도 다른 실행계획(예를 들어 조건에 따라 인덱스 스캔 또는 풀테이블 스캔이 유리함의 유동치)일 때 불리합니다.
댓글 쓰기
몽고DB 설치

설치

파일 받아서 압축을 풀자

압축 해제 후 알아보기 쉽게 이름을 바꿔준다

tar -xzvf mongodb-linux-x86_64-2.4.9.tgz

mv mongodb-linux-x86_64-2.4.9 ~/mongodb


환경설정 파일 작성

실행파일은 mongod이며 직접 실행파일 뒤에 인자를 넣어 실행 가능하다

매번 그렇게 하기 귀찮으니 환경 설정 파일 및 실행파일을 작성하자

cd ~/mongodb/cmd

vi mongodb.conf


# mongodb.conf


# Where to store the data.


# Note: if you run mongodb as a non-root user (recommended) you may

# need to create and set permissions for this directory manually,

# e.g., if the parent directory isn't mutable by the mongodb user.

dbpath=/home/donnert/mongodb/db


#where to log

logpath=/home/donnert/mongodb/logs/mongodb.log


logappend=true


bind_ip=0.0.0.0


fork=true


rest=true

#port = 27017


# Disables write-ahead journaling

# nojournal = true


# Enables periodic logging of CPU utilization and I/O wait

#cpu = true


# Turn on/off security.  Off is currently the default

#noauth = true

#auth = true


# Verbose logging output.

#verbose = true


# Inspect all client data for validity on receipt (useful for

# developing drivers)

#objcheck = true


# Enable db quota management

#quota = true


# Set oplogging level where n is

#   0=off (default)

#   1=W

#   2=R

#   3=both

#   7=W+some reads

#diaglog = 0


# Ignore query hints

#nohints = true


# Disable the HTTP interface (Defaults to localhost:28017).

#nohttpinterface = true


# Turns off server-side scripting.  This will result in greatly limited

# functionality

#noscripting = true


# Turns off table scans.  Any query that would do a table scan fails.                                                                                                                                  

#notablescan = true                                                                                                                                                                                    

                                                                                                                                                                                                       

# Disable data file preallocation.                                                                                                                                                                     

#noprealloc = true                                                                                                                                                                                     

                                                                                                                                                                                                       

# Specify .ns file size for new databases.                                                                                                                                                             

# nssize = <size>                                                                                                                                                                                      

                                                                                                                                                                                                       

# Accout token for Mongo monitoring server.                                                                                                                                                            

#mms-token = <token>                                                                                                                                                                                   

                                                                                                                                                                                                       

# Server name for Mongo monitoring server.                                                                                                                                                             

#mms-name = <server-name>                                                                                                                                                                              

                                                                                                                                                                                                       

# Ping interval for Mongo monitoring server.                                                                                                                                                           

#mms-interval = <seconds>                                                                                                                                                                              

                                                                                                                                                                                                       

# Replication Options                                                                                                                                                                          

# in master/slave replicated mongo databases, specify here whether                                                                                                                                     

# this is a slave or master                                                                                                                                                                            

#slave = true                                                                                                                                                                                          

#source = master.example.com                                                                                                                                                                           

# Slave only: specify a single database to replicate                                                                                                                                                   

#only = master.example.com                                                                                                                                                                             

# or                                                                                                                                                                                                  

#master = true                                                                                                                                                                                         

#source = slave.example.com                                                                                                                                                                                                                                                                                                                    

# in replica set configuration, specify the name of the replica set                                                                                                                                    

# replSet = setname             


위에서 필요한 정보를 세팅해주면 된다.

기본적인 DB,로그경로 및 백그라운드 실행(fork), 바인드 ip를 설정해주었다.


가장 중요한건 역시 dbpath이다.  db파일이 설정될 경로를 지정해준다.


실행, 종료 스크립트 작성

vi start.sh

sh ~/mongodb/bin/mongod -f ~/mongodb/cmd/mongodb.conf


vi stop.sh

sh ~/mongodb/bin/mongod -f ~/mongodb/cmd/mongodb.conf --shutdown


chmod 755 *.sh


실행

./start.sh

about to fork child process, waiting until server is ready for connections.

forked process: 7526

all output going to: /home/yhcho/mongodb/logs/mongodb.log

child process started successfully, parent exiting


종료

./stop.sh

killing process with pid: 7488


웹페이지용 확인 페이지도 같이 뜬다

http://xxx.xxx.xxx.xxx:28017 로 접속해보자

설정 파일에서 rest를 true로 줄 경우 웹 페이지에서 여러가지 기능을 사용할 수 있다


'개발 > DB' 카테고리의 다른 글

Mybatis #과 $의 차이  (1) 2014.11.10
몽고DB 설치  (0) 2014.01.22
테이블 정보(컬럼 정보, 코멘트 등등)  (0) 2013.11.11
테이블 사이즈 구하기(컬럼 길이, 컬럼 길이 평균)  (0) 2013.03.12
[ORACLE] 달력  (0) 2012.09.14
[ORACLE] 디비 락 해제  (0) 2012.01.09
0  Comments,   0  Trackbacks
댓글 쓰기
테이블 정보(컬럼 정보, 코멘트 등등)

컬럼이 많은 테이블의 경우 코멘트로 컬럼명을 찾고 싶을떄가 있다

아래 쿼리를 돌리자.


SELECT * FROM (

SELECT 

  DECODE(column_id,0,TABLE_NAME,NULL) AS TABLE_NAME,

  TO_NUMBER(DECODE(column_id,0,NULL,column_id))  AS COLUMN_ID,

  COLUMN_NAME, NULLABLE, DATA_TYPE, COMMENTS

FROM (

  SELECT cc.TABLE_NAME,

    tc.COLUMN_ID, tc.COLUMN_NAME,

    tc.NULLABLE, tc.DATA_TYPE || 

      CASE WHEN tc.DATA_SCALE IS NOT NULL THEN '(' || tc.DATA_PRECISION || ',' || tc.DATA_SCALE || ')'

        WHEN tc.DATA_PRECISION IS NOT NULL THEN '(' || tc.DATA_PRECISION || ')'

        WHEN tc.DATA_LENGTH IS NOT NULL AND tc.DATA_TYPE LIKE '%CHAR%' THEN '(' || tc.DATA_LENGTH || ')'

      END DATA_TYPE,

    cc.COMMENTS

  FROM user_col_comments cc

  INNER JOIN user_tab_cols tc ON (cc.TABLE_NAME = tc.TABLE_NAME AND cc.TABLE_NAME = tc.TABLE_NAME AND cc.COLUMN_NAME = tc.COLUMN_NAME) 

  UNION

  SELECT tab.table_name AS TABLE_NAME, 

         0 AS COLUMN_ID, '' AS COLUMN_NAME,

         '' AS NULLABLE, '' AS DATA_TYPE,

         tab.comments AS COMMENTS

  FROM user_tab_comments tab

WHERE table_name = UPPER(:MY_TABLE)

ORDER BY table_name, column_id

)

WHERE comments LIKE '%일련번호%'


'개발 > DB' 카테고리의 다른 글

Mybatis #과 $의 차이  (1) 2014.11.10
몽고DB 설치  (0) 2014.01.22
테이블 정보(컬럼 정보, 코멘트 등등)  (0) 2013.11.11
테이블 사이즈 구하기(컬럼 길이, 컬럼 길이 평균)  (0) 2013.03.12
[ORACLE] 달력  (0) 2012.09.14
[ORACLE] 디비 락 해제  (0) 2012.01.09
0  Comments,   0  Trackbacks
댓글 쓰기
테이블 사이즈 구하기(컬럼 길이, 컬럼 길이 평균)

테이블 길이 구하기(컬럼 사이즈 합)


SELECT SUM (REALLENGTH)

  FROM (SELECT DATALENGTH, COLUMNNAME, REALLENGTH

          FROM (SELECT A.COLUMN_NAME AS COLUMNNAME, A.DATA_TYPE AS DATATYPE,

                       A.DATA_LENGTH AS DATALENGTH, B.COMMENTS AS COMMENTS,

                       A.NULLABLE AS NULLABLE,

                       CASE

                          WHEN DATA_TYPE = 'NUMBER'

                             THEN DATA_PRECISION

                          ELSE DATA_LENGTH

                       END AS REALLENGTH

                  FROM DBA_TAB_COLUMNS A, ALL_COL_COMMENTS B

                 WHERE A.OWNER = B.OWNER

                   AND A.TABLE_NAME = B.TABLE_NAME

                   AND A.COLUMN_NAME = B.COLUMN_NAME

                   AND A.OWNER = 'USER'                            

                   AND A.TABLE_NAME = 'TABLE_NAME') T)


평균 길이 구하기

--1

ANALYZE TABLE TABLE_NAME COMPUTE STATISTICS;


--2

SELECT avg_row_len

FROM user_tables 

WHERE table_name='TABLE_NAME ';


* 주의사항

평균 길이에서는 NUMBER타입이 22로 계산된다.

하지만 위쪽(테이블길이)의 REALLENGTH에서는 넘버타입을 실 컬럼 사이즈로 계산하기 때문에 수치가 틀어질 수 있다

맘 편하게 NUMBER을 22로 계산하려면 REALLENGTH말고 DATALENGTH합을 구한다

'개발 > DB' 카테고리의 다른 글

Mybatis #과 $의 차이  (1) 2014.11.10
몽고DB 설치  (0) 2014.01.22
테이블 정보(컬럼 정보, 코멘트 등등)  (0) 2013.11.11
테이블 사이즈 구하기(컬럼 길이, 컬럼 길이 평균)  (0) 2013.03.12
[ORACLE] 달력  (0) 2012.09.14
[ORACLE] 디비 락 해제  (0) 2012.01.09
0  Comments,   0  Trackbacks
댓글 쓰기
[ORACLE] 달력

-- Ver. 1 --

 

SELECT    MIN(DECODE(TO_CHAR(ym+LEVEL-1,'D'),'1',LEVEL)) SUN,
                MIN(DECODE(TO_CHAR(ym+LEVEL-1,'D'),'2',LEVEL)) MON,
                MIN(DECODE(TO_CHAR(ym+LEVEL-1,'D'),'3',LEVEL)) TUE,
                MIN(DECODE(TO_CHAR(ym+LEVEL-1,'D'),'4',LEVEL)) WED,
                MIN(DECODE(TO_CHAR(ym+LEVEL-1,'D'),'5',LEVEL)) THU,
                MIN(DECODE(TO_CHAR(ym+LEVEL-1,'D'),'6',LEVEL)) FRI,
                MIN(DECODE(TO_CHAR(ym+LEVEL-1,'D'),'7',LEVEL)) SAT
FROM       (SELECT TO_DATE('200905','YYYYMM') ym FROM DUAL)
CONNECT BY LEVEL<=TO_CHAR(LAST_DAY(ym),'DD')
GROUP     BY TRUNC(ym+LEVEL,'IW')
ORDER     BY 7
;

 

-- Ver.2 --

 

SELECT MIN(DECODE(week,'1',day)) SUN,
             MIN(DECODE(week,'2',day)) MON,
             MIN(DECODE(week,'3',day)) TUE,
             MIN(DECODE(week,'4',day)) WED,
             MIN(DECODE(week,'5',day)) THU,
             MIN(DECODE(week,'6',day)) FRI,
             MIN(DECODE(week,'7',day)) SAT
FROM    (
              SELECT    level day, TO_CHAR(TO_DATE('200905','YYYYMM')+LEVEL-1,'D') week 
              FROM       DUAL
              CONNECT BY LEVEL<=TO_CHAR(LAST_DAY(TO_DATE('200905','YYYYMM')),'DD')
             )
GROUP  BY day+7-week
ORDER  BY 7 


출처는 요기

http://blog.naver.com/guile77/20092593668

 

'개발 > DB' 카테고리의 다른 글

Mybatis #과 $의 차이  (1) 2014.11.10
몽고DB 설치  (0) 2014.01.22
테이블 정보(컬럼 정보, 코멘트 등등)  (0) 2013.11.11
테이블 사이즈 구하기(컬럼 길이, 컬럼 길이 평균)  (0) 2013.03.12
[ORACLE] 달력  (0) 2012.09.14
[ORACLE] 디비 락 해제  (0) 2012.01.09
0  Comments,   0  Trackbacks
댓글 쓰기
[ORACLE] 디비 락 해제
락 찾기
SELECT c.owner, c.object_name, c.object_type, b.SID, b.serial#, b.status,
       b.osuser, b.machine
  FROM v$locked_object a, v$session b, dba_objects c
 WHERE b.SID = a.session_id AND a.object_id = c.object_id; 

세션 죽이기
alter system kill session '81, 45548'; 

그래도 안 죽을 경우(ORA-00031 발생할 경우)
PID 확인

select vs.sid, vs.username, vs.osuser, vs.process fg_pid, 
vp.spid bg_pid 
from v$session vs, v$process vp 
where vs.paddr = vp.addr;

프로세스 킬
kill -9 xxxxx; 
 

'개발 > DB' 카테고리의 다른 글

Mybatis #과 $의 차이  (1) 2014.11.10
몽고DB 설치  (0) 2014.01.22
테이블 정보(컬럼 정보, 코멘트 등등)  (0) 2013.11.11
테이블 사이즈 구하기(컬럼 길이, 컬럼 길이 평균)  (0) 2013.03.12
[ORACLE] 달력  (0) 2012.09.14
[ORACLE] 디비 락 해제  (0) 2012.01.09
0  Comments,   0  Trackbacks
댓글 쓰기