2012-02-16 1 views
3

Oracle 데이터베이스에서 대량의 데이터를 Java 객체로 가져 오는 가장 빠른 방법은 무엇입니까?오라클 데이터베이스에서 대량의 데이터를 Java 객체로 가져 오는 가장 빠른 방법

데이터 구성 방법에 관한 오라클 트릭이 있습니까?

나는 Hibernate 스타일 라이브러리가 아닌 일반 JDBC를 사용하려고 생각하고 있었습니까?

오라클이 파일을 생성 한 다음 파일에서 읽는 것이 더 나을지는 모르겠지만, 이는 프로그래밍 방식으로 수행해야합니다.

모든 의견을 감사드립니다.

+0

데이터의 일괄 처리를 읽도록 멀티 스레드 JDBC 클라이언트를 설정한다고 생각합니다. 자바 객체를 직렬화하려고하거나 메모리에 그냥 보관하고 있습니까? – Laurent

+0

나는 당신이 Hibernate의 성능을 이길 JDBC 라이브러리를 작성할 수 있을지 의심 스럽다. 액세스하려는 모든 테이블에 대해 적절한 인덱스를 정의해야합니다. – Perception

+0

많은 양의 데이터를 의미 할 때 얼마입니까? 한 번에 전체 데이터를 Java 객체로 변환하기를 원하십니까? 한 번에 모든 것을로드하려는 경우 힙 크기를 확인해야 할 수도 있습니다. – Rocky

답변

4

저는 Java 또는 JDBC 전문가는 아니지만 데이터베이스에서 많은 행을 가져 오는 계획이라면 연결의 프리 페치 행을 늘리는 것이 좋습니다.

Connection conn = DriverManager.getConnection ("jdbc:oracle:","user","password"); 

//Set the default row prefetch setting for this connection 
((OracleConnection)conn).setDefaultRowPrefetch(100); 

나는 JDBC의 기본은 한 번에 하나 개의 행을 가져 믿고, 그래서 당신은 페치 된 각 행에 대해 데이터베이스에 왕복을 지불하고 있습니다. (참고로, 기본값은 왕복 당 10 줄임을 나타내는 문서를 보았습니다.) 프리 페치를 더 큰 수로 설정하면 왕복 당 데이터베이스 당 더 많은 행이 페치됩니다. 속도 증가는 행 수와 네트워크 성능에 따라 크게 달라질 수 있습니다.

1

그것은 아마 ... 당신은 내가 JDBC를 삭제하고 DB가 Oracle Call API을 사용하고 JNI가 가장 빠른 것와 동일한 시스템에있는 사용자 지정 응용 프로그램을 작성하는 상상 것이에 가고 싶어 얼마나 멀리에 따라 JDBC를 사용하여 평범한 준비된 문장을 사용하는 것이 훨씬 간단하고, 충분하지 않은 경우 (그리고 병목이 어디에 있느냐에 따라) 스토어드 프로 시저를 만들어보십시오. 최대 절전 모드와 같은 ORM의 캐싱은 할인해서는 안되기 때문에 벤치 마크를 수행해야합니다. 또한 bottle neck이 데이터베이스이고 읽기 성능을 향상시키는 저장 프로 시저를 작성하는 경우 Hibernate를 사용하여 데이터를 Java 객체에 마샬링 할 수 있습니다. Using stored procedures for querying

+0

Oracle API 사용이 일반 JDBC보다 빠르다는 주장을 뒷받침 할만한 증거가 있습니까? – Dan

+0

데이터를 Java 메모리로 가져 오는 데 캐싱에 관심이 없습니다. – Dan

+0

@Emil H, 캐싱은 이전에 읽지 않은 데이터를 읽는 데 도움이되지 않습니다. – brettw

1

"게으른 초기화"를 디자인하거나 구현하는 것은 무엇이든간에 [실제로는 복잡한 객체 계층 구조/네트워크에만 적용됩니다. 당신은 자바 객체 (복수형)를 사용하여 단일 객체에 매핑되는 단일 테이블 이상을 상상하고 있습니다.] 그래서 기본적으로, 당신은 그 시간에 필요한 대상을 읽는 중입니다. getter 메소드를 실행하면, 그 데이터에 대해서 더 많은 db 호출을 수행한다.

자바 세상에서 간과되는 또 다른 트릭은 : 코드에서 오는 복잡한 SQL이 있다면 오히려 오라클 측에서 복잡한 것을 포함하고 뷰를 생성 할 수 있습니다. 그래서 당신이보기처럼 당신의 객체를 평평하게 할 수 있다면, 당신은 사업에 종사하고 있습니다.

관련 문제