Heim  >  Artikel  >  Java  >  Was ist ein Abfragecache? Einführung in die Verwendung des MyBatis-Abfragecaches

Was ist ein Abfragecache? Einführung in die Verwendung des MyBatis-Abfragecaches

零下一度
零下一度Original
2017-06-25 10:56:072363Durchsuche

Bitte geben Sie die Quelle für den Nachdruck an:

Wie bereits erwähnt: Spring+SpringMVC+MyBatis ausführliches Lernen und Aufbau (7) – MyBatis verzögertes Laden

1. Was ist der Abfrage-Cache?

mybatis bietet Abfrage-Caching, um den Datenbankdruck zu reduzieren und die Datenbankleistung zu verbessern.

mybatis bietet First-Level-Cache und Second-Level-Cache.

Der Cache der ersten Ebene ist der Cache der SqlSession-Ebene. Beim Betrieb der Datenbank müssen Sie ein sqlSession-Objekt erstellen. Das Objekt enthält eine Datenstruktur (HashMap) zum Speichern von Cache-Daten. Die Cache-Datenbereiche (HashMap) zwischen verschiedenen sqlSession beeinflussen sich gegenseitig nicht.

Der Cache der zweiten Ebene ist ein Cache auf Mapper-Ebene. Mehrere SQL-Anweisungen können den Cache der zweiten Ebene gemeinsam nutzen.

Warum Caching verwenden?

Wenn sich Daten im Cache befinden, müssen diese nicht aus der Datenbank abgerufen werden, was die Systemleistung erheblich verbessert.

2. Level 1 Cache

2.1 Funktionsprinzip des Level 1 Cache

Abfrage nach Benutzerinformationen mit Benutzer-ID 1 für starten Finden Sie beim ersten Mal heraus, ob Benutzerinformationen mit der ID 1 im Cache vorhanden sind. Wenn nicht, fragen Sie die Benutzerinformationen aus der Datenbank ab.

Benutzerinformationen abrufen und Benutzerinformationen im Cache der ersten Ebene speichern.

Wenn sqlSession einen Festschreibungsvorgang durchführt (Einfügen, Aktualisieren, Löschen), leeren Sie den Cache der ersten Ebene in sqlSession. Der Zweck besteht darin, die neuesten Informationen im Cache zu speichern und fehlerhafte Lesevorgänge zu vermeiden.

Wenn es zum zweiten Mal gesendet wird, um die Benutzerinformationen mit der Benutzer-ID 1 abzufragen, ermitteln Sie zunächst, ob sich Benutzerinformationen mit der ID 1 im Cache befinden, und rufen Sie die Benutzerinformationen direkt ab der Cache.

2.2 Level-1-Cache-Test

Mybatis unterstützt standardmäßig Level-1-Cache und muss nicht in der Konfigurationsdatei konfiguriert werden.

Befolgen Sie zum Testen die oben genannten Schritte zum Cache-Prinzip der ersten Ebene.

    @Testpublic void testCache1() throws Exception{
        SqlSession sqlSession=sqlSessionFactory.openSession();
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);//下边查询使用一个SqlSession//第一次发起请求,查询id为1的用户User user1=userMapper.findUserById(1);
        System.out.println(user1);        //如果sqlSession去执行commit操作(执行插入、更新、删除),清空sqlSession中的一级缓存,//这样做的目的是为了让缓存中存储的是最新的信息,避免脏读。//更新user1的信息user1.setUsername("测试用户22");
        userMapper.updateUser(user1);//执行commit操作去清空缓存        sqlSession.commit();        //第二次发起请求,查询id为1的用户User user2=userMapper.findUserById(1);
        System.out.println(user2);

        sqlSession.close();
    }

2.3 Level-1-Cache-Anwendung

wurde offiziell durch die Integration von Mybatis und Spring entwickelt und die Transaktionskontrolle ist in Betrieb.

Eine Servicemethode umfasst viele Mapper-Methodenaufrufe.

service{

// Beim Starten der Ausführung eine Transaktion starten und ein SqlSession-Objekt erstellen

// Die Mapper-Methode findUserById(1) zum ersten Mal aufrufen

// Rufen Sie die Mapper-Methode findUserById(1) zum zweiten Mal auf, um Daten aus dem Cache der ersten Ebene abzurufen

// Die Methode endet und sqlSession wird geschlossen

}

Wenn Sie zwei Dienstaufrufe ausführen, um dieselben Benutzerinformationen abzufragen, wird der Cache der ersten Ebene nicht verwendet. Da die Sitzungsmethode endet, wird die sqlSession geschlossen und die erste Ebene Der Cache wird geleert.

3. Second-Level-Cache

3.1 Second-Level-Cache-Prinzip

Aktivieren Sie zunächst den Second-Level-Cache von mybatis.

sqlSession1 fragt die Benutzerinformationen mit der Benutzer-ID 1 ab. Nach der Abfrage der Benutzerinformationen wird bedauert, dass die Abfragedaten im Cache der zweiten Ebene gespeichert werden.

Wenn sqlSession3 SQL unter demselben Mapper ausführt und die Commit-Übermittlung ausführt, werden die Daten im Cache-Bereich der zweiten Ebene unter dem Mapper gelöscht.

sqlSession2 fragt die Benutzerinformationen mit Benutzer-ID 1 ab, prüft, ob Daten im Cache vorhanden sind, und ruft die Daten in diesem Fall direkt aus dem Cache ab.

Der Unterschied zwischen dem Second-Level-Cache und dem First-Level-Cache: Der Umfang des Second-Level-Cache ist größer und mehrere sqlSession können den Second-Level-Cache-Bereich eines UserMappers gemeinsam nutzen. UserMapper verfügt über einen Cache-Bereich der zweiten Ebene (unterteilt durch Namespace), und andere Mapper verfügen ebenfalls über eigene Cache-Bereiche der zweiten Ebene (unterteilt durch Namespace).

Jeder Namespace-Mapper verfügt über einen Cache-Bereich der zweiten Ebene. Wenn die Namespaces zweier Mapper gleich sind, werden die von den beiden Mappern beim Ausführen von SQL-Abfragen erhaltenen Daten im selben Cache-Bereich der zweiten Ebene gespeichert.

3.2 Aktivieren Sie den Second-Level-Cache

Der Second-Level-Cache von Mybatis ist Mapper-Scope-Level. Zusätzlich zum Festlegen des Hauptschalters des Second-Level-Caches in SqlMapConfig.xml muss dies geschehen auch im spezifischen Mapper.xml Level 2-Cache aktiviert werden.

Fügen Sie in der Kernkonfigurationsdatei SqlMapConfig.xml Folgendes hinzu:

<setting name="cacheEnabled" value="true"/>

Beschreibung

 

描述

允许值

默认值

cacheEnabled

对在此配置文件下的所有cache 进行全局性开/关设置。

true false

true

Zulässige Werte

Standardwert

cacheEnabled

Nehmen Sie globale Ein-/Aus-Einstellungen für alle Caches unter dieser Konfigurationsdatei vor.

true false

true

在UserMapper.xml中开启二级缓存,UserMapper.xml下的sql执行完成后存储在它的缓存区域(HashMap)。

3.3调用pojo类实现序列化接口

为了将缓存数据取出执行反序列划操作,因为二级缓存数据存储介质多种多样,不一定在内存。可能在硬盘、远程等。

3.4测试方法

    @Testpublic void testCache2() throws Exception{
        SqlSession sqlSession1=sqlSessionFactory.openSession();
        SqlSession sqlSession2=sqlSessionFactory.openSession();
        SqlSession sqlSession3=sqlSessionFactory.openSession();
        
        UserMapper userMapper1=sqlSession1.getMapper(UserMapper.class);
        UserMapper userMapper2=sqlSession2.getMapper(UserMapper.class);
        UserMapper userMapper3=sqlSession3.getMapper(UserMapper.class);        //第一次发起请求,查询id为1的用户User user1=userMapper1.findUserById(1);
        System.out.println(user1);//这里执行关闭操作,将sqlSession中的数据写到二级缓存区域        sqlSession1.close();        //使用sqlSession3执行commit()操作User user=userMapper3.findUserById(1);
        user1.setUsername("Joanna");
        userMapper3.updateUser(user);//执行提交,清空UserMapper下边的二级缓存        sqlSession3.commit();
        sqlSession3.close();        //第二次发起请求,查询id为1的用户User user2=userMapper2.findUserById(1);
        System.out.println(user2);
        sqlSession2.close();
    }

3.5禁用二级缓存

在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql,默认情况是true,即该sql使用二级缓存。