最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JDBC中Fetchsize的實現(xiàn)

 更新時間:2024年09月27日 10:31:21   作者:Desiro_  
fetchsize是指在執(zhí)行數(shù)據(jù)庫查詢時,每次從數(shù)據(jù)庫中獲取的記錄條數(shù),它對內存使用和網(wǎng)絡傳輸效率有重要影響,在MyBatis中,可以通過全局設置或語句級別設置fetchsize,來控制查詢操作的內存使用和提升性能,合理的fetchsize設置能有效減少網(wǎng)絡往返次數(shù)和防止內存溢出

1. 什么是fetchsize?

1.1  Oracle中的fetchsize

當我們執(zhí)行一個SQL查詢語句的時候,需要在客戶端和服務器端都打開一個游標,并且分別申請一塊內存空間,作為存放查詢的數(shù)據(jù)的一個緩沖區(qū)。這塊內存區(qū),存放多少條數(shù)據(jù)就由fetchsize來決定,同時每次網(wǎng)絡包會傳送fetchsize條記錄到客戶端。應該很容易理解,如果fetchsize設置為20,當我們從服務器端查詢數(shù)據(jù)往客戶端傳送時,每次可以傳送20條數(shù)據(jù),但是兩端分別需要20條數(shù)據(jù)的內存空閑來保存這些數(shù)據(jù)。fetchsize決定了每批次可以傳輸?shù)挠涗洍l數(shù),但同時,也決定了內存的大小。這塊內存,在oracle服務器端是動態(tài)分配的(大家可以想想為什么)。而在客戶端(JBOSS),PS對象會存在一個緩沖中(LRU鏈表),也就是說,這塊內存是事先配好的,應用端內存的分配在conn.prepareStatement(sql)或conn.CreateStatement(sql)的時候完成。

例如:

//打開游標,執(zhí)行查詢,但是并不獲取任何的數(shù)據(jù),網(wǎng)絡上沒有數(shù)據(jù)的傳輸。
rs = stmt.executeQuery();
//獲取具體的數(shù)據(jù),網(wǎng)絡一般每次傳輸fetchsize條數(shù)據(jù)。
while (rs.next()){
}

1.2  Mysql中的fetchsize

Mysql的preparestament基本上不占用內存,為什么呢?因為Mysql并不需要象Oracle那樣的一塊內存來保存結果集緩沖區(qū),為什么不需要緩沖區(qū),其中根本的原因是由Mysql的通訊方式?jīng)Q定的。Mysql客戶端/服務器協(xié)議是半雙工的,即Mysql只能在給定的時間,發(fā)送或接受數(shù)據(jù),但不能同時發(fā)送和接收。所以,Mysql在數(shù)據(jù)查詢結果集傳送的時候,需要一次性將數(shù)據(jù)全部傳送到客戶端,在客戶數(shù)據(jù)接收完之后,釋放相關的鎖等資源。因為這種半雙工的通訊方式,所以Mysql不需要客戶端的游標,但是客戶端API通過把結果取到內存中,可以模擬游標的操作。所以,我們可以在JAVA程序中,可以象Oracle那樣來實現(xiàn)Mysql的訪問。

注意:

useCursorFetch=true 是針對 MySQL 數(shù)據(jù)庫的 JDBC 連接參數(shù),用于啟用服務器端游標獲取數(shù)據(jù)。在 MyBatis 中,當使用流式查詢(例如:分頁查詢、結果集處理和使用游標等)時,這個配置可以幫助逐行從服務器檢索數(shù)據(jù),而不是一次性將所有數(shù)據(jù)加載到內存中,從而降低內存占用。

當使用 MySQL 數(shù)據(jù)庫時,在 JDBC 連接字符串中加入 useCursorFetch=true,并結合設置合適的 fetchSize,可以避免因一次性加載過多數(shù)據(jù)導致的內存溢出問題。注意,此配置僅對 MySQL 數(shù)據(jù)庫有效。 如果不設置 useCursorFetch=true 這個配置,僅使用之前提到的那些配置(如設置 defaultFetchSize、分頁查詢、結果集處理和使用游標等),在大多數(shù)情況下,這些配置仍然可以有效地避免查詢導致的內存溢出。

但需要注意的是,對于 MySQL 數(shù)據(jù)庫,如果不啟用服務器端游標獲取數(shù)據(jù),這可能會影響到流式查詢的效果。因為在默認情況下,MySQL JDBC 驅動會一次性將所有數(shù)據(jù)加載到內存中。此時,即使使用了其他配置,也可能無法達到預期的內存優(yōu)化效果。

總的來說,在使用 MySQL 數(shù)據(jù)庫時,推薦在 JDBC 連接字符串中加入 useCursorFetch=true 配置,以更好地支持流式查詢和降低內存占用。在其他數(shù)據(jù)庫中,可以根據(jù)實際需求和場景選擇合適的配置和策略來避免查詢導致的內存溢出。

2. 使用fetchsize

2.1 fetchsize的作用

Java doc

Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for this ResultSet object. If the fetch size specified is zero, the JDBC driver ignores the value and is free to make its own best guess as to what the fetch size should be. The default value is set by the Statement object that created the result set. The fetch size may be changed at any time.

2.2 fetchsize的默認值

在ojdbc8的源碼中oracle的驅動的fetchsize參數(shù)的默認值是10

2.3 fetchsize的設置

2.3.1 Mybatis全局設置

通過設置 MyBatis 配置文件中的 defaultFetchSize 值:

<settings>
    <setting name="defaultFetchSize" value="合適的值" />
</settings>

2.3.2 語句級別的設置

可以在jdbc中調用Preparedstatement .setFetchSize()的進行設置:

stmt = conn.prepareStatement(sql);
stmt.setFetchSize(50);

2.3.3 框架上直接針對某個語句進行設置

可以在Mybatis的查詢語句上進行設置:

<select id="selectFetchSize" fetchSize="100" resultSetType="FORWARD_ONLY" resultType="com.example.poi.entity.EntityDemo">
    select * from entity_demo
</select>

Mybatis中的定義: 

fetchSize:fetchSize屬性用于指定每次從數(shù)據(jù)庫獲取的記錄數(shù)。這個屬性可以用于控制查詢操作的內存使用和性能。
當設置fetchSize時,MyBatis會根據(jù)這個值來調整JDBC的Statement對象的fetchSize屬性。如果數(shù)據(jù)庫和JDBC驅動支持,這可以減少網(wǎng)絡往返次數(shù),提高性能。
在分頁查詢或處理大量數(shù)據(jù)時,合理設置fetchSize可以有效地控制每次從數(shù)據(jù)庫拉取的數(shù)據(jù)量,防止內存溢出。
在您的例子中,fetchSize="100"意味著每次從數(shù)據(jù)庫獲取100條記錄。
resultSetType:
resultSetType屬性用于定義結果集的滾動方向。MyBatis支持以下幾種類型:
FORWARD_ONLY:結果集只能向前滾動,這是默認值,適用于大多數(shù)情況。
SCROLL_SENSITIVE:結果集可以向前或向后滾動,并且可以檢測到數(shù)據(jù)庫中的數(shù)據(jù)變化。
SCROLL_INSENSITIVE:結果集可以向前或向后滾動,但不會檢測到數(shù)據(jù)庫中的數(shù)據(jù)變化。
這個屬性影響JDBC的Statement對象的resultSetType,它決定了結果集的可滾動性和可更新性。
在您的例子中,resultSetType="FORWARD_ONLY"意味著結果集只能向前滾動,這是最常用的類型,因為它通常提供更好的性能。
使用fetchSize和resultSetType可以幫助優(yōu)化查詢性能和資源使用。在處理大量數(shù)據(jù)或需要特定結果集行為時,這些屬性尤其有用。然而,它們的實際效果還取決于數(shù)據(jù)庫驅動程序和數(shù)據(jù)庫服務器的性能特性。

2.3.4 使用注解

在Mybatis3.2中可以使用注解:

@Select("select * from entity_demo t ${ew.customSqlSegment}")
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 100)
@ResultType(Entity_demo.class)
void selectFetchSize(@Param(Constants.WRAPPER) QueryWrapper<Entity_demo> wrapper,ResultHandler<entity_demo> handler);

到此這篇關于JDBC中Fetchsize的實現(xiàn)的文章就介紹到這了,更多相關JDBC Fetchsize內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SWT JFace 小制作 文本閱讀器

    SWT JFace 小制作 文本閱讀器

    SWT JFace 小制作 文本閱讀器
    2009-06-06
  • springboot3.x版本集成log4j遇到Logging?system?failed?to?initialize?using?configuration?from‘classpath:log4問題

    springboot3.x版本集成log4j遇到Logging?system?failed?to?initial

    使用Springboot?3.x集成Log4j時可能會遇到版本沖突的問題,這通??梢酝ㄟ^檢查Maven依賴樹來識別,一旦發(fā)現(xiàn)沖突,將Log4j的版本統(tǒng)一更新到最新的兼容版本,例如2.21.1,即可解決問題,此方法有效解決了日志打印錯誤,是處理類似問題的一個實用參考
    2024-09-09
  • java管道piped輸入流與輸出流應用場景案例分析

    java管道piped輸入流與輸出流應用場景案例分析

    這篇文章主要介紹了java管道流PipedInputStream與PipedOutputStream(輸入流與輸出流)的應用場景案例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • 在SpringBoot中記錄用戶操作日志功能

    在SpringBoot中記錄用戶操作日志功能

    在Web應用程序開發(fā)中,記錄用戶操作日志是一項非常重要的任務,它可以幫助我們追蹤用戶行為,分析系統(tǒng)狀況,以及審計系統(tǒng)的安全性,本文將介紹如何在SpringBoot框架中實現(xiàn)用戶操作日志的記錄功能,感興趣的朋友一起看看吧
    2024-12-12
  • Java中的FilterOutputStream 簡介_動力節(jié)點Java學院整理

    Java中的FilterOutputStream 簡介_動力節(jié)點Java學院整理

    FilterOutputStream 的作用是用來“封裝其它的輸出流,并為它們提供額外的功能”。它主要包括BufferedOutputStream, DataOutputStream和PrintStream。接下來通過本文給大家簡單介紹下FilterOutputStream知識,需要的朋友參考下吧
    2017-05-05
  • SpringMVC實現(xiàn)前端后臺交互傳遞數(shù)據(jù)

    SpringMVC實現(xiàn)前端后臺交互傳遞數(shù)據(jù)

    本篇文章主要介紹了SpringMVC實現(xiàn)前端后臺傳遞數(shù)據(jù)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Java反射機制原理、Class獲取方式以及應用場景詳解

    Java反射機制原理、Class獲取方式以及應用場景詳解

    反射機制是JAVA的核心知識點之一,大多數(shù)框架的實現(xiàn)原理就是利用了反射機制,掌握反射機制會使你學習框架更加輕松高效,這篇文章主要給大家介紹了關于Java反射機制原理、Class獲取方式以及應用場景的相關資料,需要的朋友可以參考下
    2022-04-04
  • Java后端頭像合成到背景圖上面代碼實踐

    Java后端頭像合成到背景圖上面代碼實踐

    這篇文章介紹了如何使用Java后端工具類將頭像合成到背景圖上,提供了兩種合成方法:一種是將頭像固定在背景圖的某個位置,另一種是將頭像合成到背景圖的中心位置,作者分享了圖片合成類的代碼,并總結了如何根據(jù)需要調用相關方法返回圖片地址
    2026-01-01
  • Java線程之程安全與不安全代碼示例

    Java線程之程安全與不安全代碼示例

    這篇文章主要介紹了Java線程之程安全與不安全代碼示例,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • mybatisplus解決駝峰命名映射問題詳解

    mybatisplus解決駝峰命名映射問題詳解

    這篇文章主要介紹了mybatisplus解決駝峰命名映射問題詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09

最新評論

海阳市| 永昌县| 碌曲县| 江城| 肇源县| 扎鲁特旗| 开原市| 云阳县| 勐海县| 吴川市| 新密市| 长岭县| 天等县| 东乡| 龙门县| 牙克石市| 中江县| 汽车| 嘉荫县| 五华县| 甘德县| 枣庄市| 老河口市| 香港| 全州县| 黑水县| 蒙自县| 宁海县| 黄梅县| 新建县| 西乌珠穆沁旗| 海伦市| 镇坪县| 涿州市| 通渭县| 定安县| SHOW| 治县。| 民勤县| 龙川县| 喀喇|