반응형

MySQL 5.1부터 PreparedStatement라는 기능을 지원합니다. 일반질의문(statement)을 만들어 실행하면 쿼리분석->최적화->권한체크->쿼리실행 단계를 거치게 되는데 PreparedStatement를 사용하면 쿼리분석,최적화단계를 1번만 거치고 SQL내에 저장해두었다가 필요할때 쓸 수 있습니다. 그렇기 때문에 세션내에서 생성해놓고 닫기전까지 계속 같은 질의문을 사용이 많이 반복해야 한다면 성능상 효과적입니다. 또한 일반 statement는 문자열 텍스트 통신하는 반면 PreparedStatement를 사용하면 데이터가 바이너리 통신을 합니다. 이 또한 성능상 이득입니다. 뿐만아니라 다음에 설명할 변수홀더(SQL문에 ?부분)를 사용함으로써 SQL인젝션문제로부터 어느정도 보안적 이슈를 해결할 수 있습니다. 


PreparedStatement을 사용하는 SQL문을 작성해보면 아래와 같습니다. 


1. PREPARE stmt_test FROM "SELECT seq,name,birthday FROM mydb.mytable WHERE seq = ?";

2. SET @Seq = 4;

3. EXECUTE stmt_test USING @Seq;

4. DEALLOCATE PREPARE stmt_test;


각각 문장에 대해서 설명하자면 이런식으로 쓸 수 있습니다.

1. PreparedStatement 생성. "?"는 변수홀더. (Com_stmt_prepare+1, Prepared_stmt_count+1)

2. @Seq 셋팅 

3. PreparedStatement 실행 (Com_stmt_execute+1)

4. PreparedStatement 닫기 (Com_stmt_close+1)


PreparedStatement의 생성, 실행, 닫음, 현재갯수 등을 알아보기 위해 다음 질의문을 사용할 수 있습니다. 


SELECT * FROM information_schema.global_status WHERE variable_name IN ('Com_stmt_prepare','Com_stmt_execute','Com_stmt_close','Prepared_stmt_count' );


1. Com_stmt_prepare : 세션상관없이 지금까지 생성된 PreparedStatement 수 

2. Com_stmt_execute : 세션상관없이 지금까지 실행한 PreparedStatement 수 

3. Com_stmt_close: 세션상관없이 지금까지 닫힌 PreparedStatement 수 

4. Prepared_stmt_count : 세션상관없이 지금운영중인 PreparedStatement 수. 세션이 닫히거나 명시적으로 close시키면 -1이 됩니다. 


이 정보가 중요한 이유를 JDBC의 경우를 예로 들어볼께요. 기본적으로 JDBC에서 useServerPrepStmts는 false입니다. 왜냐하면 MySQL은 PreparedStatement를 5.1부터 지원했기 때문에 JDBC의 호환성을 보장해야 하기 때문입니다. 그래서 useServerPrepStmts=true로 해야 PreparedStatement를 사용할 수 있습니다. false이면 JDBC는 자체 PreparedStatement를 사용합니다. 즉 겉으로는 서버 PreparedStatement를 사용하는 것처럼 보이지만 실은 그렇지 않다는 것이지요. 속으면 안되는 불편한 진실인 셈이죠. 그래서 PreparedStatement가 제대로 동작하는지 보려면 위에서 언급한 Com_stmt_prepare, Com_stmt_execute등을 직접 확인해야한다는 겁니다. 


주의할 것은 PreparedStatement는 세션단위로 관리되므로 PreparedStatement객체는 하나의 MySQL 커넥션에서만 사용할 수 있음을 기억해야 합니다. View처럼 등록하고 모든 세션에서 사용할 수 있는게 아니라는 겁니다. 그러므로 PreparedStatement의 장점을 십분 살리려면 해당 세션내에서 같은 SQL문을 수도없이 많이 반복해서 사용해야 하는 경우에 활용하면 좋다는 겁니다. 그외에는 효과가 미비합니다. 그게 아니라 반복되는 SQL을 패턴화시켜 효율성을 높히고 싶다면 View를 사용하세요.

반응형

+ Recent posts