欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JDBC中Fetchsize的實(shí)現(xiàn)

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

1. 什么是fetchsize?

1.1  Oracle中的fetchsize

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

例如:

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

1.2  Mysql中的fetchsize

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

注意:

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

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

但需要注意的是,對(duì)于 MySQL 數(shù)據(jù)庫,如果不啟用服務(wù)器端游標(biāo)獲取數(shù)據(jù),這可能會(huì)影響到流式查詢的效果。因?yàn)樵谀J(rèn)情況下,MySQL JDBC 驅(qū)動(dòng)會(huì)一次性將所有數(shù)據(jù)加載到內(nèi)存中。此時(shí),即使使用了其他配置,也可能無法達(dá)到預(yù)期的內(nèi)存優(yōu)化效果。

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

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的默認(rèn)值

在ojdbc8的源碼中oracle的驅(qū)動(dòng)的fetchsize參數(shù)的默認(rèn)值是10

2.3 fetchsize的設(shè)置

2.3.1 Mybatis全局設(shè)置

通過設(shè)置 MyBatis 配置文件中的 defaultFetchSize 值:

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

2.3.2 語句級(jí)別的設(shè)置

可以在jdbc中調(diào)用Preparedstatement .setFetchSize()的進(jìn)行設(shè)置:

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

2.3.3 框架上直接針對(duì)某個(gè)語句進(jìn)行設(shè)置

可以在Mybatis的查詢語句上進(jìn)行設(shè)置:

<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ù)。這個(gè)屬性可以用于控制查詢操作的內(nèi)存使用和性能。
當(dāng)設(shè)置fetchSize時(shí),MyBatis會(huì)根據(jù)這個(gè)值來調(diào)整JDBC的Statement對(duì)象的fetchSize屬性。如果數(shù)據(jù)庫和JDBC驅(qū)動(dòng)支持,這可以減少網(wǎng)絡(luò)往返次數(shù),提高性能。
在分頁查詢或處理大量數(shù)據(jù)時(shí),合理設(shè)置fetchSize可以有效地控制每次從數(shù)據(jù)庫拉取的數(shù)據(jù)量,防止內(nèi)存溢出。
在您的例子中,fetchSize="100"意味著每次從數(shù)據(jù)庫獲取100條記錄。
resultSetType:
resultSetType屬性用于定義結(jié)果集的滾動(dòng)方向。MyBatis支持以下幾種類型:
FORWARD_ONLY:結(jié)果集只能向前滾動(dòng),這是默認(rèn)值,適用于大多數(shù)情況。
SCROLL_SENSITIVE:結(jié)果集可以向前或向后滾動(dòng),并且可以檢測到數(shù)據(jù)庫中的數(shù)據(jù)變化。
SCROLL_INSENSITIVE:結(jié)果集可以向前或向后滾動(dòng),但不會(huì)檢測到數(shù)據(jù)庫中的數(shù)據(jù)變化。
這個(gè)屬性影響JDBC的Statement對(duì)象的resultSetType,它決定了結(jié)果集的可滾動(dòng)性和可更新性。
在您的例子中,resultSetType="FORWARD_ONLY"意味著結(jié)果集只能向前滾動(dòng),這是最常用的類型,因?yàn)樗ǔL峁└玫男阅堋?br />使用fetchSize和resultSetType可以幫助優(yōu)化查詢性能和資源使用。在處理大量數(shù)據(jù)或需要特定結(jié)果集行為時(shí),這些屬性尤其有用。然而,它們的實(shí)際效果還取決于數(shù)據(jù)庫驅(qū)動(dòng)程序和數(shù)據(jù)庫服務(wù)器的性能特性。

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);

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

相關(guān)文章

  • springboot log4j2不能打印框架錯(cuò)誤日志的解決方案

    springboot log4j2不能打印框架錯(cuò)誤日志的解決方案

    這篇文章主要介紹了springboot log4j2不能打印框架錯(cuò)誤日志的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java經(jīng)典問題:連個(gè)字符串互為回環(huán)變位

    java經(jīng)典問題:連個(gè)字符串互為回環(huán)變位

    連個(gè)字符串互為回環(huán)變位經(jīng)常出現(xiàn)在java程序員面試中,這個(gè)是考驗(yàn)程序員的解題思路和方法的最經(jīng)典的一題,小編為大家詳細(xì)分析一下,一起來學(xué)習(xí)吧。
    2017-11-11
  • 一文帶你看懂Android動(dòng)畫的實(shí)現(xiàn)原理

    一文帶你看懂Android動(dòng)畫的實(shí)現(xiàn)原理

    動(dòng)畫是 Android 應(yīng)用程序中重要的交互特性,ndroid 提供了多種動(dòng)畫效果,包括平移、縮放、旋轉(zhuǎn)和透明度等,它們可以通過代碼或 XML 來實(shí)現(xiàn),本文將介紹 Android 動(dòng)畫的原理和實(shí)現(xiàn)方法,并提供一些示例,需要的朋友可以參考下
    2023-07-07
  • 深入Java冒泡排序與選擇排序的區(qū)別詳解

    深入Java冒泡排序與選擇排序的區(qū)別詳解

    本篇文章是對(duì)Java冒泡排序與選擇排序的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理

    Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理

    這篇文章主要介紹了Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理,包括類與方法以及多態(tài)等支持面向?qū)ο笳Z言中的重要特點(diǎn),需要的朋友可以參考下
    2016-01-01
  • springboot全局日期格式化的兩種方式

    springboot全局日期格式化的兩種方式

    這篇文章主要介紹了springboot全局日期格式化的兩種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringCloud全局過慮器GlobalFilter的用法小結(jié)

    SpringCloud全局過慮器GlobalFilter的用法小結(jié)

    這篇文章主要介紹了SpringCloud全局過慮器GlobalFilter的使用,全局過慮器使用非常廣泛,比如驗(yàn)證是否登錄,全局性的處理,黑名單或白名單的校驗(yàn)等,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 關(guān)于Scanner中nextInt()、nextLine()等方法總結(jié)與問題解決

    關(guān)于Scanner中nextInt()、nextLine()等方法總結(jié)與問題解決

    這篇文章主要介紹了關(guān)于Scanner中nextInt()、nextLine()等方法總結(jié)與問題解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-11-11
  • 最新評(píng)論