簡體   English   中英

Java JDBC Lazy-Loaded ResultSet

[英]Java JDBC Lazy-Loaded ResultSet

有沒有辦法獲得從運行JDBC查詢獲得的ResultSet來延遲加載? 我希望每行都按照我的要求加載,而不是事先加載。

簡短回答:

在調用executeQuery()之前使用Statement.setFetchSize(1) executeQuery()

答案很長:

這在很大程度上取決於哪個JDBC驅動程序所使用。 您可能需要查看此頁面該頁面描述了MySQL,Oracle,SQL Server和DB2的行為。

主要外賣:

  • 每個數據庫(即每個JDBC驅動程序)都有自己的默認行為。
  • 一些驅動程序會尊重setFetchSize()而沒有任何警告,而其他驅動程序則需要一些“幫助”。

MySQL是一個特別奇怪的案例。 看到這篇文章 聽起來如果你調用setFetchSize(Integer.MIN_VALUE) ,它會一次下載一行,但它並不是很清楚。

另一個例子: 這是 PostgreSQL行為的文檔 如果啟用了自動提交,則ResultSet將立即獲取所有行,但如果它已關閉,則可以按預期使用setFetchSize()

最后要記住的是:這些JDBC驅動程序設置僅影響客戶端發生的情況。 服務器仍然可以將整個結果集加載到內存中,但您可以控制客戶端下載結果的方式。

您是否可以通過將Statement的獲取大小設置為1來實現此目的?

如果您一次只獲取1行,則在ResultSet上調用next()之前,不應加載每一行。

例如

Statement statement = connection.createStatement();
statement.setFetchSize(1);
ResultSet resultSet = statement.executeQuery("SELECT .....");
while (resultSet.next())
{
  // process results. each call to next() should fetch the next row
}

提供了一種答案在這里

引用:

Presto JDBC驅動程序永遠不會將整個結果集緩沖在內存中。 服務器API將根據請求向驅動程序返回最多約1MB的數據。 在消耗該數據之前,驅動程序不會從服務器請求更多數據(通過在ResultSet上調用next()方法適當的次數)。

由於服務器API的工作方式,忽略了驅動程序獲取大小(根據JDBC規范,它只是一個提示)。

證明忽略了setFetchSize

我想你想要做的是推遲實際加載ResultSet本身。 您需要手動實現它。

你會發現這很容易使用休眠 如果你直接使用jdbc,你基本上必須自己滾動。

休眠中的提取策略是高度可配置的,並且很可能提供您甚至不知道的性能選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM