2

Oracleデータベース(1年データ)から200万レコードをフェッチする必要があります。
リストとして取得していると、「n」分かかり、ハングします。

sqlMap.queryForList("getResultSet", parameterMap);

そこで、IBatis"RowHandler"インターフェースを実装してみたところ、をオーバーライドし"handleRow(Object obj)"て結果を得ることができました(一度に1行)。

ただし、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)"メソッドで一度に1つの行しか取得していません。

@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"を与えたので)...

私がグーグルアウトしたとき、とDriver.useCursorFetch一緒に使用できる利用可能なプロパティ()があります"fetchSize" and "resultSetType"
参照:http ://www.yaldex.com/mysql_manual/ch23s04.htmlまたはIbatis queryWithRowHandler()はまだすべての行をフェッチしているようです。
しかし、それはMySQLデータベース専用だと思います。Oracle 11gデータベース
の同等のproperty()は何ですか。 以下のような設定が必要です。 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 に答える