`
scholers
  • 浏览: 619714 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一次失败的JAVA性能优化经历

阅读更多
  在一次性能优化中,作为方案的主要参与者,我做了如下分析:

  API(提供给其他模块调用)中操作都是单次,
  而这个API的DB操作如下:

   A.查询是否重复
   B.调用其他模块API检查数据合法性:
   C.取
   D.插入主表
   E.插入日志记录
  
基本上是五个DB操作,发现当这个API循环200次的时候耗时太多
采用单元测试的方式测试:

测试笔数:200笔
测试硬件:本地
方式:直接调用直连API函数,200笔循环增加,耗时121秒;
 

  然后按照上面的步骤
拆分5步骤做测试:
步骤A:耗时:33718毫秒,约33秒
步骤B:耗时:15327毫秒,约15秒
步骤C:耗时:15687毫秒,约15秒
步骤D:耗时:73810毫秒,约73秒
步骤E:耗时:7656毫秒,约7秒
合计约151秒左右。

采用预编译 + 批量提交的JDBC编程方式,可以大量提高提交的性能问题。这个方案就是预先设想的方式。测试的结果也证明了采用这种方式至少可以减少60%的时间。

但是,问题来。这个API是在所有流程中的一环,前面还有2步,后面还有一步,而最后的一步会最终决定所有环节中的事物,也就是是说中间任何一个环节出问题,所有的事物回滚。
如果在这个API环节修改成批量,那么在所有的环节中都要修改成批量,这就有可能造成事物过长,引起不可预知的后果;而且对于批量提交,如果有一条数据操作有问题,是否所有的都回滚?这个处理起来也会比较麻烦。所以这个方案最终遭到了其他模块的同事的反对,这样一个优化方案就死掉了。

  此系统的环境如下:UNIX  + JDK1.5 + DB2
0
0
分享到:
评论
3 楼 scholers 2011-01-20  
finallygo 写道
你用的数据库不是mysql吧,如果是mysql的话,如果你没有做事务的话,是不能进行批量提交的
而且你说"最后的一步会最终决定所有环节中的事物",那不做事务的话,是怎么来实现这个的呢?
至于"如果有一条数据操作有问题,是否所有的都回滚"这个问题应该和你们的业务有关系吧,我觉得事务的划分,经常都是和业务紧密联系的
比如你这里的
D.插入主表
E.插入日志记录
操作,你的需求如果是只有插入成功才做日志记录,那就是一个事务,但是如果不管成功还是失败都要做日志记录的话,那这两个操作就不应该做在一个事务中


我的这个博客可能写的不是很清楚,这里的整个步骤只是给其他N个步骤调用的一环,整个步骤都是在一个事物的控制之下。
  文章里面的优化只是对我当时这个模块的优化。
2 楼 finallygo 2011-01-20  
你用的数据库不是mysql吧,如果是mysql的话,如果你没有做事务的话,是不能进行批量提交的
而且你说"最后的一步会最终决定所有环节中的事物",那不做事务的话,是怎么来实现这个的呢?
至于"如果有一条数据操作有问题,是否所有的都回滚"这个问题应该和你们的业务有关系吧,我觉得事务的划分,经常都是和业务紧密联系的
比如你这里的
D.插入主表
E.插入日志记录
操作,你的需求如果是只有插入成功才做日志记录,那就是一个事务,但是如果不管成功还是失败都要做日志记录的话,那这两个操作就不应该做在一个事务中
1 楼 smallbee 2010-05-27  
呵呵 万事开头难

相关推荐

    java源代码

    1. **平台独立性**:Java的核心优势之一就是其“一次编写,到处运行”的能力。这得益于Java编译后的字节码可以在任何支持JVM的操作系统上运行。 2. **自动内存管理**:Java提供了一种自动化的内存管理机制,称为垃圾...

    JAVA推箱子

    - Java是一种跨平台的面向对象的编程语言,它的“一次编写,到处运行”特性使得它成为开发桌面应用、网页应用和手机应用等的理想选择。 - 游戏开发通常涉及到图形用户界面(GUI)的创建,Java中的Swing和JavaFX库...

    java线程编程pdg格式

    一、Java线程的概念与创建 1. 线程定义:线程是程序执行的最小单位,一个进程可以有多个线程,它们共享进程的资源,但各自拥有独立的执行流。 2. 创建线程: - 继承Thread类:创建一个新的类,继承自Thread类,并...

    测试Java版本不兼容.zip

    Java版本不兼容问题在软件开发过程中是一个常见的挑战,尤其是在维护旧项目或集成不同系统时。这个问题通常发生在尝试在新版本的Java环境中运行原本为旧版本Java设计的应用程序时。Java的每次更新都会引入新的特性、...

    BitterJava

    《BitterJava》一书由Bruce Tate撰写,深入剖析了Java开发过程中常见的陷阱与误区,旨在帮助中级Java程序员、分析师或架构师避免重蹈前人失败的覆辙。本书不仅是一份详尽的服务器端Java编程错误案例集,还探讨了这些...

    航班信息查询与检索(java)

    通常,项目开发会经历多个版本迭代,每个版本可能包含新功能、性能优化或bug修复。源代码文件通常包含类、方法、变量等编程元素,通过阅读和理解这些代码,我们可以了解到系统的工作原理和实现细节。 在实际开发中...

    基于Java的拼图游戏实现.zip

    8. **性能优化**:如果游戏包含大量拼图,或者允许用户自定义拼图,那么性能优化就很重要。例如,可以使用缓存来存储已计算的拼图状态,减少重复计算。 9. **用户交互设计**:设计直观的用户界面和合理的操作流程,...

    软件开发人成长经历(转载)

    "软件开发人成长经历(转载)"这个主题,旨在分享一位软件开发者从初学者到专业人士的蜕变过程,帮助那些渴望在这一行业中提升自己的人们找到方向。通过阅读《程序员感语.pdf》这样的资料,我们可以学习到许多关键的...

    java多线程设计模式

    8. **并发性能优化** - **减少上下文切换**:过多的线程切换会带来性能开销,合理使用线程池和并发工具可以减少这种开销。 - **内存模型**:理解Java内存模型(JMM)有助于编写高效且正确的多线程代码。 通过深入...

    java开发年终总结.pdf

    在这一年中,作为一名Java开发者,我经历了多个项目的开发和测试,从中积累了丰富的经验和技能。以下是对过去一年工作的详细总结: 1. **联通116114门户网站开发**: - 该项目涉及了网站登录、注册、公告模块以及...

    搞定 HR 面试的 40 个必备问题!.zip

    18. 你对失败的看法:描述一次失败的经历,以及你从中学到的教训,展示你的成长心态和韧性。 19. 工作中的创新:分享你在 Java 开发中实施的创新点,如何通过技术创新提高工作效率或产品质量。 20. 处理复杂问题的...

    手机厂Java高级工程师岗位面试真题

    对于Java高级工程师,他们期望听到关于大型项目的经验,特别是在解决复杂问题、优化系统性能和团队协作上的贡献。 2. **项目架构设计**:描述项目的主要模块和结构图是展示技术实力的重要环节。面试者需要清晰地...

    maven+tomcat的苦逼经历

    此外,作者可能也分享了在调试和优化Maven+Tomcat配置时的一些技巧,比如使用Maven的profile来管理不同的环境配置,或者通过调整Tomcat的JVM参数来优化性能。还有可能讨论了如何处理日志记录、安全管理、负载均衡等...

    深入理解-Java-多线程核心知识:跳槽面试必备.docx

    - **性能优化**:线程池可以复用已存在的线程,减少线程创建和销毁带来的开销,提高响应速度。 - **线程控制**:线程池可以限制最大线程数量,避免过多线程导致系统资源耗尽。 - **异常处理**:线程池提供了更好的...

    软件工程课程设计报告(Java实现扫雷小游戏)

    - **经典与现代技术结合**: 尽管操作系统经历了多次升级,但游戏依然保持原貌,显示出其经典性。 **1.2 系统概述** - **功能实现**: 包括开始游戏、自定义游戏设置、挖雷、标记雷区等。 - **运行环境**: Java SE ...

    SWFloadup的一次尝试

    在“SWFloadup的一次尝试”中,博主可能分享了自己使用SWFUpload集成到Struts1框架项目中的经历和经验。 Struts1是Apache组织开发的一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它帮助开发者构建...

    ACrush 回忆录(牛人的经历,看了很有感触)

    此外,他还可能讨论了在工作中遇到的技术难题,如系统架构设计、性能优化、代码重构等,以及如何在团队中成长并影响他人。 回忆录还可能涉及个人成长和心理调适的部分,ACrush可能分享了面对压力、保持学习动力、...

Global site tag (gtag.js) - Google Analytics