Spring JDBC 지원 및 대규모 데이터 세트
다양한 JDBC 템플릿 방법 중 하나를 사용할 때 큰 결과 집합(메모리에 맞지 않음)을 반복/스크롤하는 방법에 대해 혼란스럽습니다.Itable 인터페이스를 직접 노출하지 않더라도 쿼리가 실행되는 동안 RowCallbackHandler 인스턴스가 호출될 것으로 예상됩니다(또는 힙 오버플로).
저는 이것(스택 오버플로에 대한 이 게시물과 정신적으로 유사함에도 불구하고 저에게 아무것도 변하지 않았습니다)과 봄 포럼의 이 게시물을 살펴보았습니다.후자는 커서가 데이터를 가져오는 동안 콜백 핸들러가 실제로 호출되어야 한다고 제안하는 것 같습니다.하지만 제 테스트는 그런 행동을 보이지 않습니다.
데이터베이스는 Oracle 10g입니다.11.1.0.7.0-Production 드라이버와 Spring 2.5.6을 사용하고 있습니다.SEC01. RowMapper 등의 매핑 로직을 유지하면서 결과 집합을 반복하는 방법에 대한 아이디어가 있습니까?
Oracle JDBC 드라이버가 적절한 지원을 제공합니다.setFetchSize()
에 대한 방법.java.sql.Statement
드라이버가 한 번에 가져올 행 수를 제어할 수 있습니다.
하지만,RowMapper
Spring에서 사용하는 것처럼 각 행을 메모리로 읽고, 다음을 얻습니다.RowMapper
각 행의 개체를 하나의 큰 목록에 저장합니다.결과 집합이 크면 JDBC가 행 데이터를 가져오는 방법에 관계없이 이 목록이 커집니다.
큰 결과 집합을 처리해야 하는 경우에는 RowMapper를 확장할 수 없습니다.사용하는 것을 고려해 볼 수 있습니다.RowCallbackHandler
대신 JdbcTemplate의 해당 메서드와 함께 사용됩니다. RowCallbackHandler
결과를 저장하는 방법은 사용자에게 맡겨지지 않으며 결과를 저장하는 방법은 사용자에게 있습니다.
데이터를 사용자에게 다시 스트리밍할지 또는 한 청크로 다시 전송할지 여부는 드라이버/연결의 속성입니다.예를 들어 SQL 서버에서SelectMethod
연결 URL의 속성:
jdbc:microsoft:sqlserver://gsasql03:1433;DatabaseName=my_db;SelectMethod=direct
의 가치direct
결과가 한 번에 나와야 한다는 뜻입니다.다른 선택사항은 결과를 사용자에게 다시 스트리밍하도록 연결을 지정할 수 있습니다.Oracle 데이터 소스의 아날로그가 무엇인지 잘 모르겠습니다.
그RowCallbackHandler
확실히 저한테는 효과가 있어요.
springjdbc-itable 라이브러리를 사용할 수 있습니다.
CloseableIterator<MyObj> iter = jt.queryForIter("select ...", params, mapper);
반복기는 소진 시 자동으로 닫히거나 수동으로 닫을 수 있습니다.트랜잭션 범위 내에서만 작동합니다.
고지 사항:나는 이 도서관을 썼습니다.
- 정의 프로시저를 하는 사용자 저장
StoredProcedure
- 성을 합니다.
RowCallBackHandler
한 번에 하나씩 각 행을 처리할 수 있습니다. - 매개 변수를 선언합니다.결과 집합이 있는 경우 먼저 결과 집합을 선언합니다.을 합니다.
SqlReturnResultSet
클스를생성다니합여용사를 .RowCallBackHandler
- 다른 매개 변수 선언
- 컴파일
- 고객 저장 프로시저의 생성자에서 2단계부터 5단계까지 수행했습니다.
- 입력 매개 변수를 포함하는 맵 만들기
- 입력 매개 변수를 사용하여 저장 프로시저 실행
코드를 제공하고 싶지만 다음 글에는 이 모든 정보가 포함되어 있습니다.
Spring JDBC 템플릿을 사용한 저장 프로시저 호출
여기 자바 SQL 결과 세트를 모두 메모리로 가져올 수 있는 좋은 라이브러리가 있습니다.
http://casperdatasets.googlecode.com
데이터 집합을 스크롤하거나 반복하고, 데이터 집합에 대한 쿼리를 실행하고, 최적화를 위한 인덱스를 작성할 수 있습니다.또한 java.sql.javaet 인터페이스를 구현하여 jdbc 코드를 최소한으로 변경하여 이 데이터 집합의 결과에 대해 계속 작업할 수 있습니다.
언급URL : https://stackoverflow.com/questions/1341254/spring-jdbc-support-and-large-dataset
'itsource' 카테고리의 다른 글
SQL Server에서 적용되는 인덱스 및 적용되는 쿼리란 무엇입니까? (0) | 2023.07.16 |
---|---|
WooCommerce - 카트에 추가할 때 선택하지 않은 변형 무시 (0) | 2023.07.16 |
두 셀을 분할한 결과의 SUM(SUM PRODUCT 대신 분할) (0) | 2023.07.16 |
시작 페이지 초기화 중 Oracle SQL Developer 문제 (0) | 2023.07.16 |
UI 레이블에서 터치 이벤트 처리 및 IBAction에 연결 (0) | 2023.07.16 |