日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在恰当的地方使用MongoDB的WriteConcern.SAFE参数

發(fā)布時(shí)間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在恰当的地方使用MongoDB的WriteConcern.SAFE参数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先列一下WriteConcern的幾種拋出異常的級別參數(shù):

  • WriteConcern.NONE:沒有異常拋出
  • WriteConcern.NORMAL:僅拋出網(wǎng)絡(luò)錯(cuò)誤異常,沒有服務(wù)器錯(cuò)誤異常
  • WriteConcern.SAFE:拋出網(wǎng)絡(luò)錯(cuò)誤異常、服務(wù)器錯(cuò)誤異常;并等待服務(wù)器完成寫操作。
  • WriteConcern.MAJORITY: 拋出網(wǎng)絡(luò)錯(cuò)誤異常、服務(wù)器錯(cuò)誤異常;并等待一個(gè)主服務(wù)器完成寫操作。
  • WriteConcern.FSYNC_SAFE: 拋出網(wǎng)絡(luò)錯(cuò)誤異常、服務(wù)器錯(cuò)誤異常;寫操作等待服務(wù)器將數(shù)據(jù)刷新到磁盤。
  • WriteConcern.JOURNAL_SAFE:拋出網(wǎng)絡(luò)錯(cuò)誤異常、服務(wù)器錯(cuò)誤異常;寫操作等待服務(wù)器提交到磁盤的日志文件。
  • WriteConcern.REPLICAS_SAFE:拋出網(wǎng)絡(luò)錯(cuò)誤異常、服務(wù)器錯(cuò)誤異常;等待至少2臺(tái)服務(wù)器完成寫操作。

?

當(dāng)我們執(zhí)行如下操作時(shí)(將"name"為"lily"的"age"設(shè)置為20):

db.update({"name":"lily"},{"$set":{"age":20}})

默認(rèn)情況下,該操作會(huì)使用WriteConcern.NORMAL(僅在網(wǎng)絡(luò)錯(cuò)誤時(shí)拋出異常),等同于:

db.update({"name":"lily"},{"$set":{"age":20}},WriteConcern.NORMAL)

使用NORMAL模式參數(shù),可以使得寫操作效率非常高。但是如果此時(shí)服務(wù)器出錯(cuò),也不會(huì)返回錯(cuò)誤給客戶端,而客戶端會(huì)誤認(rèn)為操作成功。

因此在很多重要寫操作中需要使用WriteConcern.SAFE模式,保證可以感知到這個(gè)錯(cuò)誤,保證客戶端和服務(wù)器對一次操作的正確性認(rèn)知保持一致。

(根據(jù)筆者測試,如果服務(wù)器發(fā)生掉電情況,客戶端依然得不到當(dāng)時(shí)操作的錯(cuò)誤返回,需要特別注意)

另外在很多時(shí)候,我們需要確切知道這次寫操作是否成功(或者本次更新操作影響了多少個(gè)對象),這時(shí)候就需要:

WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}});
if(ret.getN()>0) //操作影響的對象個(gè)數(shù)
return true;
else
return false;

或者:

WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}});
if(ret.getLastError() == null)
return true;
else
return false;

此時(shí),getLastError()會(huì)查詢上次操作結(jié)果是否出現(xiàn)錯(cuò)誤。

更進(jìn)一步

然后由于mongodb中使用連接池的原因,getLastError()需要再次從連接池中獲取連接,這樣效率會(huì)慢一些。可以這樣做:

db.requestStart();
WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}});
if(ret.getLastError() == null)
return true;
else
return false;
db.requestDone();

就可以保證update操作和getLastError()使用同一個(gè)連接,并且減少了一次存/取連接的過程。

?

還有一個(gè)方法

此時(shí)也可以使用WriteConcern.SAFE參數(shù):

WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}}, WriteConcern.SAFE);
if(ret.getLastError() == null)
return true;
else
return false;

// is equivalent to
db.requestStart();
WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}});
if(ret.getLastError() == null)
return true;
else
return false;
db.requestDone();

這也是我推薦使用的方式,這樣即可以高效的得到返回結(jié)果,還能感知到服務(wù)器錯(cuò)誤,一舉兩得。

轉(zhuǎn)載于:https://www.cnblogs.com/xinghebuluo/archive/2011/12/01/2270896.html

總結(jié)

以上是生活随笔為你收集整理的在恰当的地方使用MongoDB的WriteConcern.SAFE参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。