成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

MongoCursor簡(jiǎn)單總結(jié)

Sourcelink / 3772人閱讀

摘要:要不要顯式關(guān)閉查詢(xún)數(shù)據(jù)實(shí)現(xiàn)一實(shí)現(xiàn)二實(shí)現(xiàn)二更方便簡(jiǎn)潔但是沒(méi)有顯式關(guān)閉有沒(méi)問(wèn)題呢一些結(jié)論如果已被遍歷完會(huì)自動(dòng)關(guān)閉無(wú)需顯式關(guān)閉所以實(shí)現(xiàn)二沒(méi)有問(wèn)題如果只是遍歷了部分?jǐn)?shù)據(jù)需要顯式關(guān)閉在遍歷過(guò)程中同時(shí)處理其他業(yè)務(wù)邏輯需要在中關(guān)閉避免中間報(bào)了異常沒(méi)有迭代

cursor要不要顯式關(guān)閉

Mongo查詢(xún)數(shù)據(jù)實(shí)現(xiàn)一

MongoCursor cursor = collection.find().limit(limit).iterator();
List documentList = new ArrayList<>();
try {
    while (cursor.hasNext()) {
        T document = cursor.next();
        documentList.add(document);
    }
} finally {
    cursor.close();
}
return documentList;

實(shí)現(xiàn)二

return newArrayList(collection.find().limit(limit));

實(shí)現(xiàn)二更方便簡(jiǎn)潔 但是沒(méi)有顯式關(guān)閉cursor有沒(méi)問(wèn)題呢?

一些結(jié)論

如果cursor已被遍歷完(exhausted) 會(huì)自動(dòng)關(guān)閉 無(wú)需顯式關(guān)閉 所以實(shí)現(xiàn)二 沒(méi)有問(wèn)題

By default, the server will automatically close the cursor after 10
minutes of inactivity, or if client has exhausted the cursor.

https://docs.mongodb.com/manu...

如果只是遍歷了部分?jǐn)?shù)據(jù) 需要顯式關(guān)閉

MongoCursor mongoCursor = coll.find().sort(ascending("_id")).iterator();
Document doc1 = mongoCursor.next();
// ...
mongoCursor.close();

在遍歷過(guò)程中 同時(shí)處理其他業(yè)務(wù)邏輯 需要try catch在finally中關(guān)閉 避免中間報(bào)了異常 沒(méi)有迭代完 導(dǎo)致cursor泄露

cursor泄露的危害

Leaving a "cursor" open is like leaving an open connection that never gets re-used. These things are not free. In fact the standard connection cost is 1MB (approx). So if you are leaving a lot of "partially iterated" cursors hanging around there is a general overhead in terms of an active connection and it"s memory usage.
https://stackoverflow.com/que...
一次性查詢(xún)出來(lái) VS 逐個(gè)迭代

一次性查詢(xún)出來(lái)放到list中

return newArrayList(collection.find().limit(500))

直接將500個(gè)對(duì)象放到內(nèi)存中了

逐個(gè)迭代

MongoCursor cursor = collection.find().limit(500).iterator();
try {
    while (cursor.hasNext()) {
        T document = cursor.next();
        // business logic here ...
        documentList.add(document);
    }
} finally {
    cursor.close();
}

Mongo底層是分批查詢(xún)的 先是查出101個(gè)對(duì)象 再接著查出剩下的399個(gè)對(duì)象 相比一次性查出內(nèi)存中最多有399個(gè)對(duì)象

find() and aggregate() operations have an initial batch size of 101
documents by default. Subsequent getMore operations issued against the
resulting cursor have no default batch size, so they are limited only
by the 16 megabyte message size.

如果覺(jué)得399個(gè)對(duì)象還是大了 可以顯式指定每批查詢(xún)多少 如可以指定每批查100個(gè) 如下所示

MongoCursor mongoCursor = coll.find().limit(500).batchSize(100).iterator();

但是這會(huì)增加網(wǎng)絡(luò)交互次數(shù) 本來(lái)默認(rèn)查兩次 現(xiàn)在變成了查5次了

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71121.html

相關(guān)文章

  • MongoCursor簡(jiǎn)單總結(jié)

    摘要:要不要顯式關(guān)閉查詢(xún)數(shù)據(jù)實(shí)現(xiàn)一實(shí)現(xiàn)二實(shí)現(xiàn)二更方便簡(jiǎn)潔但是沒(méi)有顯式關(guān)閉有沒(méi)問(wèn)題呢一些結(jié)論如果已被遍歷完會(huì)自動(dòng)關(guān)閉無(wú)需顯式關(guān)閉所以實(shí)現(xiàn)二沒(méi)有問(wèn)題如果只是遍歷了部分?jǐn)?shù)據(jù)需要顯式關(guān)閉在遍歷過(guò)程中同時(shí)處理其他業(yè)務(wù)邏輯需要在中關(guān)閉避免中間報(bào)了異常沒(méi)有迭代 cursor要不要顯式關(guān)閉 Mongo查詢(xún)數(shù)據(jù)實(shí)現(xiàn)一 MongoCursor cursor = collection.find().limit(l...

    fjcgreat 評(píng)論0 收藏0
  • MongoDB最簡(jiǎn)單的入門(mén)教程之三 使用Java代碼往MongoDB里插入數(shù)據(jù)

    摘要:前兩篇教程我們介紹了如何搭建的本地環(huán)境最簡(jiǎn)單的入門(mén)教程之一環(huán)境搭建以及如何用讀取里的記錄最簡(jiǎn)單的入門(mén)教程之二使用訪問(wèn)這篇教程我們會(huì)介紹如何使用代碼來(lái)連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數(shù)據(jù)庫(kù)里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環(huán)境: MongoDB最簡(jiǎn)單的入門(mén)教程之一 環(huán)境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...

    Kylin_Mountain 評(píng)論0 收藏0
  • MongoDB最簡(jiǎn)單的入門(mén)教程之三 使用Java代碼往MongoDB里插入數(shù)據(jù)

    摘要:前兩篇教程我們介紹了如何搭建的本地環(huán)境最簡(jiǎn)單的入門(mén)教程之一環(huán)境搭建以及如何用讀取里的記錄最簡(jiǎn)單的入門(mén)教程之二使用訪問(wèn)這篇教程我們會(huì)介紹如何使用代碼來(lái)連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數(shù)據(jù)庫(kù)里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環(huán)境: MongoDB最簡(jiǎn)單的入門(mén)教程之一 環(huán)境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...

    Hegel_Gu 評(píng)論0 收藏0
  • MongoDB最簡(jiǎn)單的入門(mén)教程之三 使用Java代碼往MongoDB里插入數(shù)據(jù)

    摘要:前兩篇教程我們介紹了如何搭建的本地環(huán)境最簡(jiǎn)單的入門(mén)教程之一環(huán)境搭建以及如何用讀取里的記錄最簡(jiǎn)單的入門(mén)教程之二使用訪問(wèn)這篇教程我們會(huì)介紹如何使用代碼來(lái)連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數(shù)據(jù)庫(kù)里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環(huán)境: MongoDB最簡(jiǎn)單的入門(mén)教程之一 環(huán)境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...

    whatsns 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<