2016-11-25 4 views
0

우리의 mongodb 아키텍처는 매주 데이터를 저장합니다. 매주 동일한 컬렉션 세트가있는 자체 db가 있습니다. 내가 순차적으로 12 시간 찾기를 실행 (이 경우)를병렬로 문지기 쿼리 속도를 높이고 ThreadPool을 사용 하시겠습니까?

... 
for (MongoOperationDto week : allWeeks) { 
    results.addAll(repo.find(gid, week.db(), week.collection()); 
} 
... 

: 때때로 나는 12 개 서로 다른 데이터베이스 (한 몽고 서버의 모든) 이상 같은 쿼리를 실행 즉, 12 주 이상까지 데이터를 확인해야합니다. 내부 연결 풀에서 처리 할 것 같습니까? 12 개의 자바 쓰레드를 만들고 모든 쓰레드가 하나의 find를 실행한다면 이점이 있지 않겠는가? 어쩌면 좋아 :

public class FindTask { 

    @Autowired 
    MyMongoRepo repo; 

    @Async 
    public List<Result> doFindTask(long gid, MongoOperationDto week) { 
     return repo.find(gid, week.db(), week.connection()); 
    } 
} 

어떤 방법이 실제로 빠른 또는 데이터를 검색에는 속도 차이가 없다?

+0

테스트를 통해 확인하십시오. 자바 측에서 12 개의 스레드가'find()'를 수행하더라도 여전히 동일한 서버를 사용하고 있습니다 (그러나 성능상의 차이는 없습니다). 연결 풀링은이 *와는 전혀 관련이 없습니다. – Kayaman

답변

2

connection pool하면 연결을 처리, 아무것도 : 데이터베이스에 대한 향후 요청이

을 요구하는 경우

소프트웨어 공학에서

, 연결 풀은 연결을 재사용 할 수 있도록 유지 관리 데이터베이스 연결의 캐시입니다

첫 번째 코드는 MongoDb에 대한 새 연결을 설정하는 대신 첫 번째 찾기가 완료된 후에 풀에있는 기존의 이미 열려 있거나 사용되지 않은 연결을 다시 사용할 수 있음을 의미합니다.

첫 번째 경우 12 개의 직렬 쿼리와 각 쿼리에 대해 1 개의 연결이 사용됩니다.

두 번째 경우에는 동시에 12 개의 다른 연결을 사용하는 12 개의 병렬 쿼리가 있습니다.

쿼리가 오랜 시간이 필요한 경우 성능 측면에서 두 번째 솔루션은 빠르며 (완료 시간은 길지 만) 더 많은 리소스 (RAM, CPU 시간)를 사용해야합니다. 시간은 mongodb 아키텍처의 영향을받습니다. 쿼리가 동일한 디스크에서 긴 디스크 작업으로 작동하면 아마 병렬 처리로 인해 전체 시간이 너무 많이 향상되지는 않습니다.

+0

귀하의 답변이 완료되었습니다! 나는 너무 많은 스레드 생성 오버 헤드에 중점을두고 싶다! 그래서 만약 당신이 작은 쿼리 또는 정상적인 서버의 무리를 가지고,이 전혀하지 마! –

+0

외부 데이터베이스를 호출 할 때 스레드 오버 헤드가 중요하지 않습니다. 그러나 코드는 훨씬 더 어려워 질 수 있으므로 성능에 영향을 미치지 않으면 이런 식으로 시도하지 않는 것이 좋습니다. –

+0

빠른 답변 주셔서 감사합니다. 그리고 나는 스레딩을 통해 약간의 오버 헤드를 만들고 더 많은 RAM/CPU 리소스를 소비한다는 것을 알고 있습니다. – grimbo