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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

java连接mongodb_java连接mongodb源码解读

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java连接mongodb_java连接mongodb源码解读 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用mongdb也大半年了,一直是業務上的邏輯實現了就ok。然而這樣并不能進步……因此今天查了查java連接mongodb驅動的源碼,搜到的各種信息整合一下,方便以后深入的使用。

先貼連接數據庫代碼List?replicaSet?=?new

ArrayList();

replicaSet.add(new?ServerAddress("127.0.0.1",?27017));

MongoClientOptions?option?=

MongoClientOptions.builder().autoConnectRetry(true).connectionsPerHost(300).maxWaitTime(30000).build();

MongoConnection.init(replicaSet,?option,?"test");

public?static?synchronized?void?init(List?replicaSet,

MongoClientOptions?option,?String?defaultDb){

mongo?=?new?MongoClient(replicaSet,?option);

mongo.setReadPreference(ReadPreference.nearest());

setDb(mongo.getDB(defaultDb));

}

當初一眼看過去也是頭大無比,就跟大學背下來的連接mysql數據庫驅動一樣,只求考試默寫下來不掛科。雖然也能用,但是不求甚解的態度明顯是錯誤的!接下來分解下來一步一步看吧:

public?ServerAddress(?String?host?,?int?port?)

throws?UnknownHostException?{

if?(?host?==?null?)

host?=?defaultHost();

host?=?host.trim();

if?(?host.length()?==?0?)

host?=?defaultHost();

int?idx?=?host.indexOf(?":"?);

if?(?idx?>?0?){

if?(?port?!=?defaultPort()?)

throw?new?IllegalArgumentException(?"can't?specify?port?in?construct?and?via?host"?);

port?=?Integer.parseInt(?host.substring(?idx?+?1?)?);

host?=?host.substring(?0?,?idx?).trim();

}

_host?=?host;

_port?=?port;

updateInetAddress();

}

replicaSet顯然是一個服務器地址數組,點進去后是對IP地址以及端口的解析。如果填寫的地址是127.0.0.1:27017樣式的話,冒號之后的端口必須是27017,否則就拋出異常告訴你不能自己構建主機及端口。不過既然使用了帶host以及port的構造方法,地址和端口分開寫就好了,何必放在一塊……

boolean?updateInetAddress()?throws?UnknownHostException?{

InetSocketAddress?oldAddress?=?_address;

_address?=?new?InetSocketAddress(?InetAddress.getByName(_host)?,?_port?);

return?!_address.equals(oldAddress);

}

volatile?InetSocketAddress?_address;

至于updateInetAddress(),InetAddress是java對ip地址的封裝,方便其他網絡類調用,方法內部對ipv4和ipv6有各種詳細的判定,不多贅述,畢竟是基礎類,有時間認真學習一下提升會非常大。詳細內容在這個博客里面http://my.oschina.net/fhd/blog/371997有提及。volatile是一個類型修飾符(type specifier)。它是被設計用來修飾被不同線程訪問和修改的變量。如果不加入volatile,要么無法編寫多線程程序,要么編譯器失去大量優化的機會。回到第一塊,MongoClientOptions是對數據庫的一些設置,用到了人民喜聞樂見的構建者模式builder:

private?String?description;

private?int?connectionsPerHost?=?100;

private?int?threadsAllowedToBlockForConnectionMultiplier?=?5;

private?int?maxWaitTime?=?1000?*?60?*?2;

private?int?connectTimeout?=?1000?*?10;

private?int?socketTimeout?=?0;

private?boolean?socketKeepAlive?=?false;

private?boolean?autoConnectRetry?=?false;

private?long?maxAutoConnectRetryTime?=?0;

private?ReadPreference?readPreference?=?ReadPreference.primary();

private?DBDecoderFactory?dbDecoderFactory?=?DefaultDBDecoder.FACTORY;

private?DBEncoderFactory?dbEncoderFactory?=?DefaultDBEncoder.FACTORY;

private?WriteConcern?writeConcern?=?WriteConcern.ACKNOWLEDGED;

private?SocketFactory?socketFactory?=?SocketFactory.getDefault();

private?boolean?cursorFinalizerEnabled?=?true;

private?boolean?alwaysUseMBeans?=?false;

builder給需要初始化的成員變量賦值。一個一個看吧~connectionsPerHost:每個主機的連接數

threadsAllowedToBlockForConnectionMultiplier:線程隊列數,它以上面

connectionsPerHost值相乘的結果就是線程隊列最大值。如果連接線程排滿了隊列就會拋出“Out of semaphores to

get db”錯誤。

maxWaitTime:最大等待連接的線程阻塞時間

connectTimeout:連接超時的毫秒。0是默認和無限

socketTimeout:socket超時。0是默認和無限

autoConnectRetry:這個控制是否在一個連接時,系統會自動重試

以上解釋似乎在各種需要線程池的數據庫連接驅動都通用……ReadPrefrence是多個節點時讀操作的設置,默認是只從主節點進行讀操作,還有其他屬性如只從第二節點讀、從主節點讀,若不可讀取則再去從節點讀取等等。目前還沒有用到過……之前的代碼設置的是從離最近的節點讀取mongo.setReadPreference(ReadPreference.nearest())。然而我們的程序只有一個節點……并沒有什么卵用。WriteConcern用來保障寫操作的可靠性,是性能和可靠性之間的一個平衡,http://kyfxbl.iteye.com/blog/1952941這個博客中講的比較詳細。簡單來說就是保障寫操作確實入庫了,不會因為網絡狀況或者服務器掛掉導致寫入失敗的時候得不到提醒,如果這個參數設置w:-1則得不到任何異常信息,默認w:1,最好也設置jurnal:true,寫操作寫入內存的同時也寫入journal文件,這樣如果mongod非正常down掉,重啟以后就可以根據journal文件中的內容,來還原寫操作。更高級別則是對多個節點的集群進行設置了,只有一個節點的話w:1&journal:true就夠用了。所以第一塊代碼中的init方法里的synchronized到底需不需要呢……mongo既然本身就是一個線程安全的實例,mongoclient繼承了mongo,是不是也意味著不需要在初始化mongoclient時進行同步。

總結

以上是生活随笔為你收集整理的java连接mongodb_java连接mongodb源码解读的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。