2014-06-11 4 views
0

RecursiveAction 클래스를 사용하여 매우 큰 DB 테이블 (30kk 행 이상)의로드 데이터에 대해 프로그램의 다중 스레딩 부분 (GUI 사용)을 만들려는 경우가 많습니다. 실험적으로 확인했습니다. 예를 들어 이 같은 필요에 1000 뭔가에서 모든 포크로드 50 행 :JDBC 연결 동시성 충분

class ForkLoader extends RecursiveAction{ 

    private static Connection con; 
    private Map<Integer, Double> map; //In our case ConcurrentHashMap 
    private final static int seqThreshold=50; 
    private List<Integer> id; //List with id_field in DB table 

    int start,end; 

    { 
     try { 
      con=DriverManager.getConnection("jdbc:mysql://some_ip/some_db","username", "password"); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    public ForkLoader(Map<Integer, Double> map, List<Integer> id,int start, int end){ 
     this.map=map; 
     this.start=start; 
     this.end=end; 
     this.id=id; 
    } 

    @Override 
    protected void compute() { 
     if((end-start)<seqThreshold){ 
      try { 
       Statement stmt=con.createStatement(); 
       for(int i=start;i<end;i++){ 
        String query="text of some query" + id.get(i); 
        ResultSet rs=stmt.executeQuery(query); 
        map.put(id.get(i), /*some double form result set*/); 
       } 
       stmt.close();    
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      int middle=(start+end)/2; 
      invokeAll(new ForkLoader(map, id, start, middle), new ForkLoader(map, id, middle,end)); 
     } 
    } 

} 

는 안전 사용 모든 포크 하나 static 연결을 스레드인가? 이 작업을 해결하는 더 좋은 방법을 알고 있다면

답변

1

일반적으로 이러한 종류의 응용 프로그램은 연결 풀을 사용하여 연결을 처리하므로 모든 스레드가 하나의 연결을 독점적으로 사용할 수 있으며 연결보다 많은 스레드가 동시에있는 경우 연결이 할당되지 않은 스레드 기다려야한다.

당신은 연결 풀을 구현하기위한 프레임 워크는 다음을 확인할 수 있습니다 원하는 경우 :

다른 한편으로는 모든 스레드와 연결 관리를 EJB 컨테이너에 위임하려면 기본적으로 im

  • 아파치 TomEE http://tomee.apache.org/
  • 오라클 글래스 피시 https://glassfish.java.net/
  • 아파치 OpenEJB를 당신이 완전하지 않고 단지 EJB 컨테이너를 원하는 경우 : 다음 컨테이너를 확인하실 수 있습니다, 일부 컨테이너에 의해 관리되는 EJB들과 연결 풀과 같은 plement Java EE 플랫폼
+0

이전 dbcp보다 훨씬 진보 된 apache의 jdbc-pool (tomcat 프로젝트의 일부)을 사용하는 것이 좋습니다. – MRalwasser

+0

프로그램은 서블릿/애플릿이 아닌 독립 실행 형입니다. – disable1992

+0

disable1992 OpenEJB 독립 실행 형을 사용할 수 있으며 웹 컨테이너가 필요하지 않습니다. –

0

일반적으로 java.sql.Connection 인스턴스 (JDBC 연결)는 스레드로부터 안전하지 않습니다. 동시에 여러 스레드에서 동일한 Connection 개체를 사용하면 안됩니다.

대신 각 스레드에 대해 Connection을 별도로 만듭니다.

+0

포크/조인의 중요한 순간. 스레드의 양 == 포크의 양을 생성하지 않습니다. 컴퓨터에 코어가 두 개인 경우에는 스레드가 2 개만 생성됩니다. – disable1992