IBatis on Oracle的性能优化
我们先主要看2个参数
1.defaultRowPrefetch of oracle
2.enhancementEnabled of IBatis
环境
1. Java HotSpot(TM) Server VM (build 1.5.0_12-b04, mixed mode)
Java HotSpot(TM) Server VM (build 1.6.0_05-b13, mixed mode)
2. Intel(R) Core(TM)2 CPU T7400 @ 2.16GHz L2 4M
3. JVM OPTION -Xms512m -Xmx1024m -XX:PermSize=96m
从数据库中读取10000行, 5列数据情况, Java Bean对象大约不到100个属性。循环20次, 外加5次的赃数据。
A. defaultRowPrefetch=default enhancementEnabled=false/true 754ms/743ms
B. defaultRowPrefetch=50 enhancementEnabled=false/true 389ms/382ms
C. defaultRowPrefetch=100 enhancementEnabled=false/true 319ms/319ms
D. defaultRowPrefetch=200 enhancementEnabled=false/true 277ms/274ms
E. defaultRowPrefetch=500 enhancementEnabled=false/true 251ms/250ms
F. defaultRowPrefetch=1000 enhancementEnabled=false/true 242ms/238ms
G. defaultRowPrefetch=1000 enhancementEnabled=true 237ms(JAVA6)
H. defaultRowPrefetch=200 enhancementEnabled=true 271MS(JAVA6)总结以上情况, 在数据行比较多的情况下, defaultRowPrefetch值的提高, 对于性能的影响是显著的, 但是, 这个提升是牺牲很多内存为代价的, 因此, 如果过高的defaultRowPrefetch值会导致内存比较紧张。 另外值得说明的是, 在一样的参数前提下, JAVA6对于性能还是有一定的提升的。对于比较大的查询, defaultRowPrefetch经验值应该是200还是合理的。 另外, 对于enhancementEnabled选项带来的收益, 相对来说比较少。 但是,对于高压力的系统, 这是无IO等待下情况的代码执行提高这些是非常值。
以上的测试数据列数比较少, 因此在JAVA BEAN的建立上是非常的节约时间的, 我们看看在差不多100个属性的填充下的性能表现, 我们已经知道了defaultRowPrefetch带来收益的经验值。 因此, 我们设置defaultRowPrefetch=200.
A. defaultRowPrefetch=200 enhancementEnabled=false 1736ms
B. defaultRowPrefetch=200 enhancementEnabled=true 1721ms
C. defaultRowPrefetch=50 enhancementEnabled=true 1866ms
OK, enhancementEnabled继续表明对性能的提升作用很小, 但是列的数据大小对性能的影响是非常大的。 但是, 我们无法确定这个时间是消耗在Java Bean 填充上 还是列读取上。IBatis没有具体的办法测试。 不过, 在减少结果参数说明的情况下, 性能能得到明显的提升, 我们还是可以断定, JAVA BEAN的被声明成结果映射的时候, 尽量减少结果映射的列,可以获得很高性能的提升。 因此, 使用IBatis操作大量的数据的表, 建议只映射应该获取到的数据, 而不是全部的列。 select * from db where... 你可以取需要的列到java bean. 总而言之: select * from db where... 这样的形式对性能影响比 把所有的列映射到Java Bean 来的小! set bean property + ResultSet.getXXX(int index)的操作消耗了大部分的性能。
一些代码片段:
数据原的定义
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>oracle.jdbc.OracleDriver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:oracle:thin:@10.0.0.1:1521:test</value>
</property>
<property name="properties">
<props>
<prop key="user">test</prop>
<prop key="password">test</prop>
<prop key="defaultRowPrefetch">50</prop>
</props>
</property>
</bean>
为单个SQL查询定义defaultRowPrefetch, 在IBatis的定义中为fetchSize
<select id="MS-FIND-PublishedOffers-By-MemberId-Paged" resultMap="RM-OfferResult" fetchSize="200">
CGLIB增强定义
<settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="false" maxRequests="3000" maxSessions="3000" maxTransactions="3000" useStatementNamespaces="false"/>
分享到:
相关推荐
尽管手动拼接 SQL 字符串是一种简单有效的方法,但在实际项目中还应注意以下几点: 1. **安全性**:使用预编译语句(PreparedStatement)来避免 SQL 注入等问题。 2. **性能优化**:对于频繁执行的 SQL 语句,可以...
在进行批处理时,还需要注意以下几点: - **错误处理**:如果批处理中的某个操作失败,通常可以选择回滚整个事务,以保持数据的一致性。 - **性能优化**:批量操作的数据量不宜过大,避免一次性加载过多数据导致内存...
这种方式使得 Ibatis 在处理特定场景时具有更高的灵活性和性能优化潜力。 在开始 Ibatis 开发之前,你需要做一些准备工作,包括了解和配置 Ibatis 框架。首先,你需要下载 Ibatis 的库文件,并将其添加到项目的类...
在使用iBATIS3时,需要注意以下几点: - **命名空间**:每个映射文件都应该有一个唯一的命名空间,用于区分不同的映射文件,避免命名冲突。 - **生命周期管理**:正确管理`SqlSessionFactory`和`SqlSession`的生命...
1. **SQL调优**:Ibatis允许直接编写原生的SQL,便于充分利用Oracle的特性进行性能优化。 2. **事务管理**:Ibatis提供了对数据库事务的控制,可以配合Oracle的ACID特性处理复杂的事务场景。 3. **存储过程调用**...
在"ibatis配置"中,主要涉及以下几个关键知识点: 1. **SqlSessionFactoryBuilder**: 这是创建SqlSessionFactory的入口,通过它来读取配置文件并构建SqlSessionFactory对象。SqlSessionFactory是线程安全的,负责...
迁移过程通常涉及以下几个关键点: 1. **API变更**:MyBatis的API与iBatis有所不同,比如SqlSession接口和Mapper接口的使用方式。开发者需要理解并适应这些变化。 2. **配置文件迁移**:iBatis使用的是`...
本书的核心内容围绕以下几个关键知识点展开: 1. **iBATIS简介**:首先,书中会介绍iBATIS的基本概念,包括其设计目标、功能特性以及与Hibernate等其他ORM框架的比较,帮助读者理解为何选择iBATIS作为持久层工具。 ...
操作Oracle CLOB数据时,我们需要注意以下几点: 1. **配置映射文件**:在iBATIS的Mapper XML文件中,需要为CLOB字段定义特殊的类型处理器。例如: ```xml ``` 2. **插入操作**:当向包含CLOB字段的表...
在Ibatis中,死锁可能源于以下几点: 1. **事务隔离级别**:不同的事务隔离级别对并发事务处理的方式不同,较低的隔离级别可能导致脏读、不可重复读或幻读,而较高的隔离级别可能导致更多的锁竞争,增加死锁风险。 ...
### ibatis开发指南知识点解析 #### 一、ibatis简介 ibatis是一个开源的持久层框架,它专注于SQL查询的编写,并将SQL语句与Java代码分离,使得开发者能够更灵活地控制SQL语句,同时也提供了对象关系映射(ORM)...
在版本2.3.4.741中,我们可以深入探讨以下几点: 1. **物理分页功能**:在处理大量数据时,物理分页是一种高效的策略,它直接由数据库执行分页操作,减少数据传输量,提高性能。iBATIS SQLMap在此版本中实现了物理...
8. **最佳实践**:文档通常会包含一些使用iBATIS的最佳实践,比如如何设计映射文件、优化SQL性能、避免内存泄漏等。 9. **与其他框架的集成**:iBATIS可以与Spring、Struts等框架无缝集成,文档会说明如何在这些...
随着时间的推移,软件会不断迭代优化,因此出现了不同版本的ibatis-common.jar包。这两个版本的主要差异在于功能的增强和bug的修复。ibatis-common-2.jar相较于1.3.1版本,可能会包含更多的特性以及性能上的提升。 ...
从iBATIS 1.x版本升级到2.0时,需要注意以下几点: 1. **评估升级必要性**:检查新版本的功能改进是否符合项目需求。 2. **转换XML配置文件**:由于版本之间的变化,可能需要调整原有的XML映射文件。 3. **使用新的...
在学习这些资料时,你应该关注以下几个关键知识点: 1. **配置文件**:理解SqlMapConfig.xml的作用,包括数据源配置、事务管理器设置以及SQL映射文件的引入。 2. **SQL映射文件**:学会编写XML格式的SQL映射文件,...
在Ibatis 3的核心包中,我们可以找到以下几个关键组成部分和知识点: 1. **SqlSessionFactoryBuilder**:这个类用于构建SqlSessionFactory,它是Ibatis的核心组件,负责创建SqlSessionFactory实例。通过读取配置...
### Spring+ibatis框架知识点详解 #### 一、Spring+ibatis框架简介 Spring与ibatis(现称为MyBatis)都是Java平台下非常流行的开源框架。Spring主要提供了一个轻量级的应用容器来管理对象的生命周期及依赖注入,而...
在使用iBATIS进行模糊查询时,需要注意以下几点: 1. 防止SQL注入攻击:在使用iBATIS进行模糊查询时,需要确保参数的安全性,以防止SQL注入攻击。例如,以下代码是错误的: ```sql SELECT * FROM t_stu WHERE s_...
9. **性能优化**:Ibatis.net提供了一些性能优化手段,如缓存机制、批处理等。缓存可以减少不必要的数据库访问,批处理则可以一次性执行多个SQL操作,提高效率。 通过"Ibatis.net"的示例项目,开发者可以学习到如何...