-1

Executor Serviceに接続プーリングを使用しようとしています。Java Executorサービス接続プール

接続プールの設定がinitialSize = 3、maxToal = 5、maxIdle = 5のときに問題が発生します。

1分ごとに10のサービスを一度に処理する必要があります。しかし、1分ごとに5つのサービスしか選択しません。私は毎分のために、その摘み10個のサービスをINITIALSIZE = 3、maxToal = 10、maxIdle = 10を設定した場合

は...

私は、マルチスレッドとの接続に新しいです。以下は私のコードスニペットです。ご提案をお願いします。エグゼキュータ・サービスのために

public class TestScheduledExecutorService { 
    public static void main (String a[]) { 
     ScheduledExecutorService service = null; 
     try { 
      TestObject runnableBatch = new TestObject() { 
       public void run() { 
        testMethod(); 
       } 
      }; 
      service = Executors.newSingleThreadScheduledExecutor(); 
      service.scheduleAtFixedRate(runnableBatch, 0, 30, TimeUnit.SECONDS); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public class TestObject implements Runnable{ 

    public void testMethod (int inc) { 
     ExecutorService service = null; 
     try { 
      service = Executors.newFixedThreadPool(10); 
      for (int i = 0; i < 10; i++) { 
       service.submit(new TestService()); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void run() { 
    } 
} 

public class TestService implements Callable{ 

    Connection conn = null; 

    public void process(Connection conn) { 
     try { 
      if (conn != null) { 
       System.out.println("Thread & Connection pool conn : "+Thread.currentThread() + " :: " +conn); 
       // service process here 
      } else { 
       System.out.println("Connection pool conn is null : "); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
     } 
    } 

    @Override 
    public Object call() throws Exception { 
     ConnectionPoolTest cp = ConnectionPoolTest.getInstance(); 
     BasicDataSource bds = cp.getBasicDataSource(); 
     conn = bds.getConnection(); 
     System.out.println(" call() "); **// it prints only 5 times for every minute eventhough total services are 10** 
     process(conn); 
     return null; 
    } 

} 

public class ConnectionPoolTest { 

private static ConnectionPoolTest dataSource = new ConnectionPoolTest(); 

    private static BasicDataSource basicDataSource = null; 

    private ConnectionPoolTest() { 
    } 

    public static ConnectionPoolTest getInstance() { 
     if (dataSource == null) 
      dataSource = new ConnectionPoolTest(); 
     return dataSource; 
    } 

    public BasicDataSource getBasicDataSource() throws Exception { 
     try { 
      basicDataSource = new BasicDataSource(); 

      basicDataSource.setInitialSize(3); 
      basicDataSource.setMaxTotal(10); 
      basicDataSource.setMaxIdle(10); 
     } catch (Exception e) { 
      throw e; 
     } 
     return basicDataSource; 
    } 

} 
+1

"シングルトン"が壊れています。あなたが今やっているように毎回新しい 'BasicDataSource'を作成するはずがありません。 – Kayaman

+0

ありがとうKayaman。このための解決策を教えてください。 – DEADEND

+0

簡単な解決策はありません。あなたのコードは非常に多くの点で間違っています。私は接続プールとエグゼキュータの両方についていくつかの読書(チュートリアル、その他のスタックオーバーフローの投稿など)をすることをお勧めします。現在、あなたは完全に間違った方法でそれらの両方を使用しています。 – Kayaman

答えて

2

initialSize : Specified Number of Threads to spin , when New executor is created. 
maxTotal : Number of Threads that can exist at max peak load. 
maxIdle  : Number of Thread that are kept active even if load goes below threshold. 

あなたが述べたように、あなたが並行して作業の10数をピックアップしたい、私たちは10 intialSizemaxTotalセットがするように構成することができているはずです開始時に最適と思われる数値は、3 - 5となります。maxIdleは、アクティブにしたいスレッドの数です。通常、タスクがサブミットされる場合に必要なスレッドの数を仮定します。標準的な勧告はありませんが、vauesのようないくつかのさまざまな要因が決定される可能性があります。タスク並行してこれらのタスクを実行する

  • 緊急性の分
  • 期間中に提出されたタスクの

    1. 配布。

    あなたが言及したように、10個の並列タスクが必要な場合は、タスクの分散と期間が重複するため、maxTotalとして10を構成する必要があります。期間がかなり短く、流通している場合でも、低い数字でも生き残ることができます。

  • +0

    コードを見ると、彼は実際には固定スレッドプールを使用しています'10'スレッドであり、設定は*接続プール*用です。 – Kayaman

    +1

    お返事ありがとうございます。 の期間はわずかです。 ExecutorServiceは接続プールの権利に依存しません。指定されたスレッド数が回転すると言っていますが、私は3を設定しましたが、5つのサービスが並行しています。 – DEADEND