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であり、重要なコードの一部を抜粋する:
  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
    }
}