callbyreference:ejb和java序列化(3)--开启enable-call-by-reference

  问题终于找到简单说是java 序列化效率低下而ejb的间又大量使用序列化因此造成极大性能消耗而且也影响到响应时间仔细分析了下项目情况呵呵情况非常严重系统架构是按照 3层来设计每个层都是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中就可以在不改动代码不改动部署文件情况下解决这个问题似乎是个不错好想法

  谨慎起见同时为了拿到足够证据来说法上层先做个试验先

  模拟公司项目结构单独写了个project1个servlet负责接受外界请求3个SLSB模拟 3层工作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/

Tags:  未标记为可序列化 java序列化 序列化 callbyreference

延伸阅读

最新评论

发表评论