itsource

Spring JDBC 지원 및 대규모 데이터 세트

mycopycode 2023. 7. 16. 13:19
반응형

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드라이버가 한 번에 가져올 행 수를 제어할 수 있습니다.

하지만,RowMapperSpring에서 사용하는 것처럼 각 행을 메모리로 읽고, 다음을 얻습니다.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);

반복기는 소진 시 자동으로 닫히거나 수동으로 닫을 수 있습니다.트랜잭션 범위 내에서만 작동합니다.

고지 사항:나는 이 도서관을 썼습니다.

  1. 정의 프로시저를 하는 사용자 저장 StoredProcedure
  2. 성을 합니다.RowCallBackHandler한 번에 하나씩 각 행을 처리할 수 있습니다.
  3. 매개 변수를 선언합니다.결과 집합이 있는 경우 먼저 결과 집합을 선언합니다.을 합니다.SqlReturnResultSet 클스를생성다니합여용사를 .RowCallBackHandler
  4. 다른 매개 변수 선언
  5. 컴파일
  6. 고객 저장 프로시저의 생성자에서 2단계부터 5단계까지 수행했습니다.
  7. 입력 매개 변수를 포함하는 맵 만들기
  8. 입력 매개 변수를 사용하여 저장 프로시저 실행

코드를 제공하고 싶지만 다음 글에는 이 모든 정보가 포함되어 있습니다.

Spring JDBC 템플릿을 사용한 저장 프로시저 호출

여기 자바 SQL 결과 세트를 모두 메모리로 가져올 수 있는 좋은 라이브러리가 있습니다.

http://casperdatasets.googlecode.com

데이터 집합을 스크롤하거나 반복하고, 데이터 집합에 대한 쿼리를 실행하고, 최적화를 위한 인덱스를 작성할 수 있습니다.또한 java.sql.javaet 인터페이스를 구현하여 jdbc 코드를 최소한으로 변경하여 이 데이터 집합의 결과에 대해 계속 작업할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1341254/spring-jdbc-support-and-large-dataset

반응형