问题终于找到
![](/icons/12622dou.gif)
简单
![](/icons/12622de.gif)
说是
![](/icons/12622yinwei.gif)
java 序列化
![](/icons/12622de.gif)
效率低下
![](/icons/12622dou.gif)
而ejb
![](/icons/12622diaoyong.gif)
的间又大量使用序列化
![](/icons/12622dou.gif)
因此造成极大
![](/icons/12622de.gif)
性能消耗
![](/icons/12622dou.gif)
而且也影响到响应时间
![](/icons/12622dou2.gif)
仔细分析了
![](/icons/12622yi.gif)
下项目情况
![](/icons/12622dou.gif)
呵呵
![](/icons/12622dou.gif)
情况非常严重
![](/icons/12622dou.gif)
系统架构是按照 3层来设计
![](/icons/12622de.gif)
![](/icons/12622dou.gif)
每个层都是ejb
![](/icons/12622dou.gif)
调下
![](/icons/12622yi.gif)
层都是通过远程接口
![](/icons/12622dou.gif)
而且层的间可能还多个ejb
![](/icons/12622de.gif)
![](/icons/12622diaoyong.gif)
![](/icons/12622dou2.gif)
(说句题外话
![](/icons/12622dou.gif)
这种设计个人感觉非常
![](/icons/12622dou.gif)
恩
![](/icons/12622dou.gif)
不理解
![](/icons/12622dou.gif)
性能杀手
![](/icons/12622dou.gif)
而且ejb配置极其复杂
![](/icons/12622dou.gif)
当然或者ejb本来就是如此
![](/icons/12622dou.gif)
ebj和weblogic对我来说是很陌生很高深
![](/icons/12622de.gif)
东西
![](/icons/12622dou.gif)
目前还没有深入掌握
![](/icons/12622dou2.gif)
)
很自然
![](/icons/12622de.gif)
会想到ejb2.0中
![](/icons/12622de.gif)
配置项enable-call-by-reference
![](/icons/12622dou.gif)
如果能够开启就可以避免远程接口
![](/icons/12622diaoyong.gif)
中
![](/icons/12622de.gif)
序列化
![](/icons/12622dou2.gif)
检查配置文件发现几乎能设置enable-call-by-reference
![](/icons/12622de.gif)
地方都设置为true了
![](/icons/12622dou.gif)
奇
怪
![](/icons/12622dou.gif)
再检查部署方式时发现
![](/icons/12622dou.gif)
恩
![](/icons/12622dou.gif)
晕倒
![](/icons/12622dou.gif)
被部署到区别
![](/icons/12622de.gif)
ear包中了
![](/icons/12622dou2.gif)
区别
![](/icons/12622de.gif)
ear包
![](/icons/12622dou.gif)
enable-call-by-reference就算设置位true也开启不了吧?
接下来
![](/icons/12622de.gif)
改进方式
![](/icons/12622dou.gif)
很自然就想到
![](/icons/12622dou.gif)
如果能打包到同
![](/icons/12622yi.gif)
个ear中
![](/icons/12622dou.gif)
就可以在不改动代码
![](/icons/12622dou.gif)
不改动部署文件
![](/icons/12622de.gif)
情况下解决这个问题
![](/icons/12622dou.gif)
似乎是
![](/icons/12622yi.gif)
个不错
![](/icons/12622de.gif)
好想法
![](/icons/12622dou2.gif)
谨慎起见
![](/icons/12622dou.gif)
同时为了拿到足够
![](/icons/12622de.gif)
证据来说法上层
![](/icons/12622dou.gif)
先做个试验先
![](/icons/12622dou2.gif)
模拟公司
![](/icons/12622de.gif)
项目结构
![](/icons/12622dou.gif)
单独写了
![](/icons/12622yi.gif)
个project
![](/icons/12622dou.gif)
1个servlet负责接受外界请求
![](/icons/12622dou.gif)
3个SLSB模拟 3层工作
![](/icons/12622dou.gif)
ejb直接只提供远程接口
![](/icons/12622dou.gif)
然后打包到同
![](/icons/12622yi.gif)
个ear包进行测试
![](/icons/12622dou2.gif)
当然enable-call-by-reference设置为true
和false来进行对比测试
![](/icons/12622dou2.gif)
为了突出这个差异
![](/icons/12622dou.gif)
ejb中都不进行任何操作
![](/icons/12622dou.gif)
也不sleep
![](/icons/12622dou2.gif)
这样消耗就主要体现在java 序列化
![](/icons/12622de.gif)
消耗上
![](/icons/12622dou.gif)
而且为了模拟真实情况
![](/icons/12622dou.gif)
参数设置
![](/icons/12622de.gif)
比较大
![](/icons/12622dou.gif)
里面放了1000个instance
![](/icons/12622dou2.gif)
使用loadrunner
![](/icons/12622dou.gif)
开启100个测试线程
![](/icons/12622dou.gif)
通过http访问servlet
![](/icons/12622dou.gif)
测试时间
![](/icons/12622yi.gif)
分钟
![](/icons/12622dou.gif)
看能执行多少次请求
![](/icons/12622dou.gif)
测试结果如下:
enable-call-by-reference = false : 558
enable-call-by-reference = true : 21163
由于这个结果
![](/icons/12622de.gif)
差异性实在是太大了
![](/icons/12622dou.gif)
因此没有必要进行多次测试
![](/icons/12622dou.gif)
近40倍
![](/icons/12622de.gif)
差异完全可以反应问题了
![](/icons/12622dou.gif)
当时实际项目中应该远没有这么夸张
![](/icons/12622dou2.gif)
整理总结
![](/icons/12622yi.gif)
下:
1. java serialize 非常慢
2. enable-call-by-reference可以有效避免这个开销
因此
![](/icons/12622dou.gif)
能enable-call-by-reference就尽量enable-call-by-reference
![](/icons/12622dou2.gif)
ps:顺便将这个测试
![](/icons/12622de.gif)
eclipse project也分享出来吧
![](/icons/12622dou.gif)
请在这里下载
http://www.fs2you.com/files/045b367d-5d23-11dd-a2ed-0014221b798a/
延伸阅读
最新评论