LoginSignup
1
2

More than 5 years have passed since last update.

javaのMongoDriverを使ったときのread preference設定

Last updated at Posted at 2016-11-15

小ネタです。

バージョンは以下のような感じ。

pom.xml
<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が機能しなかったので、お気をつけください・・・

公式ドキュメント

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2