복붙노트

[SPRING] 검색 폼에서 데이터 액세스 속도 향상

SPRING

검색 폼에서 데이터 액세스 속도 향상

hibernate와 JPA를 사용하는 spring mvc app에서 사용자가 기본 데이터베이스의 레코드를 검색 할 수있게하는 키워드 클래스가 있습니다. JSP는 민들레 데이터 테이블에 검색 상자를 가지고 있으며 검색 결과에 사용자가 검색에 사용할 단어를 선택할 수있는 짧은 키워드 목록이 포함될 때까지 사용자가 텍스트를 입력하여 키워드 옵션 수를 줄입니다. .

문제는 기본 데이터 테이블에 80,000 개의 키워드가 있고 검색에 사용 된 필드의 기본 데이터베이스 테이블에 인덱스를 추가 한 후에도 내 앱이 모든 키워드를 JSP로 보내는 데 20 분이 걸린다는 것입니다. 최소 3 자의 텍스트가 검색 창에 입력되었을 때 키워드가 JSP로 보내지도록 설정하는 방법이 있습니까?

여기 내 컨트롤러 방법입니다 :

@RequestMapping(value = "/search", method = RequestMethod.GET)
public String processFindForm(
        ConcWordKey wordkey, HttpServletRequest request, BindingResult result, Map<String, Object> model) {

    Collection<ConcWordKey> results = this.clinicService.findKeyWord("");
    System.out.println("results.size() is: "+results.size());
    model.put("selections", results);
    return "search";
}  

다음은 JSP의 관련 부분입니다.

<datatables:table id="keywords" data="${selections}" cdn="true" row="kw" theme="bootstrap2" 
      cssClass="table table-striped" paginate="true" info="false" 
      cssStyle="width: 150px;" align="left" dom="frtp">
    <datatables:column title="Name" cssStyle="width: 150px;" display="html">
        <spring:url value="/search?name={name}" var="searchUrl">
            <spring:param name="name" value="${kw.name}"/>
        </spring:url>
        <a href="${fn:escapeXml(searchUrl)}"><c:out value="${kw.name}"/></a>
    </datatables:column>
</datatables:table>  

다음은 선택 항목을 채우는 JPA 메소드입니다.

@SuppressWarnings("unchecked")
public Collection<ConcWordKey> findKeyWord(String str) {
    Query query = this.em.createQuery("SELECT DISTINCT wk FROM ConcWordKey wk WHERE wk.name LIKE :wd");
    query.setParameter("wd", str + "%");
    Collection<ConcWordKey> results = query.getResultList();
    return results;
}

해결법

  1. ==============================

    1.클라이언트 측 성능이 좋지 않은 것은 데이터를로드하는 데 사용하는 방법에서 비롯된 것입니다. 나는 80000 레코드가 DOM 소스에 너무 많이 있다고 생각한다. 특히 검색은 키 누르기로 시작된다.

    클라이언트 측 성능이 좋지 않은 것은 데이터를로드하는 데 사용하는 방법에서 비롯된 것입니다. 나는 80000 레코드가 DOM 소스에 너무 많이 있다고 생각한다. 특히 검색은 키 누르기로 시작된다.

    v0.10.0 이전 : 페이징이 가능한 AJAX 소스로 전환하는 것이 좋습니다. 일을 설정하는 데 조금 더 많은 작업이 필요하지만 성능에 중요한 영향을 미쳐야합니다. JSP 샘플 애플리케이션은 귀하와 동일한 기술 (Spring, JPA)을 사용합니다. 자유롭게 느껴보십시오.

    그러나 실제로 DOM 소스로 데이터로드를 유지하려는 경우이 게시물에서 제안한 것처럼 키 누르기 이벤트 핸들러를 간단히 바인드 해제 할 수 있습니다. 이를 구현하려면 Dandelion-Datatables의 추가 JavaScript 기능이 필요합니다.

    v0.10.0부터 : 여러 가지 방법으로 필터링 기능이 개선되었습니다.

    물론, AJAX 소스를 사용하는 것이 여전히 권장되지만 위의 기능은 UX를 더욱 향상시킵니다. 일단이 버전이 출시되면이 문서를 새로운 문서와 샘플 앱에 대한 올바른 링크로 업데이트 할 것입니다.

    희망이 도움이!

    (Disclaimer StackOverflow 필요 : 나는 민들레의 저자)

    편집 : 민들레 0.10.0 발표했다. 링크 추가됨

  2. ==============================

    2.EhCache가 먼저 필요한 것일 수는 없습니다. 이 도구는 응용 프로그램 캐시를 처리 할 수있는 기능을 제공합니다. 즉, 가장 많이 사용되는 개체를 메모리에 저장하고 필요시 메모리에서 더 빠르게 액세스 할 수 있습니다. 따라서 80 000 개의 키워드가있는 경우 80 000+ 개의 검색 가능성이있는 것 같습니다. 즉 다음과 같은 의미입니다.

    EhCache가 먼저 필요한 것일 수는 없습니다. 이 도구는 응용 프로그램 캐시를 처리 할 수있는 기능을 제공합니다. 즉, 가장 많이 사용되는 개체를 메모리에 저장하고 필요시 메모리에서 더 빠르게 액세스 할 수 있습니다. 따라서 80 000 개의 키워드가있는 경우 80 000+ 개의 검색 가능성이있는 것 같습니다. 즉 다음과 같은 의미입니다.

    하지만 Lucene (또는 여러 개의 인스턴스가있는 경우 Solar)와 같은 기본 인덱스 시스템이 필요하므로 쿼리 속도를 높이는 데 도움이됩니다. 그러면 이전에 해고 되든 상관없이 검색 속도가 빨라집니다.

    물론 캐싱 시스템이있는 인덱싱 시스템을 사용하여 더 나은 성능을 얻을 수 있습니다. 내 포인트는 처음에는 캐싱보다 인덱싱이 더 중요하다는 것입니다.

    다른 아이디어 :

    행운을 빕니다 !

    편집 : 문제를 검토, 자동 완성 기능이 더 좋을 것이다. 예 : http://johnderinger.wordpress.com/2013/01/10/html-autocomplete-with-jpa-rest-and-jquery/

  3. from https://stackoverflow.com/questions/23662863/speed-up-data-access-in-a-search-form by cc-by-sa and MIT license