问题终于找到,简单的说是因为java 序列化的效率低下,而ejb调用之间又大量使用序列化,因此造成极大的性能消耗,而且也影响到响应时间。仔细分析了一下项目情况,呵呵,情况非常严重,系统架构是按照三层来设计的,每个层都是ejb,调下一层都是通过远程接口,而且层之间可能还多个ejb的调用。
(说句题外话,这种设计个人感觉非常,恩,不理解,性能杀手,而且ejb配置极其复杂,当然或者ejb本来就是如此,ebj和weblogic对我来说是很陌生很高深的东西,目前还没有深入掌握。)
很自然的会想到ejb2.0中的配置项enable-call-by-reference,如果能够开启就可以避免远程接口调用中的序列化。检查配置文件发现几乎能设置enable-call-by-reference的地方都设置为true了,奇
怪,再检查部署方式时发现,恩,晕倒,被部署到不同的ear包中了。
不同的ear包,enable-call-by-reference就算设置位true也开启不了吧?
接下来的改进方式,很自然就想到,如果能打包到同一个ear中,就可以在不改动代码,不改动部署文件的情况下解决这个问题,似乎是一个不错的好想法。
谨慎起见,同时为了拿到足够的证据来说法上层,先做个试验先。
模拟公司的项目结构,单独写了一个project,1个servlet负责接受外界请求,3个SLSB模拟三层工作,ejb直接只提供远程接口,然后打包到同一个ear包进行测试。当然enable-call-by-reference设置为true
和false来进行对比测试。
为了突出这个差异,ejb中都不进行任何操作,也不sleep。这样消耗就主要体现在java 序列化的消耗上,而且为了模拟真实情况,参数设置的比较大,里面放了1000个instance。
使用loadrunner,开启100个测试线程,通过http访问servlet,测试时间一分钟,看能执行多少次请求,测试结果如下:
enable-call-by-reference = false : 558
enable-call-by-reference = true : 21163
由于这个结果的差异性实在是太大了,因此没有必要进行多次测试,近40倍的差异完全可以反应问题了,当时实际项目中应该远没有这么夸张。
总结一下:
1. java serialize 非常慢
2. enable-call-by-reference可以有效避免这个开销
因此,能enable-call-by-reference就尽量enable-call-by-reference。
ps:顺便将这个测试的eclipse project也分享出来吧,请在这里下载
http://www.fs2you.com/files/045b367d-5d23-11dd-a2ed-0014221b798a/
分享到:
相关推荐
`ejb3-persistence-api`是Java企业版(Java EE)的一部分,它定义了用于持久化对象到数据库的标准API,即Java Persistence API(JPA)。这个API在ejb3-persistence.jar中实现,提供了强大的ORM(对象关系映射)能力...
1. EJB Core (ejb-3_0-fr-spec-ejbcore.pdf): EJB Core涵盖了EJB的基础架构,包括会话bean(Session Beans)、实体bean(Entity Beans)和消息驱动bean(Message-Driven Beans)。在EJB 3.0中,主要引入了注解驱动...
基于java的开发源码-EJB编程实例代码.zip 基于java的开发源码-EJB编程实例代码.zip 基于java的开发源码-EJB编程实例代码.zip 基于java的开发源码-EJB编程实例代码.zip 基于java的开发源码-EJB编程实例代码.zip 基于...
基于java的开发源码-Message-Driven Bean EJB实例源代码.zip 基于java的开发源码-Message-Driven Bean EJB实例源代码.zip 基于java的开发源码-Message-Driven Bean EJB实例源代码.zip 基于java的开发源码-Message-...
EJB(Enterprise JavaBean)是一种Java技术,用于开发企业级应用程序。EJB容器提供了许多功能,如事务处理、安全认证、资源管理等,以便开发者更方便地开发企业级应用程序。在EJB中,ejb-jar文件是一个重要的配置...
《 Beginning EJB in Java EE 8 - Building Applications with Enterprise JavaBeans》是2018年由Apress出版社出版的一本详尽教程,专为那些希望深入理解Java企业级后台开发的读者设计。这本书全面覆盖了Java EE8...
基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-...
基于java的开发源码-EJB中JNDI的使用源码例子.zip 基于java的开发源码-EJB中JNDI的使用源码例子.zip 基于java的开发源码-EJB中JNDI的使用源码例子.zip 基于java的开发源码-EJB中JNDI的使用源码例子.zip 基于java的...
6. **ejb-3_0-pfd-spec-persistence.pdf**:这份文档主要关注EJB 3.0的持久化特性,详细阐述了JPA的使用、查询语言(JPQL)和实体关系映射等。 7. **ejb-3_0-pfd-spec-simplified.pdf**:这份文档重点讲解EJB 3.0的...
中文版EXPERT-ONE-ON-ONE-J2EE-DEVELOPMENT-WITHOUT-EJB.part2.rar
基于java的开发源码-EJB 模拟银行ATM流程及操作源代码.zipjava的开发源码-EJB 模拟银行ATM流程及操作源代码.zip 基于java的开发源码-EJB 模拟银行ATM流程及操作源代码.zip 基于java的开发源码-EJB 模拟银行ATM流程及...
基于java的开发源码-EJB的真实世界模型(源代码).zip 基于java的开发源码-EJB的真实世界模型(源代码).zip 基于java的开发源码-EJB的真实世界模型(源代码).zip 基于java的开发源码-EJB的真实世界模型(源代码)....
`Newtonsoft.Json.dll`是.NET框架下的Json.NET库,它提供了JSON序列化和反序列化的功能,但在这个场景下可能与Java反序列化无关,除非系统中混合使用了.NET和Java技术。`Run.exe`是一个Windows可执行文件,可能用于...
在Java企业版(Java EE)应用开发中,EJB(Enterprise JavaBeans)是核心组件,用于构建可扩展、安全和事务处理的服务器端应用程序。JBoss AS(现在称为WildFly)是一个开源的应用服务器,它支持Java EE规范,包括...
本文将基于“ejb-3_0spec-simplified”文档的核心内容,深度剖析EJB3.0的简化API,旨在为开发者提供一份详实的技术指南。 二、EJB3.0简化API的核心理念 EJB3.0的简化API主要体现在以下几个方面: 1. **POJOs as ...
基于java的开发源码-EJB中有、无状态SessionBean的两个例子.zip 基于java的开发源码-EJB中有、无状态SessionBean的两个例子.zip 基于java的开发源码-EJB中有、无状态SessionBean的两个例子.zip 基于java的开发源码-...
基于java的开发源码-一个较初级的EJB商业应用的例子.zip 基于java的开发源码-一个较初级的EJB商业应用的例子.zip 基于java的开发源码-一个较初级的EJB商业应用的例子.zip 基于java的开发源码-一个较初级的EJB商业...
Enterprise JavaBeans(EJB)是Java平台上用于构建可部署在企业级服务器上的分布式应用程序的核心技术。EJB基础知识是Java开发者,尤其是那些致力于企业级应用开发的程序员必须掌握的关键概念。以下将详细介绍EJB的...
**EJB 3.0 学习指南** EJB(Enterprise JavaBeans)是Java平台企业版(Java EE)的一部分,用于构建可扩展、...提供的"ejb3.pdf"文档将详细阐述这些概念和实践,对于想要提升Java EE技能的人来说是一份宝贵的资源。