国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MongoCursor簡單總結

Sourcelink / 3756人閱讀

摘要:要不要顯式關閉查詢數據實現一實現二實現二更方便簡潔但是沒有顯式關閉有沒問題呢一些結論如果已被遍歷完會自動關閉無需顯式關閉所以實現二沒有問題如果只是遍歷了部分數據需要顯式關閉在遍歷過程中同時處理其他業務邏輯需要在中關閉避免中間報了異常沒有迭代

cursor要不要顯式關閉

Mongo查詢數據實現一

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;

實現二

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

實現二更方便簡潔 但是沒有顯式關閉cursor有沒問題呢?

一些結論

如果cursor已被遍歷完(exhausted) 會自動關閉 無需顯式關閉 所以實現二 沒有問題

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...

如果只是遍歷了部分數據 需要顯式關閉

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

在遍歷過程中 同時處理其他業務邏輯 需要try catch在finally中關閉 避免中間報了異常 沒有迭代完 導致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...
一次性查詢出來 VS 逐個迭代

一次性查詢出來放到list中

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

直接將500個對象放到內存中了

逐個迭代

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底層是分批查詢的 先是查出101個對象 再接著查出剩下的399個對象 相比一次性查出內存中最多有399個對象

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.

如果覺得399個對象還是大了 可以顯式指定每批查詢多少 如可以指定每批查100個 如下所示

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

但是這會增加網絡交互次數 本來默認查兩次 現在變成了查5次了

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71121.html

相關文章

  • MongoCursor簡單總結

    摘要:要不要顯式關閉查詢數據實現一實現二實現二更方便簡潔但是沒有顯式關閉有沒問題呢一些結論如果已被遍歷完會自動關閉無需顯式關閉所以實現二沒有問題如果只是遍歷了部分數據需要顯式關閉在遍歷過程中同時處理其他業務邏輯需要在中關閉避免中間報了異常沒有迭代 cursor要不要顯式關閉 Mongo查詢數據實現一 MongoCursor cursor = collection.find().limit(l...

    fjcgreat 評論0 收藏0
  • MongoDB最簡單的入門教程之三 使用Java代碼往MongoDB里插入數據

    摘要:前兩篇教程我們介紹了如何搭建的本地環境最簡單的入門教程之一環境搭建以及如何用讀取里的記錄最簡單的入門教程之二使用訪問這篇教程我們會介紹如何使用代碼來連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數據庫里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環境: MongoDB最簡單的入門教程之一 環境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...

    Kylin_Mountain 評論0 收藏0
  • MongoDB最簡單的入門教程之三 使用Java代碼往MongoDB里插入數據

    摘要:前兩篇教程我們介紹了如何搭建的本地環境最簡單的入門教程之一環境搭建以及如何用讀取里的記錄最簡單的入門教程之二使用訪問這篇教程我們會介紹如何使用代碼來連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數據庫里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環境: MongoDB最簡單的入門教程之一 環境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...

    Hegel_Gu 評論0 收藏0
  • MongoDB最簡單的入門教程之三 使用Java代碼往MongoDB里插入數據

    摘要:前兩篇教程我們介紹了如何搭建的本地環境最簡單的入門教程之一環境搭建以及如何用讀取里的記錄最簡單的入門教程之二使用訪問這篇教程我們會介紹如何使用代碼來連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數據庫里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環境: MongoDB最簡單的入門教程之一 環境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...

    whatsns 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<