我需要从 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>
提前致谢。