gpt4 book ai didi

Java 并发 - Web 应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:18:24 24 4
gpt4 key购买 nike

我想我在我的网络应用程序中发现了更多错误。通常,我不担心并发问题,但是当您遇到 ConcurrentModificationException 时,您会开始重新考虑您的设计。

我将 JBoss Seam 与 Jetty 上的 Hibernate 和 EHCache 结合使用。目前,它是一个多核应用服务器。

我简要地查看了我的代码,发现了一些尚未引发异常的地方,但我相当确定它们可以。

我的第一个 servlet 过滤器主要检查是否有消息通知用户后台发生的事件(来自作业或其他用户)。过滤器只是将消息添加到模式弹出窗口中的页面。消息存储在 session 上下文中,因此另一个请求可能会从 session 上下文中提取相同的消息。

现在,它工作正常,但我没有访问包含许多并发请求的页面。我在想我可能需要编写一些 JMeter 测试以确保不会发生这种情况。

第二个 servlet 过滤器记录所有传入的请求以及 session 。这让我知道客户端来自哪里,他们正在运行什么浏览器等等。我最近看到的问题是在图片库页面上(几乎同时有很多请求),我最终得到了并发修改异常,因为我正在向 session 添加请求。

session 包含一个请求列表,这个列表似乎被多个线程命中。

@Entity
public class HttpSession
{
protected List<HttpRequest> httpRequests;

@Fetch(FetchMode.SUBSELECT)
@OneToMany(mappedBy = "httpSession")
public List<HttpRequest> getHttpRequests()
{return(httpRequests);}

...
}

@Entity
public class HttpRequest
{
protected HttpSession httpSession;

@ManyToOne(optional = false)
@JoinColumn(nullable = false)
public HttpSession getHttpSession()
{return(httpSession);}

...
}

在第二个 servlet 过滤器中,我正在做类似的事情:

httpSession.getHttpRequests().add(httpRequest);
session.saveOrUpdate(httpSession);

错误的部分是当我做一些比较以查看请求之间的变化时:

for(HttpRequest httpRequest:httpSession.getHttpRequests())

那一行因并发修改异常而爆炸。

离开的东西:1. JMeter 测试在这里有用吗?2. 对于编写可在并发负载下扩展的 Web 应用程序,您推荐哪些书籍?3. 我尝试将 synchronized 放在我认为需要的地方,即在循环请求的方法上,但它仍然失败。我还需要做什么?

我添加了一些评论:

我考虑过将 http 请求的日志记录作为后台任务。我可以轻松地生成一个后台任务来保存该信息。我试图记住为什么我没有过多地评估。我想有一些信息我想在现场访问。

如果我让它异步,那会大大加快吞吐量 - 好吧,我必须使用 JMeter 来衡量这些差异。

我仍然需要处理那里的并发问题。

谢谢,

沃尔特

最佳答案

如果在迭代任何集合时修改了它,就会发生 ConcurrentModificationException。您可以在单个线程中完成,例如:

for( Object o : someList ) {
someList.add( new Object() );
}

Collections.synchronizedList 包裹你的列表或返回列表的不可修改副本。

关于Java 并发 - Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2196964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com