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>
前もって感謝します。