0

我的 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。日志还表明,在每个 JVM 生命周期中,读取的 XML 和创建的 bean 仅执行一次。即便如此,当应用程序的流量很高(> 每秒 10 个事务左右)时,这些 bean 的输出也会被破坏。一旦损坏,它就会一直保持这种状态,直到 JVM 再次被回收。

我尝试过的一种解决方案是不在线程之间共享 bean,而是在每次调用应用程序时从 XML 中创建它们。这解决了重复 ID 的问题,但我担心每个应用程序调用中的 JAXB 操作可能会带来性能风险。

任何想法为什么会发生这种情况,以及在共享 bean 时我们如何避免这个问题?

4

0 回答 0