(B)ロードMyBatisの遅延、キャッシュ、L2キャッシュ

遅延読み込みの設定:

遅延をロードすると?例えば、授業や学生の表は、多くの関係は、あなただけの情報のクラスの生徒を必要とせずに、クラスに関する情報が必要な場合がありますがあり、この時間は、学生のニーズた後、最初のクエリは、情報クラスを照会するときように設定することができます時間情報、不要なクエリを回避するために、クエリ。

次の設定を行います。ここでは多くの人にとって、他の関係と同様の例、のために:

PersonMapping.xml

    < 選択 ID = " selectPersonByClassId "このresultMap = " class_person_map " ParameterTypeが= " INT " >
         セレクト * から クラス  CLASSID = #{ID}
     </ 選択 > 
    <このresultMapのID = " class_person_map "タイプ= " クラス" > 
        <idカラム= " CLASSID "プロパティ= " CLASSID " />
        <resultプロパティ=" 番号"欄= " " /> 
        <コレクションプロパティは、= " 人物" ofType = " "  を選択 = " mappers.ClassMapper.queryPersonByClassId "列を= " CLASSID " > 
        </コレクション> 
    </このresultMap>

私たちのマッピング、マッピングのみクラスIDとクラス情報ナンバー2が、そこにはマッピング学生の情報はありませんが、<cllection>、タグの属性によって構成されていることに注意してください

選択:人物必要な属性IDは、クエリに対応するSQL文の選択値を行った場合(mappers.ClassMapper、XML)

コラム:SQL文を実行し、着信パラメータ

mappers.ClassMapper.xml

クラスの生徒の情報を必要とする場合、以下のように、あなたは、select属性のクエリで指定したIDのいずれかからSQLステートメントを見つけます

    < 選択 ID = " queryPersonByClassId " ParameterTypeが= " INT " resultTypeと= " " >
         選択を * からCLASSID = #{CLASSID}
     </ 選択 >

ブレークポイントデバッグを設定した後にのみClass.getPersonsを呼び出す()メソッドは、SQL文のクエリの学生を実行します見ることができます。

キャッシュ:

SQLSESSIONオブジェクトを介してデータへのクエリは、MyBatisのは再びSQLSESSIONクエリへのデータのうち、データの次の時間になります場合は、SQLSESSIONから直接データを取得します、あなたは自動的に、データベースクエリと対話する必要はありません。しかし、2番目のクエリに注意を払っても、同じSQLSESSIONの下に行われなければなりません。

二次キャッシュ:

建てMyBatisの:

次いでSQLSESSIONオブジェクトを介してだけでなく、二次キャッシュに配置されますキャッシュにデータを上記のクエリ。ときに異なるSQLSESSIONオブジェクトを通してあなた次回クエリ同じデータを二次キャッシュの中から取られますが、SQLSESSIONのmapper.classは、同じクエリから来ます。

総Laiyueliangjuの言葉:SQLSESSIONとキャッシュ、二次キャッシュと同じmapper.classの初期化、判断に基づいてキャッシュにするかどうか、同じ名前空間、。

オープン構成:

config.xmlに:

<設定名= " cacheEnabled "値= " " />

フォルダ、XML

<キャッシュ/>

さらに、二次キャッシュはデータのシーケンスであり、二次キャッシュオブジェクトは、オープンインタフェースジョブシーケンスを継承する必要があります。これは、ハードディスクからメモリに配置されたデータをシリアル化することです。

すなわち、指定されたクラスmapper.xmlに対応するプラス

Serializableを実装

そして、マッパークラスまたは属性のカスケード、または連結属性の他のタイプを継承する他のクラスに対応した電流が直列化されなければなりません。

3の配列に相当する本クラスは、親クラスは、カスケード属性  

レベルキャッシュ、二次キャッシュキャッシュする場合:

限りクエリキャッシュは、それらにリアルタイムの同等をキャッシュするように、

二次キャッシュはSQLSESSIONが照会二次キャッシュに入れsqlsession.close()した後にのみです。

例:

        //加载配置信息
        Reader reader = Resources.getResourceAsReader("config.xml");
        //connection
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
     //第一个sqlsession SqlSession sqlSession
= sessionFactory.openSession(); PersonMapping personMapping = sqlSession.getMapper(PersonMapping.class); personMapping.selectPersonById(2); System.out.println("---"); sqlSession.close();
     //第二个sqlsession SqlSession sqlSession2
= sessionFactory.openSession(); PersonMapping personMapping2 = sqlSession2.getMapper(PersonMapping.class); personMapping2.selectPersonById(2); sqlSession2.close();

执行后,查看日志可以看到只执行了一条sql语句,PersonMapping.class共享同一个二级缓存

清理缓存:commit()会清除缓存(一级二级都是的),另外注意这个commit()不能是查询自身的commit,即这个commit所属于的sqlsession对象必须是执行了增删改的sqlsession。

 

 

おすすめ

転載: www.cnblogs.com/eenio/p/11329269.html