2014-11-11 2 views
0

모두. 나는 RESTful 웹 서비스에 문제가있다. Java에서 RESTful 서비스를 호출하는 PHP 클라이언트가있다. 내 RESTful 서비스에서는 Post 쿼리 메서드를 사용하여 업데이트 쿼리를 실행하여 10000 개의 레코드가있는 테이블의 모든 행을 수정합니다. 나는 이것을하기 위해 쓰레드를 사용하고 싶다. 그렇게 할 수 있습니까? 제발 내가 자바에서 새로운 일종의 도와주세요. 감사.Java의 RESTful 웹 서비스에 스레드를 사용하십시오.

내 서비스 계층이 일을 해요 OK :

for(int i = 0; i < 10; i++) 
{ 
    startRow = i*1000; 
    finalRow = i*1000 + 1000; 
    Runnable process = new ProcessRecords(startRow , finalRow); 
    executor.execute(process);      
} 

// Wait until all threads are finish 
while (!executor.isTerminated()) { 

} 
System.out.println("\n All threads finished"); 

그리고 업데이트 실행이 클래스 (ProcessRecords)를 호출하고 있습니다 : 내 데이터 계층 I에서 다음

public ProcessRecords (int start, int final) 
{ 
    startRow = start; 
    finalRow = final; 
} 

@Override 
public void run(){ 

    try { 

     ConsultUniversity consult = new ConsultUniversity(); 
     consult.averangeGrade(startRow, finalRow); 

    } catch (Exception ex) { 
     Logger.getLogger(Procesos.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

을 내 방법 "averangeGrade"내부에서 이렇게 해요 :

try { 
     conn = UniversityConection();//This is my conection 

     query = "SELECT * FROM grades LIMIT " + filaInicial + "," + filaFinal;    
     prepStatement = conn.prepareStatement(query); 

     rs = prepStatement.executeQuery(query); 

     rsmd = rs.getMetaData(); 

     while(rs.next()) 
     { 
      averange = (rs.getInt("nFirGrd") + rs.getInt("nSecGrd") + 
           rs.getInt("nThrGrd"))/3; //the averange of three grades 

      query = "UPDATE grades SET nFinGrd = ? WHERE cCodAlu = ?"; 

      prepStatement = conn.prepareStatement(query); 
      prepStatement.setInt(1, averange); 
      prepStatement.setString(2, rs.getString("cCodAlu")); 

      prepStatement.executeUpdate(); 

      System.out.println("Record " + rs.getString("cCodAlu") + 
             " modified"); 
     }    

     conn.close(); //close connection  

    } 

그런 다음 내 클라이언트를 실행할 때 내 서비스는 upda를 수행합니다. 50 행과 같은 맨 위 행에 대해 te를 실행 한 다음 모든 프로세스가 완료된 것처럼 메시지를 반환하고 이유를 모르겠습니다. 나는 모든 쓰레드가 끝날 때까지 기다리지 않고 있다고 생각하지만, 쓰레드는 그것을위한 코드이다 : S, 그렇다면 왜 이런 일이 일어나는가? 도와주세요. 고맙습니다.

+0

더 구체적으로 말씀해주십시오 : (1) "쓰레드 사용"이란 정확히 무엇을 의미합니까? (2) 어떤 문제를 해결하려고합니까? – EJK

+0

단순히 스레드를 사용해도 데이터베이스의 속도는 증가하지 않습니다. RESTful 호출이 테이블의 모든 행을 업데이트하는 경우 테이블이 한 번만 업데이트해야하는 외부 값을 참조하도록 데이터를 재구성해야한다. – psaxton

+0

글쎄, 자바 웹 컨테이너는 이미 멀티 스레드입니다. 이 큰 업데이트를 실행하기 위해 비동기 작업을 실행하려고합니다. 문제를 더 잘 이해할 수 있도록 명확히 설명해 주시겠습니까? –

답변

1

물론 가능합니다. Java에서 제공하는 동시 API에 익숙합니까?

높은 수준의 관점에서 해당 HTTP POST를 처리하는 코드를 작성해야합니다. 이 코드에서는 임의의 수의 스레드 (스레드 풀)를 인스턴스화 할 수 있으며 풀의 각 스레드는 업데이트 할 행의 하위 집합에 대한 업데이트를 만듭니다. 예를 들어, 10 개의 스레드를 시작할 수 있으며 각 스레드는 단지 1000 개의 행으로 업데이트합니다. 또한

:

  1. 설치 응용 프로그램의 시작시 스레드 풀, 그래서 때마다 POST 그것은 이미 생성 된 풀을 사용하여 실행되고, 그것이 새로운마다 시간을 인스턴스화하지 않습니다 것 I (그 너무 비쌉니다)
  2. 각 스레드에 행의 하위 집합을 할당하려면 하위 집합을 선택할 수있는 LIMIT 및 START sql 절을 사용해야합니다. 당신은 문서를이 도움이 here 또는 here 희망을 찾을 수 있습니다

    // instantiate the pool 
    ExecutorService pool=Executors.newFixedThreadPool(poolSize); 
    // run the task to execute in parallel, specificying the subset of rows 
    pool.execute(new UpdateHandler(limit,skip)); 
    
    // below you find a prototype of the async thread task 
    class Handler implements Runnable { 
        private final int skip; 
        private final int limit; 
        Handler(int limit, int skip) { ... } 
    
        public void run() { 
        // specify the code that runs the query here 
        } 
    } 
    

    : 각 스레드는이 두 매개 변수 코드에서

에 따라 다른 쿼리를 할 것입니다.

+0

예, 유용했습니다. 고마워요. 그러나 나는 아무런 결과가 없으므로, beacuse가 작동하고 있습니다. 그러나 첫 번째 행에 대해서만 나는 이유를 모르겠습니다.나는 내 질문에 더 많은 정보를 넣었다. 도움이 될지도 몰라. 고맙습니다. –

+0

@ErickRodriguezAvarez 게시 한 것처럼 각 스레드의 끝을 기다리기 전에 스레드 풀 종료를 실행하고 있습니다. 모든 스레드가 작업을 마친 후에 실행해야합니다. –

+0

네, 고맙습니다, 당신은 모두 힘이 들었습니다.하지만 내 스레드를 실행할 때, 심지어 내 스레드가 완료되면 while 루프가 끝나지 않습니다. 왜 이런 일이 일어나고 있다고 생각하니? –

관련 문제