[SPRING] Spring JDBC 지원 및 대규모 데이터 세트
SPRINGSpring JDBC 지원 및 대규모 데이터 세트
다양한 JDBC 템플릿 메소드 중 하나를 사용할 때 (메모리에 맞지 않는) 큰 결과 세트를 반복 / 스크롤하는 방법에 대해 혼란스러워합니다. Iterable 인터페이스를 직접 노출하지 않아도 쿼리가 끝나거나 (또는 힙 오버플로) 실행되는 동안 RowCallbackHandler 인스턴스가 호출 될 것으로 예상됩니다.
나는 이것을 보았다. (스택 오버플로에 관한이 포스트와 정신이 비슷 함에도 불구하고 나를 위해 아무것도 바뀌지 않았다.) 그리고이 포럼에서 스프링 포럼에 올랐다. 후자는 커서가 데이터를 가져 오는 동안 실제로 콜백 처리기가 호출되어야한다고 제안하는 것 같습니다. 내 테스트 그러나 그런 행동을 보여줍니다.
데이터베이스는 Oracle10g입니다. 11.1.0.7.0-Production 드라이버와 Spring 2.5.6.SEC01을 사용하고 있습니다. RowMapper 등의 매핑 논리를 유지하면서 결과 집합을 반복하는 방법에 대한 아이디어는 누구나?
해결법
-
==============================
1.Oracle JDBC 드라이버는 드라이버가 한 번에 가져올 행 수를 제어 할 수있는 java.sql.Statement의 setFetchSize () 메소드를 올바르게 지원합니다.
Oracle JDBC 드라이버는 드라이버가 한 번에 가져올 행 수를 제어 할 수있는 java.sql.Statement의 setFetchSize () 메소드를 올바르게 지원합니다.
그러나 Spring이 사용하는 RowMapper는 각 행을 메모리로 읽어 들이고 RowMapper를 객체로 변환하여 각 행의 객체를 하나의 큰 목록에 저장함으로써 작동합니다. 결과 집합이 거대한 경우 JDBC가 행 데이터를 가져 오는 방법에 관계없이이 목록은 커집니다.
큰 결과 세트를 처리해야하는 경우 RowMapper는 확장 할 수 없습니다. RowCallbackHandler 대신 JdbcTemplate의 해당 메소드를 사용하는 것이 좋습니다. RowCallbackHandler는 결과를 저장하는 방법을 지시하지 않고 결과를 저장하도록 지시합니다.
-
==============================
2.spring jdbc-iterable 라이브러리를 사용할 수 있습니다 :
spring jdbc-iterable 라이브러리를 사용할 수 있습니다 :
CloseableIterator<MyObj> iter = jt.queryForIter("select ...", params, mapper);
반복자는 자동으로 닫히거나 수동으로 닫힐 수 있습니다. 트랜잭션 범위 내에서만 작동합니다.
면책 조항 : 나는이 도서관을 썼다.
-
==============================
3.데이터를 다시 스트리밍할지 여부 또는 한 청크로 다시 전송할지 여부는 드라이버 / 연결의 속성입니다. 예를 들어 SQL Server에서는 연결 URL에 SelectMethod 속성을 사용합니다.
데이터를 다시 스트리밍할지 여부 또는 한 청크로 다시 전송할지 여부는 드라이버 / 연결의 속성입니다. 예를 들어 SQL Server에서는 연결 URL에 SelectMethod 속성을 사용합니다.
직접적인 가치는 결과가 한꺼번에 이어져야 함을 의미합니다. 다른 선택은 커서를 사용하여 연결에서 결과를 사용자에게 스트리밍하도록 지정할 수 있습니다. 오라클 데이터 소스의 아날로그가 무엇인지 모르겠습니다. 두려워요.
RowCallbackHandler는 확실히 나를 위해 작동합니다.
-
==============================
4.코드를 제공 하겠지만 다음 기사에는이 모든 정보가 포함되어 있습니다.
코드를 제공 하겠지만 다음 기사에는이 모든 정보가 포함되어 있습니다.
Spring JDBC 템플릿을 사용하여 저장 프로 시저 호출
-
==============================
5.여기에 자바 SQL 결과 집합을 모두 메모리로 가져 오기위한 훌륭한 라이브러리가있다.
여기에 자바 SQL 결과 집합을 모두 메모리로 가져 오기위한 훌륭한 라이브러리가있다.
http://casperdatasets.googlecode.com
데이터 세트를 스크롤 / 반복 할 수 있고, 쿼리를 실행할 수 있으며 최적화를위한 인덱스를 작성할 수 있습니다. 또한 java.sql.resultset 인터페이스를 구현하므로 최소한의 chnages를 사용하여이 데이터 세트의 결과를 jdbc 코드로 계속 연산 할 수 있습니다.
from https://stackoverflow.com/questions/1341254/spring-jdbc-support-and-large-dataset by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 프록시가 작동하지 않는 CGLIB 서비스의 자산 조롱 (0) | 2019.02.01 |
---|---|
[SPRING] Hibernate에 의해로드 된 엔티티로 Spring을 통해 필드 주입 (0) | 2019.02.01 |
[SPRING] 스프링 부트에서 Postgres 연결이 닫혔다. (0) | 2019.02.01 |
[SPRING] CDI의 Instance 또는 Guices Provider에 해당하는 Spring은 무엇입니까? (0) | 2019.02.01 |
[SPRING] Spring Optimistic Locking : 커밋이 성공할 때까지 트랜잭션 방식을 다시 시도하는 방법 (0) | 2019.02.01 |