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

Oracle11g 使用IBatis(Oracle 11g数据库)中的RowHandler一次获取100行-示例,oracle11g,ibatis,Oracle11g,Ibatis,我需要从oracle数据库中获取200万条记录(1年数据)。 当我将其作为列表检索时,它需要'n'分钟,并且挂起 sqlMap.queryForList("getResultSet", parameterMap); 因此,我尝试实现IBatis“RowHandler”接口,覆盖了“handleRow(Object obj)”,并且能够得到结果(一次一行) 但我需要在n>=1000的时间获取n行。因此,我在select语句中添加了fetchSize=“1000”和resultSetType=“F

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

sqlMap.queryForList("getResultSet", parameterMap);
因此,我尝试实现IBatis
“RowHandler”
接口,覆盖了
“handleRow(Object obj)”
,并且能够得到结果(一次一行)

但我需要在n>=1000的时间获取n行。因此,我在select语句中添加了
fetchSize=“1000”和resultSetType=“FORWARD\u ONLY”
属性

例如:

当在查询执行期间调用该方法时,
“List Size->”
始终递增1。但我预计增量率为1000(正如我所给出的fetchSize=“1000”)

当我用谷歌搜索出来时,有一个可用的属性(
Driver.useCursorFetch
)可以与
的“fetchSize”和“resultSetType”一起使用

参考:或。
但我认为它只适用于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>


提前谢谢。

handleRow
只提供一行。使用
fetchSize
,如果我正确理解您的场景,您应该能够删除
handleRow
方法


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

handleRow
仅提供一行。使用
fetchSize
,如果我正确理解您的场景,您应该能够删除
handleRow
方法


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

谢谢Gabriel。。我正试图做的是“假设我的数据库中已经有1000万条记录,我必须从中提取100万条记录(比如1年的数据)。我不是一次从数据库中提取100万条记录,而是一次提取数千条记录,并一直提取,直到我使用“fetchSize”选项。但它是(fetchSize)一次获取一条记录(而不是1000条记录),直到所有100万条记录都被获取”。任何建议都是可以接受的。您可以创建一个自定义行处理程序,该处理程序具有行对象列表和计数器。在将rowhandler传递到iBATIS之前,请设置您的观察者()。然后,在
handleRow
counter++
列表中添加(行)
。一旦计数器达到1000,通知观察者,发送列表并清除列表。谢谢Gabriel。我会试试的谢谢加布里埃尔。。我正试图做的是“假设我的数据库中已经有1000万条记录,我必须从中提取100万条记录(比如1年的数据)。我不是一次从数据库中提取100万条记录,而是一次提取数千条记录,并一直提取,直到我使用“fetchSize”选项。但它是(fetchSize)一次获取一条记录(而不是1000条记录),直到所有100万条记录都被获取”。任何建议都是可以接受的。您可以创建一个自定义行处理程序,该处理程序具有行对象列表和计数器。在将rowhandler传递到iBATIS之前,请设置您的观察者()。然后,在
handleRow
counter++
列表中添加(行)
。一旦计数器达到1000,通知观察者,发送列表并清除列表。谢谢Gabriel。我会试试看。
<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>