테이블이 170 만개 인 MySQL 데이터베이스를 사용하고 있습니다. Java Restlet 프레임 워크를 통해 이러한 레코드를 가져 와서 클라이언트에 반환하고 싶습니다. 원격 서버 인 Linux Centos를 사용하고 있습니다. WAR 파일을 만들고 서버에 업로드했습니다. 서비스를 실행하면 응답하는 데 많은 시간이 걸립니다. 나는 40 분을 기다렸으나 출력을 얻지 못했다. 아무도이 문제를 해결하기 위해 나를 도울 수 있습니까?Java에서 1.7 백만 레코드를 가져 오는 방법은 무엇입니까?
답변
매우 많은 행이있을 때 메모리 매핑 된 파일을 사용했습니다. 예 : 1 분 안에 11 억 개의 행을 검색하고 처리해야하는 데이터베이스가 하나 있습니다. (그 이상 200 기가 바이트)
이것은 매우 전문적인 접근 방식이며, SQL 데이터베이스를 조정하거나 NoSQL 데이터베이스를 사용하여 원하는 것을 수행 할 방법이 있다고 생각합니다. 나는 당신이 무엇을하고 있는지에 따라 분당 170 만분의 1을 구할 수 있지만 (예를 들어이 많은 amoungst 몇 TB를 선택하는 경우 잠시 걸릴 것임)
그러나 정말로 다른 사람이 없다면 옵션을 사용하면 사용자 정의 데이터 저장소를 작성할 수 있습니다.
BTW : 요약 만 생성됩니다. 아무도 많은 행을 읽어야하며 브라우저에서 표시하지 않을 것입니다. 보고서 나 요약을 생성하기 위해 할 수있는 일이있을 수 있으므로 클라이언트를 보내는 것이 적습니다.
안녕하세요 피터, 답장을 보내 주셔서 감사합니다. 예 다른 테이블의 결과로 한 테이블의 레코드를 선택하려고합니다. – Deepu
이 경우 처음에는 테이블 사이의 조인에 대해 인덱스가 최적인지 확인하는 것이 좋습니다. –
아마도 작동하지 않을 것입니다. 메모리에 많은 행의 데이터를 보관하면 메모리 부족 예외가 발생할 수 있습니다 (서버의 로그를보고 정확히 무슨 일이 일어나는지보십시오).
이와 같이하려면 계획을 포기하고 일종의 페이지 매기기를 수행하거나 메모리에 저장하지 않고 클라이언트로 레코드를 스트리밍 할 수있는 솔루션이 필요합니다. 나는 Restlet 프레임 워크가 그렇게 할 수 있는지 확신하지 못한다. 아마 당신은 서블릿을 직접 사용하여이를 구현해야 할 것이다.
답장을 보내 주셔서 감사합니다. – Deepu
내 앱에서 이런 종류의 작업을 성공적으로 마쳤습니다. 고객이 큰 응답을받을 준비가되면 접근법에 문제가 없습니다. 요점은 응답을 스트리밍해야한다는 것입니다. 즉 전체 응답을 문자열로 작성할 수 없음을 의미합니다. HTTP 응답의 출력 스트림을 가져 와서 레코드를 하나씩 작성하십시오. db-end에서 스크롤 가능한 결과 셋을 설정해야합니다 (JDBC 레벨 에서뿐만 아니라 Hibernate 레벨에서도 쉽게 할 수 있습니다).
안녕하세요, Marko, 답장을 보내 주셔서 감사합니다. 스크롤 가능한 결과 집합을 사용하고 있는데, HTTP의 출력 스트림을 사용해 보겠습니다. – Deepu
어떻게 성능을 향상시킬 수 있습니까? –
일종의 페이지 매김을 추가하고 클라이언트가 레코드의 오프셋을 지정하고 모든 가져 오기에서 레코드를 n 개로 제한 할 수 있도록 조언합니다. 그렇게하면 문제를 단순화 할 수 있습니다. 한 번에 REST를 통해 170 만 건의 레코드가 너무 많이 들린다 –
왜 지구상에서 그 많은 레코드를 가져 오려고 할 것입니까? –
전체 170 만 레코드를 고객에게 보여줄 계획입니까? 나는 당신의 브라우저가 또한 그것을 처리 할 수 없을 것이라는 점을 두려워한다. – Kshitij