2015-08-27 83 views
1

併發處理我已經寫和執行類:Java併發處理

ExecutorService service = Executors.newFixedThreadPool(10); 
        Future<List<Content>> submit = service.submit(new PushClass(pushlist, content)); 
        List<Content> resu = submit.get(); 

和下面是實現可調用接口的推類:

public class PushClass implements Callable<List<Content>> { 

List<Content> ls; 
String content; 

public PushClass(List<Content> ls, String content) { 
    this.ls = ls; 
    this.content = content; 
} 

private synchronized String push(String msisdn, String content, String Cli) { 

     // hitting the push url 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return status; 

} 

@Override 
public List<Content> call() throws Exception { 

    for (Content c : ls) { 
     c.setResponse(push(c.getMsisdn(), content, c.getCli())); 
    } 
    return ls; 
} 

高達什麼限制我可以增加線程以防止任何排隊在服務器或我可以使池動態?有時tomcat顯示錯誤,因爲「其他線程正在處理中」,我可以動態縮放它。

+0

您應該嘗試使用Apache DBCP進行連接池:https://commons.apache.org/proper/commons-dbcp/ –

+1

考慮緩存數據庫條目並將它們提交爲而不是每秒有6000個插入。 – John

+0

您可以同步一個方法來管理List/Queue,然後在達到閾值時推送到服務器。 –

回答

2
  1. 是連接池將有助於一次管理數據庫資源更好,只需打開連接,然後返回到池中,而不是結束,關於池的大小,我離開它高達你(甚至可能就足夠了)
  2. 的你可以做的最好的事情來提高性能是batchUpdate即提交交易到數據庫只有一些500-1000記錄擺脫數據庫開銷
  3. 您可以引入多個線程來承擔傳入負載,多線程應該很簡單,因爲要完成的操作本質上是原子的(假設你只有插入),請探索java ExecutorService爲此。 ThreadPoolExecutor,你可以選擇no。
+0

來自鏈接:'對於標準更新批處理和Oracle更新批處理,Oracle建議您將批處理大小保持在50到100的一般範圍內。這是因爲雖然驅動程序支持更大的批處理,但它們反過來導致大內存佔用量不會相應增加。與較小批次相比,非常大的批次通常會導致性能下降。 –

+0

@JohnManko:感謝您指出,但也許他們沒有考慮每秒6K的請求情況,從我的經驗來看,只有這樣才能確定是測試和基準測試,沒有其他工作。 – user1933888

+2

如果你可以添加評論,如果你失望了,我也想學習,請不要剝奪我的機會:) – user1933888