【发布时间】:2010-09-29 07:40:12
【问题描述】:
我被要求查看一个存在严重性能问题的遗留 EJB3 应用程序。原作者不再可用,所以我所拥有的只是源代码和一些关于不可接受的性能的用户 cmet。我个人的 EJB3 技能非常基础,我可以阅读和理解带注释的代码,但直到知道为止。
服务器有一个数据库、几个 EJB3 bean (JPA) 和一些无状态 bean,只是为了允许远程客户端对 4..5 域对象进行 CRUD。客户端本身是一个 java 应用程序。只有几个并行连接到服务器。我从用户 cmets 那里了解到
- 客户端/服务器应用在 LAN 中表现良好
- 该应用在 WAN(1MBit 或更多)上几乎无法使用,因为读取和更新操作花费的时间太长(长达几分钟)
我发现了一个潜在的问题 - 在所有 EJB 上,所有关系都使用获取策略 FetchType.EAGER 定义。这是否可以解释读取操作的性能问题,是否建议从获取策略开始调整?
但这并不能解释更新操作的性能问题,对吗?更新由EntityManager 处理,客户端只需将域对象传递给管理器 bean,并且只使用manager.persist(obj) 就可以完成持久化。可能发送到服务器的域对象太大(可能是 EAGER 策略的副作用)。
所以我的实际理论是通过相当慢的网络发送了太多字节,我应该考虑减少结果集的大小。
根据您的经验,导致 CRUD 操作性能问题的典型和最常见的编码错误是什么,我应该从哪里开始调查/优化?
【问题讨论】:
标签: java performance jpa ejb-3.0