在IBatis(Oracle 11g数据库)中使用RowHandler一次获取100行 - 示例

时间:2012-09-10 12:13:26

标签: oracle11g ibatis

我需要从oracle数据库中获取200万条记录(1年数据) 当我将其作为列表检索时,它将花费'n'分钟并且它会挂起。

sqlMap.queryForList("getResultSet", parameterMap);

所以,我尝试实现IBatis "RowHandler"接口,我覆盖了"handleRow(Object obj)",我能够得到结果(一次一行)。

但是我需要在n> = 1000的时候得到'n'行。所以我在我的select语句中添加了fetchSize="1000" and resultSetType="FORWARD_ONLY"属性。

例如:

<select id='getResultSet' parameterClass='java.util.Map' fetchSize="1000" resultSetType="FORWARD_ONLY">  

但我仍然只能在"handleRow(Object obj)"方法中获得一行。

@Override
public void handleRow(Object queryResult) {     

        if(queryResult != null) {

            try {

                tempResultMap = (ClassName) queryResult;
                resultList.add(tempResultMap);
                System.out.println("List Size -> " + reportList.size());
            } catch (Exception e) {
                e.printStackTrace();
            }       
        }   
    }  

在查询执行期间调用方法时,"List Size ->"总是递增1。但我期待增量率为1000(因为我给fetchSize =“1000”)......

当我用Google搜索时,有一个可用的属性(Driver.useCursorFetch)可以与"fetchSize" and "resultSetType"一起使用。
参考:http://www.yaldex.com/mysql_manual/ch23s04.htmlIbatis queryWithRowHandler() still seems to fetch all rows 但我认为这只适用于MySQL数据库 Oracle 11g数据库的等效属性(Driver.useCursorFetch)是什么 我需要一些像下面这样的配置。

<bean id="sourceName" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />                         
    <property name="url" value="jdbc:oracle:thin:@host:port:sid" />
    <property name="username" value="$uname" />
    <property name="password" value="$pwd" />
    <!-- 
    Some thing like this 
    <property name="configName(Instead of Driver.useCursorFetch)" value="true/false" />
    -->

</bean>

提前致谢。

1 个答案:

答案 0 :(得分:0)

handleRow只给你一行。如果我正确理解您的方案,您应该可以使用fetchSize删除handleRow方法。

如果你真的需要单独处理每个rown,你可以使用私有列表创建一个有状态(非单例)RowHandler并实现Observer模式,每次你达到1000条记录时通知监听器。