首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种多线程的情况下使用线程池是可见的吗?

在这种多线程的情况下使用线程池是可见的吗?
EN

Stack Overflow用户
提问于 2011-06-11 02:44:56
回答 1查看 137关注 0票数 1

环境: Webphere 6,Solaris box,胖客户端,Java web app。

请求数可在400 - 600之间。在对服务器的每个请求上,我创建了15个线程(使用Java ExecutorService),用于同时请求15个不同的send服务,并将所有响应数据分组在一起,并将其发送回用户。负载测试在接近150 - 170个用户时失败。在为这些seen服务提供服务的数据库中,可以看到CPU和内存峰值,最终在很短的时间内,应用服务器也会崩溃。webservice的响应时间最长10-12秒,最短4-6秒。数据库的连接池大小为40。

我假设有150个请求正在创建150*15=2250线程,并且应用服务器资源被占用,从而导致崩溃。因此,我想使用应用服务器线程池,并让threadCount设置为100 (可能不是一个好数字..)。困扰我的一件事是,在100个线程的情况下,我可以处理前6 (6*15 = 90)个请求和第7个请求的10个调用。下一个请求必须等待10-15秒才能取回线程,然后等待10-15秒才能调用自己的own服务。这种方法好吗?

另一个想法是Websphere中提供的异步bean。哪一个适合我的要求。

请建议!!。一个接一个地调用secs服务总共需要15*(假设每个请求4秒)= 60秒,这真的很糟糕。所以把webserices一起调用是我想要做的。

EN

回答 1

Stack Overflow用户

发布于 2011-06-11 02:58:40

不建议在应用程序服务器中管理线程。如果您使用的是EJB,那么规范disallows that

为什么不使用缓存解决方案来提高性能呢?最初的几个请求会比较慢,但是一旦缓存变热,一切都会变得非常快。

如果缓存数据不可行,那么如何更改客户端以向服务器发出多个请求,而不是将一个请求拆分到多个线程中?您需要更改您的web应用程序,以便每个方法都将调用一个web服务。客户端将(并行地)调用当前页面所需的每个方法,并组装最终结果(如果您愿意,也可以显示部分结果)。通过这样做,您将并行地执行工作,并且不会违反规范。

我假设你的服务器中有类似这样的东西:

代码语言:javascript
复制
public Result retriveData(Long id) {
   Result myResult = new Result();
   //...
   //do some stuff
   myResult.setSomeData(slowWebService1.retriveSomeData(id));
   myResult.setSomeOtherData(slowWebService2.retriveSomeOtherData(id));
   myResult.setData(slowWebService3.retriveData(id));
   return myResult;
}

在您的客户端中:

代码语言:javascript
复制
Result result = webApplication.retriveData(10);
//use the result

我的建议是将调用分成多个方法:

代码语言:javascript
复制
 public SomeData retriveSomeData(Long id) {
    //do some stuff
    SomeData data = slowWebService1.retriveSomeData(id);
    //do more stuff
    return data;
 }

 public SomeOtherData retriveSomeOtherData(Long id) {
    //do some stuff
    SomeOtherData data = slowWebService2.retriveSomeOtherData(id);
    //do more stuff
    return data;
 }

 public Data retriveData(Long id) {
    //do some stuff
    Data data = slowWebService3.retriveData(id);
    //do more stuff
    return data;
 }

在您的客户端中:

代码语言:javascript
复制
//Call these methods in parallel, if you were using Swing, this could be done with
//SwingWorker (I have no idea how to it with Flash :)). 
//You can either wait for all methods to return or show partial results.
callInBackground(webApplication.retriveSomeData(10), useDataWhenDone);
callInBackground(webApplication.retriveSomeOtherData(10), useDataWhenDone);
callInBackground(webApplication.retriveData(10), useDataWhenDone);

通过这样做,您只调用您的web应用程序,就像以前一样,所以应该不会有任何安全问题。

我不熟悉Websphere,所以我不知道使用它的异步beans是否比这个更好,但是IMHO你应该避免手动启动线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6310728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档