2012-03-30 50 views
4

通常當我想使用MySQL查詢大結果集我寫這篇文章(從this answer拍攝):Mysql的流結果集,並jOOQ fetchLazy

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); 
stmt.setFetchSize(Integer.MIN_VALUE); 

現在我使用jOOQ 2.0.5,我可以」達到相同的結果。

我已經打過電話fetchLazy沒有運氣,它加載整個結果在存儲器中設置:

Cursor<Record> result = query.fetchLazy(Integer.MIN_VALUE); 

作爲一種變通方法,我可以得到使用query.getSQL() SQL查詢,然後創建一個合適的Statement來執行它。

是否有另一種方法使用jOOQ來獲得流結果集?

+0

從來沒有使用過自己,但看一眼通過文檔中提到你必須在底層語句上設置setFetchSize()(儘管這似乎擊敗了覆蓋的目的...)。 – Corbin 2012-03-30 20:17:09

回答

4

根據JDBC規範,Integer.MIN_VALUE不是用於Statement.setFetchSize()方法有效的參數:

爲JDBC驅動程序提供提示以應從當更多的行是數據庫中提取的行數本語句生成的ResultSet對象需要使用它。如果指定的值爲零,則提示將被忽略。默認值爲零。

參數:

的行數來獲取

拋出: SQLException - 如果發生數據庫訪問錯誤,該方法被稱爲在關閉的語句或條件的行> = 0不滿足。

對於否定提取大小,實現可能會拋出SQLException。因此,jOOQ不接受小於0的參數。您應該嘗試使用取值大小1來代替。與此同時,jOOQ的下一個版本或許能打破JDBC標準,以支持這一documented MySQL feature

https://github.com/jOOQ/jOOQ/issues/1263(在jOOQ 2.2.0實現)

+0

@dusan:將抓取大小設置爲「1」是否適合您? – 2012-03-31 23:45:37

+0

不,使用1的讀取大小,我得到一個'OutOfMemoryError'。我終於用JDBC結束了。但我肯定會等待下一個jOOQ發佈:) – dusan 2012-04-02 15:11:05

+1

@dusan:太糟糕了MySQL不遵循JDBC規範。但修補程序將在一週內發佈。 [預覽在這裏可用](https://oss.sonatype.org/content/repositories/snapshots/org/jooq/) – 2012-04-02 15:15:51