JavaEE 6 检索另一个用户的数据
JavaEE 6 retrieving another user's data
另一个程序员告诉我一个问题,一个用户有时会看到另一个登录用户的数据。可能他们同时请求相同的上下文。我心想,这不可能发生吧?自垃圾收集、容器管理的事务和 JSessionID
不看代码,很难猜到。但也许你有提示。
他正在使用这种结构:
JavaEE 6 编码的 Web 应用程序,在 Glassfish v3 上分别使用 EJB 和 Web 容器
JSF + PrimeFaces 框架
提前致谢
好消息是 EJB 架构绝对能够隔离数据,因此这将是您代码中的一个错误。
需要注意的一件事是您使用的豆子种类:
- 如果您有有状态 bean,容器将确保每个客户端都获得正确的实例。
- 如果您使用无状态 Bean,这些将在客户端之间共享。如果您在其中存储任何特定于客户端的状态,这可以很容易地在会话之间共享。
- 如果您使用单例,则需要确保没有存储特定于会话的状态,并且任何共享状态都使用适当的锁。
- 还值得检查您的应用程序逻辑 - 如果数据似乎正在跨会话共享,是否可能只是错误的数据?
最后,您需要的最重要的事情是适当的调试日志记录。您需要从日志中获取有关正在发生的事情的足够信息,以确定问题出在哪里。不幸的是,这类争用问题可能非常繁琐且难以捕捉,尤其是使用调试器时,但无论如何,适当的日志记录将使您的生活变得更好。
当然,这一切都非常模糊和笼统,但没有关于系统的更多细节是不可避免的。不过,我建议首先寻找存储在无状态 bean 上的状态!
另一个程序员告诉我一个问题,一个用户有时会看到另一个登录用户的数据。可能他们同时请求相同的上下文。我心想,这不可能发生吧?自垃圾收集、容器管理的事务和 JSessionID 不看代码,很难猜到。但也许你有提示。 他正在使用这种结构: JavaEE 6 编码的 Web 应用程序,在 Glassfish v3 上分别使用 EJB 和 Web 容器 JSF + PrimeFaces 框架
提前致谢
好消息是 EJB 架构绝对能够隔离数据,因此这将是您代码中的一个错误。
需要注意的一件事是您使用的豆子种类:
- 如果您有有状态 bean,容器将确保每个客户端都获得正确的实例。
- 如果您使用无状态 Bean,这些将在客户端之间共享。如果您在其中存储任何特定于客户端的状态,这可以很容易地在会话之间共享。
- 如果您使用单例,则需要确保没有存储特定于会话的状态,并且任何共享状态都使用适当的锁。
- 还值得检查您的应用程序逻辑 - 如果数据似乎正在跨会话共享,是否可能只是错误的数据?
最后,您需要的最重要的事情是适当的调试日志记录。您需要从日志中获取有关正在发生的事情的足够信息,以确定问题出在哪里。不幸的是,这类争用问题可能非常繁琐且难以捕捉,尤其是使用调试器时,但无论如何,适当的日志记录将使您的生活变得更好。
当然,这一切都非常模糊和笼统,但没有关于系统的更多细节是不可避免的。不过,我建议首先寻找存储在无状态 bean 上的状态!