2015-08-27 48 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