2016-07-05 5 views
0
List patternList=new ArrayList<String>(); 
ResultSet rs=stat.executeQuery("select file_pattern from Pattern_table"); 
while(rs.next()){ 
    sourcePattern=rs.getString(1); 
    patternList.add(sourcePattern); 
} 

여기서 각 레코드를 살펴보고 list에 추가합니다. ResultSet을 트래버스하고 list에 레코드를 추가하는 데 너무 많은 시간이 걸립니다.ResultSet 객체를 ArrayList로 변환하는 방법

ResultSet의 모든 레코드를 list에 한 번에 추가하는 다른 방법이 있습니까?

또는 더 나은 성능을 얻기 위해 따라갈 수있는 다른 방법은 없습니까?

+1

이 루프의 속도를 높이기 위해 자바 측에서 할 수있는 일은 거의 없습니다. (아마도'ArrayList'를 미리 설정하십시오.하지만 그것에 관한 내용입니다). 실제로 성능 문제가 여기에서 오는 것인지 의심 스럽습니다. 나는이 코드가 느리다면 피할 수없는 것들 ('rs.next()')의 데이터베이스 측면 때문에 - 당신은보다 빠른 쿼리를 작성할 수 있고, 그러나 당신은'rs.next()'의 어떤 형태가 아닌 다른 방법을 반복 할 방법이 없습니다. 시간이 실제로 소요 된 시간 (예 : Java 코드가 느리거나 데이터베이스에서 I/O를 기다리는 데 소요되는 시간)을 보려면 프로파일해야합니다. – GPI

+0

가능한 경우 조건을 사용하여 데이터를 필터링하여 루프 할 요소를 줄이십시오. 아쉽게도 ResultSet은 반복 만 할 수 있습니다. – Vektor88

+0

JDBC를 직접 사용해야합니까? 대신 JPA를 사용해보십시오. – Stefan

답변

1

ResultSet 객체는 데이터의 현재 행을 가리키는 커서를 유지 관리합니다. 초기에 커서는 첫 번째 행 앞에 위치합니다. next 메서드는 커서를 다음 행으로 이동하고 ResultSet 객체에 더 이상 행이 없을 때 false를 반환하기 때문에 결과 집합을 반복하기 위해 while 루프에서 을 사용할 수 있습니다.

간단히 말해 결과 세트에서 직접 목록을 가져 오는 방법을 찾은 경우에도 항상 반복을 사용하여 목록으로 변환합니다.

1

항상 Commons DbUtilsMapListHandler을 사용할 수 있습니다. 문서에서 :

결과 집합을 결과 집합을지도 목록 으로 변환하는 ResultSetHandler 구현으로 인해 많은 상용구 코드가 손에 들게됩니다. 그리고 나머지는 데이터베이스 트랜잭션 시간에 따라 다릅니다.

0

아카이브 용으로는 many utils이 있지만 성능상 큰 비용은 데이터베이스 연결과 실행 한 SQL 문에 모두 포함되므로이를 최적화해야합니다.

0

getArray (String columnLabel) 메소드를 사용하여 resultSet에서 열 값을 가져 와서 array에 저장할 수 있습니다. 요구 사항에 따라 arrayList로 변환하십시오. 예 :

List patternList=new ArrayList<String>(); 
ResultSet rs=stat.executeQuery("select file_pattern from Pattern_table"); 
String[] tempArr = rs.getArray(file_pattern); 
patternList = Arrays.asList(tempArr); 
1

첫번째 일부 SQL 클라이언트에서 동일한 쿼리를 실행하려고 Java 코드의 성능을 향상하기 전에. SQL 클라이언트에서 가져온 시간이 Java와 동일한 지 확인하십시오.

SQL 클라이언트에는 한 번에 가져 오는 행의 수에 대한 기본 제한이 있으므로 쿼리를 실행 한 시간을 측정하기 위해 쿼리에서 반환하는 모든 행을 가져와야합니다.

SQL 클라이언트가 Java 호출보다 훨씬 빠르게 실행되는 경우 또는 ResultsetfetchSize()을 설정해보십시오.

https://docs.oracle.com/cd/A87860_01/doc/java.817/a83724/resltse5.htm

ResultSet 쿼리하지만 그것의 단지 일부분에서 전체 데이터가 아닙니다. resultSet.next()을 계속 실행하면 이전에 가져온 행이 부족 해지면 행을 계속 가져옵니다.

예를 들어 쿼리가 5000 개의 행을 반환하고 fetchSize이 100이면 result.next()은 한 번에 100 개의 행을 가져옵니다.이 100 행을 읽은 후에 만 ​​데이터베이스에 대한 다음 호출이 이루어 지므로 JDBC은 데이터베이스에 5000/100=50 네트워크 호출을합니다.

+0

감사 성능이 fetchSize를 사용하여 어느 정도 향상되었습니다. –

관련 문제