monogoDB java簡単記録
5761 ワード
1.データフォーマットは、前の自分が描いた図Mongodb-Javaドライバの基本的な流れを転送する。
ドライバ内で動作するのは、DBObject(ユーザから提供されたものとCommand形式に変更されたDBObject)、OutMessage(byte[]に変換してSocketに書き込むことができます)、Response、WriteResoult(ユーザが本当に取得した戻り値)です。
幾重にも重なって包装して,私は頭がくらくらするほどだ。
2.ログとDebug情報ログはJDK Loggingを採用しており、比較的重要な環境変数配置DB.TRACEがあり、trueに設定されている場合、logのログのログlevelが変更されます。私は汗をかきます。他の配置DEBUG.DBも何かを制御していると思っていましたが、後になって、この配置が全部呼び出されていません。歴史が残っているはずです。
MONGO-TARACKLEAKS-SimplePoolの中の設定もあります。同じ接続池DEBUG.MONGO DEBUG.DBPOINTER—廃棄したクラスです。そのまま無視してください。common.mongodb.cleaner IntervalMS—定期ポーリングDBインスタンス、db.cleanCurors(true)を実行します。
3.絶対に使わない種類のcommon.mongodb.util.TestCaseとcommon.mongodb.utill.TestNGListenerはピット父類に属しています。TestNGに依存していますが、testフォルダには置いていません。MyAspsertsもどこにも行かないです。
4.対象のプログレッシブ/アンチプログレッシブのルールが面白いのは、内蔵されているJsonプログレッシブ/アンチプログレッシブ類で、いくつかのタイプのマッピングに関する規則(プログレッシブコードはJSon類、逆シーケンスのコードはJSONCallback)を説明しました。タイムゾーンのデータを保存しません!DBREfBase-{$ref:"集合名"、$id:具体的なIDの値}Pattern-{$regex:"正規表現の原型"、$options:"表現のflags"}、BSOnTimestamp-{$ts:具体的な時間、$inc:具体的なミリ秒数}UUID-'{uuid:"$scope:具体的な値-{$code:具体的な値}MinKey-{$minKey:1}間違いなく、1 MaxKeyに固定されています。
そして、本当にDBObjectをbyte[]に変換するクラスは、org.bson.BaicBSONSEncersであり、重要なコードの一部を抜粋する:
特にTimestampに対して最適化していません。父の種類のjava.util.Dateで処理します。そしてBSOnTimestampは内部のみ使用します。
5.接続池の実現SimplePoolは、対象プールであり、DBPortPoolの基礎であるMongodbの内部データベース接続池でもあります。synchronizedを使って実現します。
6.内蔵されているJavaオブジェクト—DBObjectマッピングはドライバのソースコードを見ていない前に、ずっとこの方面のサポートがないと思っていましたが、実はもう一つあります。それはReflectionDBObjectです。使い方の簡単な紹介です。
ドライバ内で動作するのは、DBObject(ユーザから提供されたものとCommand形式に変更されたDBObject)、OutMessage(byte[]に変換してSocketに書き込むことができます)、Response、WriteResoult(ユーザが本当に取得した戻り値)です。
幾重にも重なって包装して,私は頭がくらくらするほどだ。
2.ログとDebug情報ログはJDK Loggingを採用しており、比較的重要な環境変数配置DB.TRACEがあり、trueに設定されている場合、logのログのログlevelが変更されます。私は汗をかきます。他の配置DEBUG.DBも何かを制御していると思っていましたが、後になって、この配置が全部呼び出されていません。歴史が残っているはずです。
MONGO-TARACKLEAKS-SimplePoolの中の設定もあります。同じ接続池DEBUG.MONGO DEBUG.DBPOINTER—廃棄したクラスです。そのまま無視してください。common.mongodb.cleaner IntervalMS—定期ポーリングDBインスタンス、db.cleanCurors(true)を実行します。
3.絶対に使わない種類のcommon.mongodb.util.TestCaseとcommon.mongodb.utill.TestNGListenerはピット父類に属しています。TestNGに依存していますが、testフォルダには置いていません。MyAspsertsもどこにも行かないです。
4.対象のプログレッシブ/アンチプログレッシブのルールが面白いのは、内蔵されているJsonプログレッシブ/アンチプログレッシブ類で、いくつかのタイプのマッピングに関する規則(プログレッシブコードはJSon類、逆シーケンスのコードはJSONCallback)を説明しました。タイムゾーンのデータを保存しません!DBREfBase-{$ref:"集合名"、$id:具体的なIDの値}Pattern-{$regex:"正規表現の原型"、$options:"表現のflags"}、BSOnTimestamp-{$ts:具体的な時間、$inc:具体的なミリ秒数}UUID-'{uuid:"$scope:具体的な値-{$code:具体的な値}MinKey-{$minKey:1}間違いなく、1 MaxKeyに固定されています。
そして、本当にDBObjectをbyte[]に変換するクラスは、org.bson.BaicBSONSEncersであり、重要なコードの一部を抜粋する:
if ( name.equals( "_transientFields" ) ) // ,
return;
if ( DEBUG ) System.out.println( "\t put thing : " + name ); // syso,
if ( name.equals( "$where") && val instanceof String ){ // ?
_put( CODE , name );
_putValueString( val.toString() );
return;
}
val = BSON.applyEncodingHooks( val );
if ( val == null )
putNull(name);
else if ( val instanceof Date )
putDate( name , (Date)val );
else if ( val instanceof Number )
putNumber(name, (Number)val );
else if ( val instanceof Character )
putString(name, val.toString() );
else if ( val instanceof String )
putString(name, val.toString() );
else if ( val instanceof ObjectId )
putObjectId(name, (ObjectId)val );
else if ( val instanceof BSONObject )
putObject(name, (BSONObject)val );
else if ( val instanceof Boolean )
putBoolean(name, (Boolean)val );
else if ( val instanceof Pattern )
putPattern(name, (Pattern)val );
else if ( val instanceof Map )
putMap( name , (Map)val );
else if ( val instanceof Iterable)
putIterable( name , (Iterable)val );
else if ( val instanceof byte[] )
putBinary( name , (byte[])val );
else if ( val instanceof Binary )
putBinary( name , (Binary)val );
else if ( val instanceof UUID )
putUUID( name , (UUID)val );
else if ( val.getClass().isArray() )
putArray( name , val );
else if (val instanceof Symbol) { // , Json , String
putSymbol(name, (Symbol) val);
}
else if (val instanceof BSONTimestamp) {
putTimestamp( name , (BSONTimestamp)val );
}
else if (val instanceof CodeWScope) {
putCodeWScope( name , (CodeWScope)val );
}
else if (val instanceof Code) {
putCode( name , (Code)val );
}
else if (val instanceof DBRefBase) {
BSONObject temp = new BasicBSONObject();
temp.put("$ref", ((DBRefBase)val).getRef());
temp.put("$id", ((DBRefBase)val).getId());
putObject( name, temp );
}
else if ( val instanceof MinKey )
putMinKey( name );
else if ( val instanceof MaxKey )
putMaxKey( name );
else if ( putSpecial( name , val ) ){
// no-op
}
else {
// ?
throw new IllegalArgumentException( "can't serialize " + val.getClass() );
}
特にTimestampに対して最適化していません。父の種類のjava.util.Dateで処理します。そしてBSOnTimestampは内部のみ使用します。
5.接続池の実現SimplePoolは、対象プールであり、DBPortPoolの基礎であるMongodbの内部データベース接続池でもあります。synchronizedを使って実現します。
6.内蔵されているJavaオブジェクト—DBObjectマッピングはドライバのソースコードを見ていない前に、ずっとこの方面のサポートがないと思っていましたが、実はもう一つあります。それはReflectionDBObjectです。使い方の簡単な紹介です。
public class TestReflectionDBObject {
public static void main(String[] args) throws Throwable {
Mongo mongo = new Mongo();
DB db = mongo.getDB("wendal_test");
Person p = new Person();
p.setId(UUID.randomUUID());
p.setName("wendal");
DBCollection ps = db.getCollection("person");
ps.insert(p);
ps.setObjectClass(Person.class); // DBObject
Person p_db = (Person) ps.findOne();
Assert.assertEquals("wendal", p_db.getName());
System.out.println(Json.toJson(p_db));
mongo.close();
}
public static class Person extends ReflectionDBObject { // ,
private UUID id;
private String name; // getter/setter
}
}