我的Web应用程序有一个XML配置文件,使用JAXB读取,每个JVM生命周期只读一次 - 在第一次调用应用程序时。结果缓存在单例类中的Java bean中 - 再次只缓存一次。此单例类具有一个公共方法,用于从Bean中读取数据并输出指定类别的项ID列表。每次请求应用程序时都会调用此方法一次。
<category code='AA'>
<item id='1' />
<item id='2' />
<item id='5' />
<item id='7' />
<item id='8' />
<item id='19' />
</category>
<category code='BB'>
<item id='12' />
<item id='13' />
<item id='15' />
<item id='17' />
<item id='18' />
<item id='19' />
</category>
前面提到的商品ID对于给定的类别是唯一的。读取bean并返回ID列表的逻辑,在开发环境中进行测试时,可以很好地保持并按预期返回数据。但是,在生产环境中,只要达到关键并发,逻辑就会在几天后开始在列表中返回重复的ID。
我绝对肯定应用程序中没有其他代码调用Java bean上的任何“set”mutator,而不是在初始化对象时。日志还表明正在读取的XML和正在创建的bean每个JVM生命周期只执行一次。即便如此,当应用程序的流量很高(每秒大约10个事务)时,这些bean的输出也会被破坏。一旦损坏,它就会一直保持这种状态,直到JVM再次被回收。
我尝试过的一个解决方案是不在线程之间共享bean,并在每次调用应用程序时从XML创建它们。这解决了重复的ID问题,但我担心每次应用程序调用中的JAXB操作都可能存在性能风险。
为什么会发生这种情况的任何想法,以及我们如何在共享bean时避免这个问题?