2011년 6월 9일 목요일

Scrolling Result Sets

JDBC 2.0 이전에는, JDBC 드라이버는 앞 방향인 , 한 방향으로만 이동하는 커서를 가진, 읽기만 가능한 결과를 반환했다. 각 엘리먼트는 resultset에 next 메소드를 호출함으로써 추출된다.

JDBC2.0은 스크롤할 수 있는 결과를 소개하고, 그 결과 값은 만약 데이터베이스에 의해 읽기와 수정이 지원되면, 읽혀지고, 수정 될 수 있다. 스크롤할 수 있는 결과를 가지고, 어떤 열도 임의적으로 선택될 수 있고, 결과들은 앞으로 뒤로도 탐색되어 질 수 있다.
이와 같은 새로운 결과(Resultset)에 대한 장점은 executeUpdate 호출없이 해당 열의 셋을 수정할 수 있다는 것이다. 그 수정은 JDBC호출로 만들어 지고 새로운 SQL 명령을 생성하지 않아도 된다. 이것은 여러분이 작성할 코드의 이식성을 높여준다.
StatementsPreparedStatements 모두 스크롤 타입과 수정 타입을 허용하는 부가적인 생성자를 가지고 있다. 그 스크롤 타입 값은 아래와 값의 하나가 될 수 있다:
  • ResultSet.TYPE_FORWARD_ONLY
  • JDBC 1.0에서 디폴트, 애플리케이션은 resultset에 next() 메소드만 호출할 수 있다.
  • ResultSet.SCROLL_SENSITIVE
  • 결과는 완전 네비게이블(스크롤가능)하고 수정은 결과에 반영괸다.
  • ResultSet is fully navigable and updates are reflected in the result set as they occur.
  • ResultSet.SCROLL_INSENSITIVE
  • 결과는 완전 네비게이블(스크롤 가능)하나, 수정은 오직 결과가 닫힌 후에 보여질 수 있다. 여러분은 그 결과를 보기위해 새로운 결과를 생성해야 한다.


수정 타입 파라메터는 아래 2가지 중 하나가 될 수 있다:
  • ResultSet.CONCUR_READ_ONLY
  • 결과는 읽기로만 설정되어 있다.
  • ResultSet.CONCUR_UPDATABLE
  • 결과는 수정될 수 있다.


아래의 con.getMetaData().supportsResultSetConcurrency() 메소드를 호출하여 이들 타입을 데이터베이스가 지원하는 것을 검증할 수 있다.

Connection con = getConnection();
 if(con.getMetaData().supportsResultSetConcurrency(
    ResultSet.SCROLL_INSENSITIVE,
    ResultSet.CONCUR_UPDATABLE)) {

    PreparedStatement pstmt = con.prepareStatement(
      "select password, emailaddress,
      creditcard, balance from
      registration where theuser = ?",
      ResultSet.SCROLL_INSENSITIVE,
      ResultSet.CONCUR_UPDATABLE);
}

Navigating the ResultSet

완전히 스크롤 가능한 결과(resultset)는 간단한 명령을 사용하여 이동할 수 있는 커서를 리턴한다. 기본적으로 결과(resultset) 커서는 결과의 처음 열 앞의 열을 포인트한다. next() 메소드 호출은 첫 번째 열을 추출한다. 그 커서는 또한 아래와 같은 ResultSet 메소드를 호출함으로써 이동될 수 있다:

  • beforeFirst(): 기본위치, 커서를 결과(resultset)의 첫 번째 열 앞에 놓는다.
  • first():커서를 결과의 첫 번째 열 앞에 놓는다.
  • last(): 커서를 결과의 마지막 열에 놓는다.
  • afterLast():
  • 커서를 결과의 마지막 열 넘어 놓는다. previous 메소드를 호출함으로써 뒤로 커서를 움직인다.
  • absolute(pos): pos에 정해진 열로 커서를 놓는다. absolute(1)은 첫 번째 열, absolute(-1)은 마지막 열이다.
  • relative(pos): pos에 정해진 만큼 앞 방향으로 현재 커서위치에서 이동한다.

Updating the Result Set

여러분은 결과(resultset)에서 커서가 위치한 열의 ResultSet.update 메소드를 호출함으로써 값을 수정할 수 있다. 여기서 그 타입 값은 결과에서 값을 추출할 때 사용된 타입과 같다. 예를 들어, updateString 는 결과의 String 값을 수정한다.

다음 코드는 전에 생성했던 결과(resultset)으로부터 사용자에 대한 차액을 수정한다. 실제 데이터베이스에 대한 수정은 rs.updateRow() 때 수행된다. 결과를 updateRow 전에 결과를 닫는 것은 결과에 대한 지금까지의 수정을 적용하지 못하게 할 것이다.

rs.first();
 updateDouble("balance",
       rs.getDouble("balance") - 5.00);

새로운 열을 삽입하는 것은 같은 update 메소드를 호출한다. 유일한 차이점은 필드가 초기화되기 전에 rs.moveToInsertRow 메소드 호출되고, rs.insertRow() 는 후에 호출된다는 것이다. 현재 열의 삭제는 rs.deleteRow().를 호출하여 할 수 있다.

Batch Jobs

기본적으로, 모든 JDBC statement는 개별적으로 데이터베이스로 전해진다. 부가적인 네트웍 요청은 별도로 하고, 이 프로세스는 한 트랜잭션이 여러 statement로 되어 있다면 부가적인 지연을 초래한다. 그래서 JDBC2.0에서는 addBatch 메소드를 사용하여 한번에 다수의 statement를 전송하게 한다.

다음 코드는 addBatch 메소드를 사용하는 방법을 보여준다. stmt.addBatch를 호출하면, statment를 원래 Statement 에 덧붙이고 executeBatch를 호출하면, 모두 더해진 statement를 데이터베이스에 전달한다.

 Statement stmt = con.createStatement();
  stmt.addBatch(
       "update registration set balance=balance-5.00
       where theuser="+theuser);
  stmt.addBatch(
       "insert into auctionitems(
                      description, startprice)
       values("+description+","+startprice+")");

  int[] results = stmt.executeBatch();

addBatch 메소드의 반환 결과는 배치 작업에서 실행된 각 statement에 영향받은 열의 배열이다. 만약 문제가 발생한다면, java.sql.BatchUpdateException 가 throw된다. getUpdateCounts 메소드를 호출함으로써 불완전한 열 수의 배열이 BatchUpdateException 으로 얻어질 수 있다.

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...