-1

我正在嘗試爲Executor服務使用連接池。Java執行器服務連接池

當連接池配置爲initialSize = 3,maxToal = 5,maxIdle = 5時,我遇到了一些問題。

我需要每分鐘處理10個服務。但它每分鐘只選擇5項服務。

如果我爲每分鐘配置INITIALSIZE = 3,maxToal = 10,了maxidle = 10,則其採摘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

謝謝卡亞曼。你能告訴我這個解決方案嗎? – DEADEND

+0

沒有簡單的解決方案。你的代碼在很多方面都是錯誤的,我建議讀一些關於連接池和執行程序的文章(教程,其他stackoverflow文章等)。目前,你正以完全錯誤的方式使用它們。 – 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號在並行任務時,我們應該有maxTotal調爲10 intialSize可配置一個你認爲在開始時是最優的數字,比如3 - 5。maxIdle是你想保持活動的線程數量,我們通常假設如果提交任務需要多少線程。雖然沒有標準的推薦,但可能會確定許多不同的因素。

  1. 分發任務的任務分鐘的
  2. 時間
  3. 並行執行這些任務的緊迫性期間提交。

正如您所提到的,您需要10個並行任務,那麼您必須將10配置爲maxTotal,考慮到您的任務分配和持續時間導致重疊。如果持續時間很短,分配甚至可以在較低的數量下生存。

+0

中的每10組連接有所不同。但是,如果您查看代碼,您會注意到他實際上使用的是固定線程池'10'線程,並且配置用於*連接池*。 – Kayaman

+1

謝謝你的回覆。 持續時間很短。 ExecutorService不依賴於連接池權限。你說特定線程數旋轉,我cnfigured 3,但它需要5個服務並行。 – DEADEND