IBatis性能几点优化[已经完成]

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"/>


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章