摘要:要不要顯式關閉查詢數據實現一實現二實現二更方便簡潔但是沒有顯式關閉有沒問題呢一些結論如果已被遍歷完會自動關閉無需顯式關閉所以實現二沒有問題如果只是遍歷了部分數據需要顯式關閉在遍歷過程中同時處理其他業務邏輯需要在中關閉避免中間報了異常沒有迭代
cursor要不要顯式關閉
Mongo查詢數據實現一
MongoCursorcursor = 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
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.一次性查詢出來 VS 逐個迭代
https://stackoverflow.com/que...
一次性查詢出來放到list中
return newArrayList(collection.find().limit(500))
直接將500個對象放到內存中了
逐個迭代
MongoCursorcursor = 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個 如下所示
MongoCursormongoCursor = coll.find().limit(500).batchSize(100).iterator();
但是這會增加網絡交互次數 本來默認查兩次 現在變成了查5次了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71121.html
摘要:要不要顯式關閉查詢數據實現一實現二實現二更方便簡潔但是沒有顯式關閉有沒問題呢一些結論如果已被遍歷完會自動關閉無需顯式關閉所以實現二沒有問題如果只是遍歷了部分數據需要顯式關閉在遍歷過程中同時處理其他業務邏輯需要在中關閉避免中間報了異常沒有迭代 cursor要不要顯式關閉 Mongo查詢數據實現一 MongoCursor cursor = collection.find().limit(l...
摘要:前兩篇教程我們介紹了如何搭建的本地環境最簡單的入門教程之一環境搭建以及如何用讀取里的記錄最簡單的入門教程之二使用訪問這篇教程我們會介紹如何使用代碼來連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數據庫里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環境: MongoDB最簡單的入門教程之一 環境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...
摘要:前兩篇教程我們介紹了如何搭建的本地環境最簡單的入門教程之一環境搭建以及如何用讀取里的記錄最簡單的入門教程之二使用訪問這篇教程我們會介紹如何使用代碼來連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數據庫里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環境: MongoDB最簡單的入門教程之一 環境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...
摘要:前兩篇教程我們介紹了如何搭建的本地環境最簡單的入門教程之一環境搭建以及如何用讀取里的記錄最簡單的入門教程之二使用訪問這篇教程我們會介紹如何使用代碼來連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數據庫里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環境: MongoDB最簡單的入門教程之一 環境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...
閱讀 3734·2021-10-15 09:42
閱讀 2594·2021-09-03 10:50
閱讀 1628·2021-09-03 10:28
閱讀 1788·2019-08-30 15:54
閱讀 2510·2019-08-30 12:46
閱讀 401·2019-08-30 11:06
閱讀 2818·2019-08-30 10:54
閱讀 521·2019-08-29 12:59