처리 속도를 높이기 위해 JDBC 문을 일괄 처리

5751 단어
때때로 JDBC가 이상적으로 실행되지 않아서 우리는 특정 데이터베이스와 관련된 저장 과정을 쓰게 된다.대체 방안으로서 Statement의 일괄 처리 특징을 시험해 보고 모든 SQL 문장을 한 번에 실행하는 것이 속도를 높일 수 있는지 확인해 보는 것도 괜찮다.
저장 프로세스의 가장 간단한 형식은 전체 프로세스가 하나의 SQL 문구만 포함하는 것이다.이 문장들을 함께 놓으면 관리하기도 쉽고 운행 속도도 높일 수 있다.Statement 클래스는 일련의 SQL 문장을 포함하는 능력을 가지고 있기 때문에 모든 SQL 문장을 데이터베이스 세션에서 실행할 수 있고 데이터베이스에 일련의 실행 호출을 피할 수 있습니다.
배치 기능을 사용하려면 다음 두 가지 방법이 필요합니다.
addBatch 방법
excuteBatch 방법
ddBatch 방법은 표준 SQL (Statement를 사용한다면) 을 매개 변수로 받아들일 수도 있고, 매개 변수를 포함하지 않을 수도 있다. (Prepared Statement를 사용한다면)
excuteBatch 방법은 다음에 SQL 문장을 실행하고 int형 그룹을 되돌려줍니다.이 수조는 문장마다 영향을 주는 줄 수를 포함한다.일괄 처리에서 SELECT나 결과만 되돌려주는 문장을 사용하면 SQLException 이상이 발생합니다.
다음은 간단한java입니다.sql.Statement의 예:
Statement stmt = conn.createStatement();
stmt.insert("DELETE FROM Users");
stmt.insert("INSERT INTO Users VALUES('rod', 37, 'circle')");
stmt.insert("INSERT INTO Users VALUES('jane', 33, 'triangle')");
stmt.insert("INSERT INTO Users VALUES('freddy', 29, 'square')");
int[] counts = stmt.executeBatch();
PreparedStatement를 사용하면 조금 다릅니다.SQL 문은 하나만 처리할 수 있지만 여러 매개변수를 포함할 수 있습니다.다음은 PreparedStatement를 사용하여 다시 쓴 위의 예입니다.
//삭제 동작을 하지 않았음을 주의하십시오
PreparedStatement stmt = conn.prepareStatement( _
"INSERT INTO Users VALUES(?,?,?)");
User[ ] users = ...;
for(int i=0; i{
stmt.setInt(1, users[i].getName());
stmt.setInt(2, users[i].getAge());
stmt.setInt(3, users[i].getShape());
stmt.addBatch( );
}
int[ ] counts = stmt.executeBatch();
이것은 구체적인 실행 횟수를 모르는 SQL 코드를 처리하는 좋은 방법이다.일괄 처리가 없습니다. 50명의 사용자를 추가하려면 성능에 영향을 받을 수 있습니다.만일 누가 10000명의 사용자를 추가한 스크립트를 썼다면, 실행 속도는 견디기 어려울 것이다.일괄 처리를 늘리면 성능 향상에 도움이 되고, 다음 상황에서는 코드의 가독성을 개선할 수 있다.
PreparedStatement를 사용하여 개발 시간 단축
JDBC(Java Database Connectivity,java 데이터베이스 연결)의 API 중 주요 네 가지 클래스 중 하나인 java.sql.Statement는 개발자에게 많은 시간과 노력을 요구합니다.Statement를 사용하여 JDBC에 접근할 때 공통적으로 존재하는 문제는 적당한 형식의 날짜와 시간 스탬프를 입력하는 것입니다: 2002-02-05 20:56 또는 02/05/02 8:56 PM.자바를 사용합니다.sql.Prepared Statement, 이 문제는 자동으로 해결됩니다.하나의 Prepared Statement는java에서 시작합니다.sql.Connection 객체 및 제공된 SQL 문자열의 경우 SQL 문자열에 물음표(?)가 포함됩니다.물음표는 변수의 위치를 표시하고 변수의 값을 제공하며 마지막으로 다음과 같은 문을 실행합니다.
Stringsql = "SELECT * FROM People p WHERE p.id = ? AND p.name = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setInt(1,id);
ps.setString(2,name);
ResultSet rs = ps.execute();
PreparedStatement를 사용하는 또 다른 장점은 문자열이 동적 생성이 아니라는 것이다.다음은 문자열을 동적으로 만드는 예입니다.
Stringsql = "SELECT * FROM People p WHERE p.i = "+id; 

<A href="http://ad.cn.doubleclick.net/click%3Bh=v2|3065|3|0|%2a|d%3B6674094%3B0-0%3B0%3B8394480%3B4252-1|1%3B3892012|3909908|1%3B%3B%7Efdr%3D6407221%3B0-0%3B0%3B6694709%3B31-1|1%3B3640229|3658125|1%3B%3B%3fhttp://www.oracle.com/go/?&Src=2039880&Act=388"target=_top><IMG src="http://m2.cn.doubleclick.net/714347/10gdata_336x280.gif"border=0></A>
이는 JVM(JavaVirtual Machine, Java 가상 머신)과 드라이버/데이터베이스 캐시 문구와 문자열을 허용하고 성능을 향상시킨다.
PreparedStatement도 데이터베이스와 무관성을 제공합니다.표시된 SQL이 적을수록 잠재적인 SQL 문장의 데이터베이스 의존성은 작아집니다.
Prepared Statement는 많은 장점을 가지기 때문에 개발자들은 그것을 사용할 수 있습니다. 성능 때문이거나 한 줄의 SQL 문장에 변수가 없을 때만 일반적인 Statement를 사용할 수 있습니다.질의 및 처리 결과 보내기
데이터베이스에 SQL 문장을 실행하려면 Statement나Prepared Statement 실례가 필요합니다.일단 Statement나Prepared Statement를 가지고 있다면, 검색어를 보낼 수 있습니다.이렇게 하면 전체 결과가 포함된 ResultSet 인스턴스가 반환됩니다.Example 31-1은 이 과정을 보여 주었다.
Example 31-1. JDBC에서 간단한 검색 처리
이 예는 간단한 검색어를 보내고 줄마다 첫 번째 필드를 Statement로 출력합니다.
Statement st = db.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
while (rs.next()) {
    System.out.print("Column 1 returned ");
    System.out.println(rs.getString(1));
}
rs.close();
st.close();

이 예는Prepared Statement를 사용하여 앞과 같은 조회를 보내고 조회에서 수치를 만들 것입니다.
int foovalue = 500;
PreparedStatement st = db.prepareStatement("SELECT * FROM mytable WHERE columnfoo = ?");
st.setInt(1, foovalue);
ResultSet rs = st.executeQuery();
while (rs.next()) {
    System.out.print("Column 1 returned ");
    System.out.println(rs.getString(1));
}
rs.close();
st.close();

31.3.1. Statement 또는 PreparedStatement 인터페이스 사용
Statement 또는 PreparedStatement 인터페이스를 사용할 때는 다음 사항을 고려해야 합니다.
  • Statement나Prepared Statement 실례를 임의로 사용할 수 있습니다.연결을 열면 바로 Statement 실례를 만들고 연결의 생존 기간에 사용할 수 있습니다.모든 Statement나 Prepared Statement에는 Result Set이 하나만 존재한다는 것을 기억해야 한다.
  • ResultSet을 처리할 때 검색을 실행하려면 다른 Statement를 만들고 사용하십시오.
  • threads(스레드)를 사용하고 데이터베이스를 몇 개 사용한다면 모든 스레드에 대해 독립된Statement를 사용해야 합니다.스레드 사용을 고려하는 경우 이 문서의 뒷부분 Section 31.8 장을 참조하십시오. 이 내용에는 중요한 정보가 포함되어 있기 때문입니다.
  • Statement나PreparedStatement를 다 사용한 후에 닫아야 합니다.

  • 31.3.2. ResultSet(결과 세트) 인터페이스 사용
    ResultSet 인터페이스를 사용할 때는 다음 사항을 고려해야 합니다.
  • 어떤 수치를 읽을 때next()를 호출해야 합니다.결과가 더 있으면 진짜 (true) 로 돌아가지만, 더 중요한 것은 처리를 위해 데이터 줄을 준비한 것이다.
  • JDBC 규범에서 한 필드에 한 번만 접근해야 합니다.이 규칙을 따르는 것이 가장 안전하지만, 현재 PostgreSQL 드라이브는 한 필드에 임의로 접근할 수 있도록 합니다.
  • ResultSet 처리를 끝내면 close () 를 호출해서 닫아야 합니다.
  • ResultSet을 만드는 Statement를 사용하여 다른 조회 요청을 하면 현재 열려 있는 ResultSet 실례가 자동으로 닫힙니다.
  • 현재 ResultSet은 읽기 전용입니다.ResultSet을 통해 데이터를 업데이트할 수 없습니다.만약 데이터를 업데이트하고 싶다면, SQL 업데이트 문장을 보내는 일반적인 방법을 사용해야 한다.이렇게 하면 JDBC 규범과 호환되며, 드라이버가 업데이트 가능한 결과 집합을 지원하도록 요구하지 않습니다.
  • 좋은 웹페이지 즐겨찾기