我需要从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.html或Ibatis 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>
提前致谢。
答案 0 :(得分:0)
handleRow
只给你一行。如果我正确理解您的方案,您应该可以使用fetchSize
删除handleRow
方法。
如果你真的需要单独处理每个rown,你可以使用私有列表创建一个有状态(非单例)RowHandler并实现Observer模式,每次你达到1000条记录时通知监听器。