3

スレッドあたり 5000 として 10 スレッドを使用して、データベースに 50000 のレコードを挿入する必要があります。元。スレッド 1 は 1-5000 を挿入し、スレッド 2 は 5001-10000 を挿入します。

これを行うために ExecutorService を使用しました。

コード

ExecutorService threadPool = Executors.newFixedThreadPool(10);
int i=0;
 while(i<vVec.size())
 {
  if(i<vVec.size())
  {
    DBInsertDetail rrr = (DBInsertDetail)vVec.get(i);
    TestThread t1 = new TestThread(rrr);
    threadPool.execute(t1);

  }

  i++;
}


 try {
       threadPool.shutdown();
       boolean bTermination = false;


       while (true) 
       {
     bTermination = threadPool.awaitTermination(15, TimeUnit.MINUTES);  

     if(!bTermination)
     {
         Log.debug("Awaiting completion of threads.");
     }
     else
     {
        Log.debug("Threads Completed."+iTermiVal);
        break;
     }

     if(threadPool.isTerminated())
     {
       break;
     }      

     }
 } catch (Exception e) {}

TestThread クラス

public class TestThread implements Runnable 
{
    private volatile DBInsertDetail syncc;

    public Thread1(DBInsertDetail syncc) {
        this.syncc = syncc;        
    }

    public void run() { 

    try  
    {         this.syncc.cardCreProcess(syncc.getIncre(),syncc.getStarterial(),syncc.getCurTblSeq());
            Thread.sleep(1000);
        } catch (Exception e) {              
            e.printStackTrace();
        }
    }   
}

DBInsertDetail クラス

public class DBInsertDetail {
public void cardCreProcess(int iNum,int iCurrSerl,int iCurTblSeq)
{
  int iCardCountTest = 0;
  try
  {
   synchronized(this)
   {

    for (int i = 0; i < iNum; i++)
    {
     iCurrSerl++;
     iCurTblSeq++;
     iCardCountTest++;    

     CmnDet stkDet = new CmnDet();
     Data crdData = new Data();
     String sNo = crdData.getNextNo(pro, prof, sBranch, iCurrSerl);

     stkDet.setNo(sNo);
     stkDet.setCod(""+iCurTblSeq);

     if (!stkDet.saveToDataBase(con))
     {
    sErrorMsg +="Error Occured" + "\n";
     }

   }

  }
}catch(Exception ex)
{
ex.printStackTrace();

}
finally{
  //commit and return connection
}

}
}

問題は、これがより大きな番号に対して正しく実行されないことです。スレッドあたりのレコード数を 10000 に増やすと、プロセスはエラーなしで実行されますが、バッチの一部しか挿入されません。何か案が?

4

1 に答える 1