2014-11-03 7 views
-1

나는 상점, 제품 2 개의 엔티티가있는 데이터베이스를 가지고 있습니다. 모든 제품에는 그의 묘사와 상점의 이드가있는 칼럼이있어 어디에서 FK로 가져갈 수 있습니까? 상점에는 설명이있는 열도 있습니다.웹 사이트에서 PostgreSQL 데이터베이스를 읽는 효과적인 방법

내가 원하는 TreeTable 숍 목록입니다. u가 모든 상점 아래 나무를 확장 할 때이 상점에 제품 목록이 있습니다.

저는 Vaadin TreeTable을 사용하여 PostgreSQL 데이터베이스에 연결하는 JDBC 드라이버를 사용했습니다.

셀렉트 숍 (약 900 행)은 극도로 빠릅니다. 1 초 미만. 그러나 진술서를 열 때 상점 당 모든 제품을 선택하고 그것을 닫으면 내 DB가 죽습니다.

하나의 제품에 1 개의 제품이 있어도 7-11 초가 걸립니다. 그래서 개폐문이 주요한 문제라고 생각합니다.

편집 : 일반적인 상황은 한 상점에서 단 1-2 제품 만 있다는 것입니다. 더 이상은 없어.

내가 5 단계에서 수행 한 작업을 게시했습니다. 그러나 rly 코드가 필요한 경우 일부 부품을 게시합니다. JDBC의 일반적인 사용이지만, 많은 행을 가져 오거나 웹 사이트를 사용할 필요가 있는지 묻습니다. 많은 사용자. JDBC를 사용하여 신속하게 구현하는 것이 가장 좋은 방법입니다.

내 코드 :

열기 연결 :

//in db helper class 

Connection conn = null; 

void openConnection(){ 
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; 
    static final String DB_URL = "jdbc:mysql://localhost/shops"; 
    static final String USER = "username"; 
    static final String PASS = "password"; 

    try{ 
     Class.forName("com.mysql.jdbc.Driver"); 
     conn = DriverManager.getConnection(DB_URL, USER, PASS); 
    }catch(SQLException se){ 
     se.printStackTrace(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

List<Shop> getAllShops(){ 
    Statement stmt = null; 
    try{ 
     stmt = conn.createStatement(); 
     ResultSet rs = stmt.executeQuery(sql); 
     while(rs.next()){ 
      //save rs into Shop object 
     } 
     rs.close(); 
    }catch(SQLException se){ 
     se.printStackTrace(); 
    }finally{ 
    try{ 
     if(stmt!=null) 
      conn.close(); 
     }catch(SQLException se){ 
    } 
    } 

//method to get operations is exacly the same but im passing Shop int id into method 

    void closeConnection(){ 
     if(connection != null) 
      conn.close(); 
    } 

    //in some layout class 
    void createAndFillTableMethod(){ 
    //create table 

     DatabaseHelper db = new DatabaseHelper(); 
     List<Shop> ls = new ArrayList<Shop>(); 
     ls = getAllShops(); 

     for(Shop shop: ls){ 
      List<Product> lp = new ArrayList<Product>(); 
      lp = getAllProducts(shop.id); 

      //add shop to table 
      //add lp list as a childs of shop to table 
     } 
     db.closeConnection(); 
} 

추신 : 내가 어떤 캐치를 시도 건너 뛸 수 있습니다.

+1

좋아, 너 뭐 해봤 니? – Houari

+0

상점 당 몇 개의 제품이 있습니까? 상점을위한 1의 1000의 줄은 전혀 빨리 소리가 나지 않는다. DB 또는 DB 전반에 대한 채널에 이미 문제가있을 수 있습니다. 글쎄 그것은 모두 데이터에 달려 있으며 매우 광범위한 질문입니다 ... – cfrick

+0

@houari code 게시 – ilovkatie

답변

1

문제가 해결되었습니다. 웹 사이트를 통해 데이터베이스에 연결할 때 좋은 습관을 발견했습니다.

은 내가 무슨 짓을 :

  1. 추가 내 angel이라는 서블릿 세션 이벤트.
  2. 세션 시작시 : PostgreSQL 데이터베이스와의 연결을여십시오.
  3. 세션 종료시 : 열린 연결을 닫습니다.

무엇보다 :

내가 synchronized 문을 사용하여 열린 연결을 둘러싸는 (F5 버튼으로 새로 고침) 여러 연결을 열 방지하고 플래그를 추가하려면.

어떤 문 및 결과 세트에 대한 :

이이 동일하게 유지. 결과를 실행하고 저장 한 후 모든 선택 및 닫기 전에 열기

관련 문제