둘다 SQL을 실행시키는 객체이다
*PreparedStatement
1.여러번 수행될 때 빠른 속도를 지님
2.쿼리에 인자를 부여할 수 있음
3.처음 프리컴파일 된 후, 컴파일을 수행하지 않음
ex)
String sql="Select * From TEST where name=?";
PreparedStatement psmt=conn.preparedStatement(sql);
psmt.setString(1,"yoon");
ResultSet rs=psmt.executeQuery();
Statement 와는 다르게 conn.cretateStatement() 와 비교하여 conn.preparedStatement(sql ) 쿼리문을 미리 생성한다.
실행할 때도 psmt.executeQuery() 때 쿼리를 파라미터에 넣지 않고 수행하는것을 확인할 수 있음
실행시 쿼리를 생성하지 않고 이미 미리 생성되있는 상태이기 때문에 Statement에 비해 반복 실행시 속도가 훨씬 빠름
*Statement
1.단일로 사용될 때 빠른 속도를 지님
2.쿼리에 인자를 부여할 수 없음
3.매번 컴파일을 수행해야 함
ex)
String sql= " Select * From TEST where name='Yoon' ";
Statement stmt = conn.createStatement()
ResultSet rs = stmt.executeQuery(sql);
쿼리에 파라미터 값이 없고 executeQuery(sql) 메소드에 쿼리를 파타미터 값으로 넣고 있어서
실행 전까지는 무슨 쿼리를 실행하는지 알지 못함.
따라서 쿼리문을 실행할 때마다 생성하며 반복 실행되는 경우는 효율이 떨어짐
**속도비교 TEST(출처:mozi.tistory.com/29)
*table 스키마 및 데이터 건수
gSQL> CREATE TABLE PERFORMANCE (C1 INT PRIMARY KEY, C2 CHAR(30), C3 DATE);
Table created.
gSQL> SELECT COUNT(*) FROM PERFORMANCE;
COUNT(*)
--------
1000000
1 row selected.
*Statement 테스트
s_sTime = System.currentTimeMillis();
Statement stmt = con.createStatement();
for(i = 0; i < 1000000; i++){
stmt.executeQuery("SELECT C1, C2, C3 FROM PERFORMANCE WHERE C1 = " + i );
}
s_eTime = System.currentTimeMillis();
System.out.println("Statement Milli Time : " + (s_eTime-s_sTim
Statement Milli Time : 124750
1,000,000건을 가져오는데 124초 걸림
*PreparedStatement 테스트
s_sTime = System.currentTimeMillis();
PreparedStatement pstmt = con.prepareStatement("SELECT C1, C2, C3 FROM PERFORMANCE WHERE C1 = ?");
for(i = 0; i < 1000000; i++){
pstmt.setInt(1, i);
pstmt.executeQuery();
}
s_eTime = System.currentTimeMillis();
System.out.println("PreparedStatement Milli Time : " + (s_eTime-s_sTime));
PreparedStatement Milli Time : 25825
1,000,000건을 가져오는데 25초 걸림
Goldilocks 데이터베이스에서 X$STATEMENT 를 조회하면
Statement 는 매번 컴파일 되기 때문에 항상 수행횟수가 1 인 반면,
PreparedStatement 는 한번 컴파일한 구문을 사용하기 때문에 수행횟수가 증가하는 것을 확인할 수 있습니다.
gSQL> -- Statement
gSQL> SELECT ID, SESSION_ID, SQL_TEXT, EXECUTIONS FROM X$STATEMENT;
ID SESSION_ID SQL_TEXT EXECUTIONS
-- ---------- ------------------------------------------------------------ ----------
16 4 SELECT ID, SESSION_ID, SQL_TEXT, EXECUTIONS FROM X$STATEMENT 1
0 28 SELECT C1, C2, C3 FROM PERFORMANCE WHERE C1 = 38422 1
gSQL> -- PreparedStatement
gSQL> SELECT ID, SESSION_ID, SQL_TEXT, EXECUTIONS FROM X$STATEMENT;
ID SESSION_ID SQL_TEXT EXECUTIONS
-- ---------- ------------------------------------------------------------ ----------
19 4 SELECT ID, SESSION_ID, SQL_TEXT, EXECUTIONS FROM X$STATEMENT 1
0 28 SELECT C1, C2, C3 FROM PERFORMANCE WHERE C1 = ? 52676
'SPRING > Servlet || JSP' 카테고리의 다른 글
9.(JSP)오라클 DBCP 설정 (0) | 2021.03.06 |
---|---|
8.(JSP)한글.jpg 한글이름으로 된 이미지 출력하기 (0) | 2021.03.06 |
7.(JSP) *.do 서블릿과 FrontController 패턴 (0) | 2021.03.04 |
6.(JSP) Forwarding(포워딩) (0) | 2021.03.04 |
5.(JSP) MVC 패턴(model1,model2) (0) | 2021.03.04 |