最近在某个项目进行性能测试过程中发现ibatis一个比较严重的性能问题
dump下来的的线程发现大量线程处于BLOCKED状态,都在等待资源0x00000000928ede88,接口大多数为查询功能,按理不应该那么多的sql查询功能的线程处于clocked状态
同时进一步全文搜索被锁住的0x00000000928ede88资源,发现运行状态线程pool-4-thread-1629正在锁住资源0x00000000928ede88
为了分析产生该问题的原因,定位对应源代码发现锁住的资源为net.sf.cglib.core.AbstractClassGenerator$Source
进一步分析发现可以看出被锁住的Source为静态类变量,作用于所有的Generator实例,因此相当于要求调用BulkBean#create()调用顺序同步的,不允许多线程并发。再回过头看发现锁住的功能刚好为ibatis执行sql更新功能,更新进行行锁,比较耗费性能,因此就可以解释为何有大量查询语句的线程处于等待锁的状态
最后我们分析一下为什么会执行ibatis的这段代码以及它的作用是什么,我们会发现在ibatis中应用了cglib的字节码增强功能则会执行该代码(bean对象字节增加功能, 有兴趣的同学可以看看CGLIB中BulkBean的使用),因此我们将enhancementEnable=false则不会进行字节增强功能
最后我们查阅资料发现,别人遇到过类似的问题(这是我给MYBATIS开发团队的邮件部分, 不翻译:)):
IBtatis automatic decide a simple bean that property have no Getter method to be Complex type. Mybatis does not prompt any warning enhancementEnable option will be skipped. I think these mybatis exception handling is not smooth. and If user's bean loose some Getter method, a common user does not know why mybatis performance become bad.
一个对象由于Getter方法的缺失, Mybatis把这个对象的当做复杂对象, 从而, 导致enhancementEnable=true的定义失去了任何作用, 进一步导致ibatis的性能下降
相关推荐
### 解决IBatis缓存动态字段问题 #### 背景与问题描述 在使用IBatis框架处理数据库操作时,可能会遇到动态数据表名、动态字段名的情况。这种情况下,由于IBatis的缓存机制,可能导致字段找不到的问题。具体表现为...
8. **插件支持**:Ibatis允许开发者编写自定义插件,通过拦截器模式对SqlSession或Executor的行为进行扩展,如性能监控、日志记录等。 在ibatis demo中,我们可能还会看到如何配置Spring与Ibatis的集成,以便利用...
ibatis和mybatis对比
为了解决这个问题,ibatis(现已更名为MyBatis)提供了一种支持批量更新的机制,能够显著提高数据处理的速度。 #### 批量Update背景与问题 在实际应用中,经常会遇到需要批量更新数据库中的数据的情况,例如:商品...
总的来说,iBATIS缓存是优化数据库操作性能的有效手段,但同时也需要谨慎使用,合理配置缓存策略,防止出现因缓存导致的数据不一致问题。了解和掌握iBATIS缓存的原理与实践,能帮助开发者更好地优化应用程序,提升...
Ibatis文档是学习和解决问题的重要资源,它包含了详细的API参考、配置指南、最佳实践和常见问题解答。通过阅读文档,你可以了解如何配置Ibatis、创建Mapper接口和XML映射文件,以及如何处理复杂的查询和关联。 在...
它不仅是最简单的持久化框架,还带来了架构级的性能提升。SQL语句与程序代码分离,提高了代码的可重用性和团队分工的明确性,同时增强了项目的移植性。 三、iBATIS与Hibernate的对比 1. 映射关系:Hibernate提供了...
**IBATIS API 帮助文档与IBATIS开发文档详解** IBATIS,一个由iBATIS公司开发的开源持久层框架,是Java世界中广泛使用的...通过深入理解和实践,可以充分利用IBATIS的灵活性和强大功能,提升Java应用的数据访问性能。
此外,iBATIS还提供了一些辅助工具,如`ParameterMap`用于管理SQL语句的输入参数,`ResultMap`用于处理查询结果的映射,以及`Cache`机制,用于缓存查询结果,提高系统性能。这些工具类使得开发者能够更方便地进行...
ibatis主要针对的是那些对数据库性能有极高要求或需要复杂SQL查询的应用场景。与“一站式”ORM解决方案相比,ibatis要求开发者更直接地参与到SQL语句的编写中,这对于那些希望对数据库操作有更多控制权的开发人员来...
虽然 iBatis 在某些方面与 Hibernate 类似,但它们之间的主要区别在于 iBatis 提供了更细粒度的 SQL 控制能力,这使得 iBatis 在复杂查询或性能敏感的应用场景中更具优势。 ### 二、动态 SQL 的概念 在实际应用中...
- **性能优化与缓存**:了解如何利用iBATIS的缓存机制来提高应用性能,减少数据库访问次数。 - **数据访问对象(DAO)模式**:深入研究iBATIS如何支持DAO模式,简化数据访问逻辑,实现业务逻辑与数据访问的分离。 - ...
总的来说,"ibatis_with_memcached"项目提供了一个实用的参考,展示了如何在实际开发中利用Ibatis与Memcached集成来优化数据访问,对于提升Java Web应用的性能具有很大的指导价值。开发者可以通过该项目学习到缓存...
8. **性能优化**:提供一些关于提高iBATIS性能的建议,如合理设计SQL、使用批处理等。 《ibatis.pdf》可能是iBATIS的官方文档或综合指南,可能包含更广泛的内容,如最佳实践、高级特性、与其他框架的集成等。 ...
2. 性能提升:iBATIS作为架构级的持久化框架,能够提升系统的性能。 3. 分离SQL:SQL代码与程序代码解耦,易于重用和维护。 4. 提高分工效率:开发团队可以更专注于业务逻辑,而DBA则负责SQL优化。 5. 移植性:由于...
Ibatis 是一款优秀的Java持久层框架,它与Hibernate和JPA等ORM框架不同,Ibatis 提供了更为灵活的SQL映射机制,允许开发者直接编写SQL语句,从而更好地控制查询过程,提高性能。在本资源"ibatis2.3.4.rar"中,包含了...
iBatis作为一个轻量级的框架,它允许开发者将SQL语句直接嵌入到Java代码中,解决了传统的JDBC繁琐的代码编写问题,提高了开发效率,同时也提供了更灵活的数据访问控制。 【描述】:“iBatis课件” “iBatis课件”...
6. **插件支持**:iBatis允许用户自定义插件,通过拦截器(Interceptor)对SqlSession的方法进行增强,实现如日志记录、性能分析等功能。 在使用iBatis进行数据库操作时,应遵循以下步骤: 1. 创建...
7. 执行性能:尽管Ibatis 增加了一层间接,但因其轻量级特性,性能损失并不显著。而且,由于其灵活的SQL控制,可以在必要时进行优化,提高执行效率。 总结起来,Ibatis 是一个强大且灵活的持久层框架,它允许开发者...
通过合理的缓存策略、批处理和预编译SQL等手段,IBatis可以在不影响灵活性的同时提供良好的性能。 总结,IBatis .NET为.NET开发者提供了一种直观、灵活的方式来处理数据库操作。通过学习这个实例,你可以掌握如何...