小ネタです。
バージョンは以下のような感じ。
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>
おことわり
以下全ての例について、MongoDB接続先はこのように定義済みであるものとします。
//初号機(primary)
String ip_pri = "hogehoge";
//弐号機(secondary)
String ip_sec = "fugafuga";
//共通
int port = 27017;
ServerAddress pri = new ServerAddress(ip_pri, port);
ServerAddress sec = new ServerAddress(ip_sec, port);
List<ServerAddress> addressList = new ArrayList<>(Arrays.asList(pri, sec));
概要
MongoDBのレプリカセットを構築している場合、データの読み出し元について規定するのがread preferenceです。
(詳しくは→ http://qiita.com/y13i/items/78c9f45acd07a9478d2d#read-preference )
これをJavaのMongoDBDriverを使用して実装する際どうするかというと、接続先のMongoDBのコレクションを指定するときに一緒にくっつけます。
順番的には
- MongoCliantインスタンス作成
- 接続先データベース指定
- データベースの中の接続先コレクション(テーブル)指定←ここ
になります。
MongoCollectionクラスにwithReadPreference()
APIがあるので、以下のように記述すればOK。
String dbname = "dbname";
String collname = "collname";
MongoClient cliant = new MongoClient(addressList);
MongoDatabase database = cliant.getDatabase(dbname);
MongoCollection<Document> coll = db.getCollection(collname).withReadPreference(ReadPreference.secondary());
ちなみに
MongoDatabaseクラスにも全く同じAPIがあるので、そちらを使ってもよいです。どちらも同じように動作します。違いはよく調べてません。すみません・・・
MongoClient cliant = new MongoClient(addressList);
MongoDatabase database = cliant.getDatabase(dbname).withReadPreference(ReadPreference.secondary());
MongoCollection<Document> coll = db.getCollection(collname);
(12/1追記)第3の選択肢について
なんかビールみたいだな
上記の他に、もう一つread preference設定ができる方法がありました。
MongoCliantインスタンスを作成する時に、MongoCliantOptionsのAPIからread preferenceを呼び出すこともできます。
MongoCliantOptions option = MongoClientOptions.builder().readPreference(ReadPreference.secondary()).build();
MongoClient cliant = new MongoClient(addressList, option);
MongoDatabase database = cliant.getDatabase(dbname);
MongoCollection<Document> coll = db.getCollection(collname);
しかし長い・・・
MongoClient cliant = new MongoClient(addressList);
cliant.setReadPreference(ReadPreference.secondary());
公式には上記の書き方が載っていますが、これだとvar3.3以降では非推奨になっているだけでなく、以前であっても(少なくとも自分の環境では)ReadPreferenceが機能しなかったので、お気をつけください・・・