我想我在我的网络应用程序中发现了更多错误.通常,我不担心并发问题,但是当您收到ConcurrentModificationException时,您开始重新考虑您的设计.
我在Jetty上使用JBoss Seam和Hibernate以及EHCache.现在,它是一个具有多个核心的单个应用程序服务器.
我简要地查看了我的代码,发现了一些尚未抛出异常的地方,但我相信他们可以.
第一个servlet过滤器我基本上检查是否有消息通知用户后台发生的事件(来自作业或其他用户).过滤器只是在模式弹出窗口中向页面添加消息.消息存储在会话上下文中,因此可能另一个请求可以从会话上下文中提取相同的消息.
现在,它工作正常,但我没有遇到许多并发请求的页面.我想我可能需要编写一些JMeter测试来确保不会发生这种情况.
第二个servlet过滤器记录所有传入的请求以及会话.这让我知道客户端来自哪里,他们正在运行什么浏览器等等.我最近看到的问题是图像库页面(大约在同一时间有很多请求),我最终得到了并发修改异常,因为我正在向会话添加请求.
会话包含一个请求列表,该列表似乎被多个线程命中.
@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);}
...
}
Run Code Online (Sandbox Code Playgroud)
在第二个servlet过滤器中,我正在做某种事情:
httpSession.getHttpRequests().add(httpRequest);
session.saveOrUpdate(httpSession);
Run Code Online (Sandbox Code Playgroud)
错误输出的部分是当我进行一些比较以查看从请求到请求的变化时:
for(HttpRequest httpRequest:httpSession.getHttpRequests())
Run Code Online (Sandbox Code Playgroud)
那条线出现了并发修改异常.
要走的路:1.JMeter测试在这里有用吗?2.您建议哪些书籍用于编写在并发加载下扩展的Web应用程序?3.我尝试在我认为需要它的地方放置同步,即在循环请求的方法上,但它仍然失败.我还需要做什么?
我添加了一些评论:
我曾考虑过将http请求记录为后台任务.我可以轻松生成后台任务来保存该信息.我想记住为什么我没有那么评价.我认为有一些信息我想当场访问.
如果我把它变成异步,这会大大加快吞吐量 - 我必须使用JMeter来衡量这些差异.
我仍然需要处理那里的并发问题.
谢谢,
沃尔特
在迭代任何集合时修改ConcurrentModificationException.你可以在一个线程中完成,例如:
for( Object o : someList ) {
someList.add( new Object() );
}
Run Code Online (Sandbox Code Playgroud)
使用Collections.synchronizedList包装列表或返回列表的不可修改的副本.
| 归档时间: |
|
| 查看次数: |
1566 次 |
| 最近记录: |