CachedRowSet
CachedRowSet (캐시된 행 집합)
모든 표준 CachedRowSet 구현이 구현해야 하는 인터페이스입니다.
본문
CachedRowSet 객체는 행을 메모리에 캐시하는 데이터 행의 컨테이너로, 항상 데이터 소스에 연결되어 있지 않아도 동작할 수 있게 해 줍니다. 또한 JavaBeans 컴포넌트이면서 스크롤 가능하고, 갱신 가능하며, 직렬화 가능합니다. CachedRowSet 객체는 보통 결과 집합의 행을 담지만 스프레드시트 같은 표 형식의 파일 행도 담을 수 있어요.
CachedRowSet 객체는 연결 해제된(disconnected) 행셋입니다. 즉 데이터 소스 연결을 잠깐만 사용합니다. 행을 읽어 자신을 채울 때와 변경 내용을 하부 데이터 소스로 다시 전파할 때만 연결되고, 데이터가 수정되는 동안을 포함해 그 외의 시간에는 연결 해제 상태입니다. 연결 해제 상태는 행셋을 훨씬 가볍게 만들어 다른 컴포넌트로 넘기기 쉽게 해 줍니다. 예를 들어 연결 해제된 RowSet은 직렬화되어 PDA 같은 씬 클라이언트로 네트워크를 통해 보내질 수 있어요.
SyncProvider 객체는 CachedRowSet에 데이터 소스에서 데이터를 읽어 자신을 채우는 리더(RowSetReader)와, 연결 해제 동안 가한 변경을 하부 데이터 소스의 데이터와 동기화하는 라이터(RowSetWriter)를 제공합니다. 라이터는 충돌 검사와 회피에 다양한 주의 수준을 두고 구현될 수 있어요. 기본 참조 구현 제공자인 RIOptimisticProvider는 충돌이 거의 없을 것이라 가정하고 잠금을 설정하지 않으며, 충돌이 없을 때만 데이터 소스를 갱신합니다.
데이터 조회는 ResultSet 인터페이스에서 상속한 getter 메서드로 합니다.
while (crs.next()) {
String name = crs.getString("NAME");
int id = crs.getInt("ID");
System.out.println(name + " " + id);
}
갱신은 ResultSet을 갱신하는 것과 비슷하지만, updateRow나 insertRow 호출 후에는 반드시 acceptChanges를 호출해 데이터 소스로 변경을 기록해야 합니다.
crs.updateShort(3, 58);
crs.updateInt(4, 150000);
crs.updateRow();
crs.acceptChanges();
acceptChanges를 실행하면 하부 데이터 소스에 변경을 쓰기 위해 내부적으로 라이터가 데이터 소스와 연결을 맺어야 합니다. 여러 행을 바꿀 때는 모든 updateRow/insertRow 호출 후에 acceptChanges를 한 번만 호출하는 것이 더 효율적이에요.
CachedRowSet은 페이지 단위로 데이터를 가져올 수도 있습니다. setPageSize로 페이지에 포함될 행 수를 정하고, populate나 execute로 데이터를 채운 뒤 nextPage/previousPage로 페이지를 이동합니다.
CachedRowSet crs = new CachedRowSetImpl();
crs.setPageSize(100);
crs.execute(conHandle);
while (crs.nextPage()) {
while (crs.next()) {
// operate on chunks (of 100 rows each) in crs, row by row
}
}
CachedRowSet의 주요 용도 중 하나는 애플리케이션의 여러 컴포넌트 사이에 데이터를 전달하는 것입니다. 직렬화 가능하므로 서버 환경에서 실행되는 기업 JavaBeans 컴포넌트가 실행한 질의 결과를 웹 브라우저의 클라이언트로 보내는 데 쓸 수 있어요. 또 스크롤·갱신을 지원하지 않는 ResultSet에 그 능력을 더해 주는 데 사용할 수 있습니다.
ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEES");
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.populate(rs);
void populate(ResultSet data) throws SQLException
void execute(Connection conn) throws SQLException
void acceptChanges() throws SyncProviderException
void acceptChanges(Connection con) throws SyncProviderException
void restoreOriginal() throws SQLException
void release() throws SQLException
void undoDelete() throws SQLException
void undoInsert() throws SQLException
void undoUpdate() throws SQLException
boolean columnUpdated(int idx) throws SQLException
boolean columnUpdated(String columnName) throws SQLException
CachedRowSet 객체의 한계는 한 번에 메모리에 저장할 수 있는 데이터 양에 따라 크기가 제한된다는 점입니다. 대부분의 경우 CachedRowSet은 JDBC API로 SQL 데이터베이스에서 가져온 데이터를 담게 될 것이라 기대됩니다.