2

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

sqlMap.queryForList("getResultSet", parameterMap);

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

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

例如:

<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")...

当我用谷歌搜索时,有一个属性 available( Driver.useCursorFetch) 可以与"fetchSize" and "resultSetType".
参考:http ://www.yaldex.com/mysql_manual/ch23s04.html或Ibatis queryWithRowHandler() 似乎仍然获取所有行
但我认为它仅适用于 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>

提前致谢。

4

1 回答 1

0

handleRow只给你一行。如果我正确理解您的情况,使用fetchSize,您应该能够删除您的方法。handleRow

如果您确实需要单独处理每个行,您可以使用私有列表创建一个有状态(非单例)RowHandler 并实现观察者模式,每次达到 1000 条记录时通知侦听器。

于 2012-12-05T16:14:55.017 回答