mongodb接続プール
6117 ワード
一.mongodbの接続プール
ちょうど手に入れたMongoDB、応用をする時、以前使用した関係型データベースの影響を受けて、データベースの接続プールの問題を考慮することができます!
リレーショナル・データベースでは、接続プールとしてN個の接続(connection)を事前に確立し、接続プール(connection pool)を構築し、接続の削除や返却などの操作を行うことにほかならない.
MongoDBでは、まずinsertを例に、どのように操作するかを見てみましょう.
以前の経験を当てはめると、偏った考えになるかもしれませんが、公式文書の一言を引用するとおおらかになるかもしれません.
Note: The Mongo object instance actually represents a pool of connections to the database; you will only need one object of class Mongo even with multiple threads. See the concurrency doc page for more information.
The Mongo class is designed to be thread safe and shared among threads. Typically you create only 1 instance for a given DB cluster and use it across your app. If for some reason you decide to create many mongo intances, note that:
all resource usage limits (max connections, etc) apply per mongo instance
to dispose of an instance, make sure you call mongo.close() to clean up resources
mongoインスタンスはすでに既存の接続プールであり、スレッドは安全です.この内蔵の接続プールはデフォルトで10個の接続が初期化されており、各操作(削除・変更など)に1つの接続が取得され、操作を実行した後に接続が解放されます.
二.接続プールの重要なパラメータ
内蔵接続プールには、次のような複数の重要なパラメータがあります.
connectionsPerHost:ホストあたりの接続数threadsAllowedToBlockForConnectionMultiplier:スレッドキューの数です.上のconnectionsPerHost値に乗算した結果、スレッドキューの最大値になります.接続スレッドがキューにいっぱい並んでいると、「Out of semaphores to get db」エラーが投げ出されます.
maxWaitTime:最大接続待ちスレッドブロック時間接続タイムアウト:接続タイムアウトのミリ秒.0はデフォルトおよび無限です.
socketTimeout:socketタイムアウト.0はデフォルトおよび無限です.
AutoConnectRetry:この制御が1つの接続時にシステムが自動的に再試行するかどうか次のように設定されます.
三.接続プールの実践
ちょうど手に入れたMongoDB、応用をする時、以前使用した関係型データベースの影響を受けて、データベースの接続プールの問題を考慮することができます!
リレーショナル・データベースでは、接続プールとしてN個の接続(connection)を事前に確立し、接続プール(connection pool)を構築し、接続の削除や返却などの操作を行うことにほかならない.
MongoDBでは、まずinsertを例に、どのように操作するかを見てみましょう.
Mongo m =
new
Mongo(
"localhost"
,
27017
);
DB db = m.getDB(
"mydb"
);
//get collection
DBCollection coll = db.getCollection(
"testCollection"
)
//insert
BasicDBObject doc =
new
BasicDBObject();
...
coll.insert(doc);
[ ]
以前の経験を当てはめると、偏った考えになるかもしれませんが、公式文書の一言を引用するとおおらかになるかもしれません.
Note: The Mongo object instance actually represents a pool of connections to the database; you will only need one object of class Mongo even with multiple threads. See the concurrency doc page for more information.
The Mongo class is designed to be thread safe and shared among threads. Typically you create only 1 instance for a given DB cluster and use it across your app. If for some reason you decide to create many mongo intances, note that:
all resource usage limits (max connections, etc) apply per mongo instance
to dispose of an instance, make sure you call mongo.close() to clean up resources
mongoインスタンスはすでに既存の接続プールであり、スレッドは安全です.この内蔵の接続プールはデフォルトで10個の接続が初期化されており、各操作(削除・変更など)に1つの接続が取得され、操作を実行した後に接続が解放されます.
二.接続プールの重要なパラメータ
内蔵接続プールには、次のような複数の重要なパラメータがあります.
connectionsPerHost:ホストあたりの接続数threadsAllowedToBlockForConnectionMultiplier:スレッドキューの数です.上のconnectionsPerHost値に乗算した結果、スレッドキューの最大値になります.接続スレッドがキューにいっぱい並んでいると、「Out of semaphores to get db」エラーが投げ出されます.
maxWaitTime:最大接続待ちスレッドブロック時間接続タイムアウト:接続タイムアウトのミリ秒.0はデフォルトおよび無限です.
socketTimeout:socketタイムアウト.0はデフォルトおよび無限です.
AutoConnectRetry:この制御が1つの接続時にシステムが自動的に再試行するかどうか次のように設定されます.
MongoOptions opt = mongo.getMongoOptions();
opt.connectionsPerHost =
10
;
//poolsize
opt.threadsAllowedToBlockForConnectionMultiplier =
10
;
//
三.接続プールの実践
package
com.bts.dao.mongodb;
import
java.net.UnknownHostException;
import
com.bts.util.ConfTool;
import
com.mongodb.DB;
import
com.mongodb.Mongo;
import
com.mongodb.MongoException;
import
com.mongodb.MongoOptions;
/**
* @author huangfox
* @data 2012-4-1
* @email [email protected]
* @desc
*/
public
class
MongoManager {
private
static
Mongo mongo =
null
;
private
MongoManager() {
}
/**
* DB,
*
* @param dbName
* @return
*/
public
static
DB getDB(String dbName) {
if
(mongo ==
null
) {
//
init();
}
return
mongo.getDB(dbName);
}
/**
* , 。
*/
private
static
void
init() {
String confFilePath =
""
;
ConfTool conf =
new
ConfTool(confFilePath);
String host = conf.getValue(
"host"
);
//
int
port =
new
Integer(conf.getValue(
"port"
));
//
int
poolSize =
new
Integer(conf.getValue(
"poolSize"
));
//
int
blockSize =
new
Integer(conf.getValue(
"blockSize"
));
//
//
try
{
mongo =
new
Mongo(host, port);
MongoOptions opt = mongo.getMongoOptions();
opt.connectionsPerHost = poolSize;
opt.threadsAllowedToBlockForConnectionMultiplier = blockSize;
}
catch
(UnknownHostException e) {
// log error
}
catch
(MongoException e) {
// log error
}
}
}