lazy-loading - Java JDBC Lazy-Loaded ResultSet





(5)


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

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

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




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




您是否可以通過將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




注意:這只是對已接受答案的補充

這與Java Access Modifiers有關

Java Access修飾符

Java訪問修飾符指定哪些類可以訪問給定的類及其字段,構造函數和方法。可以為類,其構造函數,字段和方法單獨指定訪問修飾符。Java訪問修飾符有時在日常語音中稱為Java訪問說明符,但正確的名稱是Java訪問修飾符。類,字段,構造函數和方法可以具有四種不同的Java訪問修飾符之一:

  • 項目清單
  • 私人的
  • 默認(包)
  • 保護
  • 上市

控制對類成員的訪問教程:

訪問級別修飾符確定其他類是否可以使用特定字段或調用特定方法。訪問控制有兩個級別:

  • 在頂層 - public或package-private(沒有顯式修飾符)。
  • 在成員級別 - public,private,protected或package-private(無顯式修飾符)。

可以使用修飾符public聲明一個類,在這種情況下,該類對於所有類都可見。如果一個類沒有修飾符(默認值,也稱為包私有),則它只在其自己的包中可見

下表顯示了每個修飾符允許的成員訪問權限。

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

第一個數據列指示類本身是否可以訪問由訪問級別定義的成員。如您所見,類始終可以訪問自己的成員。第二列指示與該類相同的包中的類(無論其父項是否有)可以訪問該成員。第三列指示在此包外聲明的類的子類是否可以訪問該成員。第四列指示是否所有類都可以訪問該成員。

訪問級別以兩種方式影響您。首先,當您使用來自其他源的類(例如Java平台中的類)時,訪問級別將確定您自己的類可以使用的這些類的哪些成員。其次,當您編寫一個類時,您需要確定每個成員變量和類中的每個方法應具有的訪問級別。





java jdbc lazy-loading resultset