第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Statement.setFetchSize(nSize)方法在SQL Server JDBC驅(qū)動(dòng)

Statement.setFetchSize(nSize)方法在SQL Server JDBC驅(qū)動(dòng)

開心每一天1111 2019-09-02 16:18:49
我有這個(gè)非常大的桌子,每天有數(shù)百萬條記錄,每天結(jié)束時(shí)我都會(huì)提取前一天的所有記錄。我這樣做:String SQL =  "select col1, col2, coln from mytable where timecol = yesterday";Statement.executeQuery(SQL);問題是這個(gè)程序需要2GB的內(nèi)存,因?yàn)樗鼤?huì)將所有結(jié)果都記在內(nèi)存中然后處理它。我嘗試設(shè)置Statement.setFetchSize(10)但它從操作系統(tǒng)獲取完全相同的內(nèi)存它沒有任何區(qū)別。我正在使用Microsoft SQL Server 2005 JDBC驅(qū)動(dòng)程序。是否有任何方法可以在小塊中讀取結(jié)果,例如Oracle數(shù)據(jù)庫驅(qū)動(dòng)程序在執(zhí)行查詢時(shí)只顯示幾行,當(dāng)您向下滾動(dòng)時(shí)會(huì)顯示更多結(jié)果?
查看完整描述

3 回答

?
天涯盡頭無女友

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊

在JDBC中,該setFetchSize(int)方法對(duì)于JVM中的性能和內(nèi)存管理非常重要,因?yàn)樗刂茝腏VM到數(shù)據(jù)庫的網(wǎng)絡(luò)調(diào)用的數(shù)量,以及相應(yīng)的用于ResultSet處理的RAM量。

本質(zhì)上,如果調(diào)用setFetchSize(10)并且驅(qū)動(dòng)程序忽略它,則可能只有兩個(gè)選項(xiàng):

  1. 嘗試使用不同的JDBC驅(qū)動(dòng)程序來支持fetch-size提示。

  2. 查看Connection上的驅(qū)動(dòng)程序特定屬性(創(chuàng)建Connection實(shí)例時(shí)的URL和/或?qū)傩杂成洌?/p>

RESULT-SET是響應(yīng)查詢而在DB上編組的行數(shù)。ROW-SET是從JVM到DB的每次調(diào)用從RESULT-SET中取出的行塊。處理所需的這些調(diào)用數(shù)和生成的RAM取決于fetch-size設(shè)置。

因此,如果RESULT-SET有100行且fetch-size為10,那么將有10次網(wǎng)絡(luò)調(diào)用來檢索所有數(shù)據(jù),在任何給定時(shí)間使用大約10 * {row-content-size} RAM。

默認(rèn)的fetch-size是10,相當(dāng)小。在發(fā)布的情況下,似乎驅(qū)動(dòng)程序忽略了fetch-size設(shè)置,在一次調(diào)用中檢索所有數(shù)據(jù)(大RAM要求,最佳最小網(wǎng)絡(luò)調(diào)用)。

下面發(fā)生的ResultSet.next()是它實(shí)際上并沒有從RESULT-SET一次獲取一行。它從(本地)ROW-SET中獲取它,并在本地客戶端上耗盡時(shí)從服務(wù)器獲取下一個(gè)ROW-SET(不可見)。

所有這一切都取決于驅(qū)動(dòng)程序,因?yàn)樵O(shè)置只是一個(gè)“提示”,但實(shí)際上我發(fā)現(xiàn)這是它如何適用于許多驅(qū)動(dòng)程序和數(shù)據(jù)庫(在許多版本的Oracle,DB2和MySQL中驗(yàn)證)。


查看完整回答
反對(duì) 回復(fù) 2019-09-02
?
撒科打諢

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊

fetchSize參數(shù)是JDBC驅(qū)動(dòng)程序的提示,指示要從數(shù)據(jù)庫中一次獲取的許多行。但是司機(jī)可以自由地忽略這一點(diǎn)并做它認(rèn)為合適的事情。某些驅(qū)動(dòng)程序(如Oracle的驅(qū)動(dòng)程序)以塊的形式獲取行,因此您可以讀取非常大的結(jié)果集而無需大量內(nèi)存。其他驅(qū)動(dòng)程序只需一次讀取整個(gè)結(jié)果集,我猜你的驅(qū)動(dòng)程序正在做什么。

您可以嘗試將驅(qū)動(dòng)程序升級(jí)到SQL Server 2008版本(可能更好)或開源jTDS驅(qū)動(dòng)程序。


查看完整回答
反對(duì) 回復(fù) 2019-09-02
?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊

您需要確保關(guān)閉 Connection上的自動(dòng)提交,否則setFetchSize將不起作用。

dbConnection.setAutoCommit(false);

編輯:記得當(dāng)我使用此修復(fù)程序時(shí)它是Postgres特定的,但希望它仍然適用于SQL Server。


查看完整回答
反對(duì) 回復(fù) 2019-09-02
  • 3 回答
  • 0 關(guān)注
  • 2233 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)