Java >> Java tutorial >  >> Tag >> mybatis

Faldgruberne i MyBatis-caches med Apache Ignite

For en uge siden annoncerede MyBatis og Apache ignite om støtte til apache ignite som en MyBatis-cache (L2-cache).

teknisk set understøtter MyBatis to niveauer af caches:

  1. Lokal cache, som altid er aktiveret som standard
  2. L2-cache, valgfri

Da Apache Ignite-projektet er hurtigt voksende med dets forskellige funktionalitet, vil vi i dette blogindlæg undersøge MyBatis-understøttelsen i nogle detaljer.

Cachen på andet niveau gemmer enhedsdataene, men IKKE selve entiteterne eller objekterne. Dataene gemmes i et "serialiseret" format, der ligner et hash-kort, hvor nøglen er entitets-id, og værdien er en liste over primitive værdier.

Her er et eksempel på, hvordan cache-posterne ser ud i Apache ignite:


Hvor:

  • Cachenøgle :
    CacheKey [idHash=1499858, hash=2019660929, checksum=800710994, count=6, multiplier=37, hashcode=2019660929, updateList=[com.blu.ignite.mapper.UserMapper.getUserObject, 0, 2147483647, SELECT * FROM all_objects t where t.OBJECT_TYPE='TABLE' and t.object_name=?, USERS, SqlSessionFactoryBean]]
  • Værdiklasse :java.util.ArrayList
  • Cacheværdi :
    [UserObject [idHash=243119413, hash=1658511469, owner=C##DONOTDELETE, object_type=TABLE, object_id=94087, created=Mon Feb 15 13:59:41 MSK 2016, object_name=USERS]]

Som for eksempel valgte jeg 'all_objects'-objekterne og følgende forespørgsel fra Oracle-databasen

SELECT count(*) FROM all_objects;

SELECT * FROM all_objects t where t.OBJECT_TYPE='TABLE' and t.object_name='EMP';

SELECT * FROM all_objects t where t.OBJECT_TYPE='TABLE';

I mit tilfælde er denne givne forespørgselsudførelsestid ~660 ms i gennemsnit.

SELECT count(*) FROM all_objects;

Og den næste udførelsestid for forespørgsler er mere end 700 ms:

SELECT t.object_type, count(*) FROM all_objects t group by t.OBJECT_TYPE;

lad os tilføje apache ignite som en cache på andet niveau og undersøge resultatet. Hvis du vil vide, hvordan du installerer og konfigurerer apache ignite med fjeder og myBatis, så se venligst mit tidligere blogindlæg. Desuden er al kilden du kan finde i github repositories.

Lad os som en hurtig start tilføje myBatis maven-afhængighed i projektet.

<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ignite</artifactId>
    <version>1.0.0-beta1</version>
</dependency>

Derefter skal du blot angive det i mapper XML som følger

<mapper namespace="com.blu.ignite.mapper.UserMapper">

    <cache type="org.mybatis.caches.ignite.IgniteCacheAdapter" />

    <select id="getUserObject" parameterType="String" resultType="com.blu.ignite.dto.UserObject" useCache="true">
        SELECT * FROM all_objects t where t.OBJECT_TYPE='TABLE' and t.object_name=#{objectName}
    </select>
    <select id="getAllObjectsTypeByGroup" parameterType="String" resultType="com.blu.ignite.dto.UobjectGroupBy" useCache="true">
        SELECT t.object_type, count(*) as cnt FROM all_objects t group by t.OBJECT_TYPE
    </select>

    <select id="allObjectCount" parameterType="String" resultType="String" useCache="true">
        SELECT count(*) FROM all_objects
    </select>
</mapper>

Jeg har også følgende java-mapper:

public interface UserMapper {
    User getUser( String id);
    List getUniqueJob();
    UserObject getUserObject(String objectName);
    String allObjectCount();
    List getAllObjectsTypeByGroup();
}

og webtjenesten som følger:

@WebService(name = "BusinessRulesServices",
        serviceName="BusinessRulesServices",
        targetNamespace = "http://com.blu.rules/services")
public class WebServices {
    private UserServices userServices;

    @WebMethod(operationName = "getUserName")
    public String getUserName(String userId){
        User user = userServices.getUser(userId);
        return user.getuName();
    }
    @WebMethod(operationName = "getUserObject")
    public UserObject getUserObject(String objectName){
        return userServices.getUserObject(objectName);
    }
    @WebMethod(operationName = "getUniqueJobs")
    public List getUniqueJobs(){
        return userServices.getUniqueJobs();
    }
    @WebMethod(exclude = true)
    public void setDao(UserServices userServices){
        this.userServices = userServices;
    }
    @WebMethod(operationName = "allObjectCount")
    public String allObjectCount(){
        return userServices.allObjectCount();
    }
    @WebMethod(operationName = "getAllObjectsTypeCntByGroup")
    public List getAllObjectsTypeCntByGroup(){
        return userServices.getAllObjectCntbyGroup();
    }

}

Hvis jeg vil påberåbe webmetoden 'getAllObjectsTypeCntByGroup' i soupUI, vil den første gang få meget høj responstid, cirka 1700 ms, fordi resultatet ikke er i cachen. Fra anden gang vil responstiden være ~4 til ~5 ms.

Invoke web-metoden første gang vil se sådan ud:


Responstid for anden eller senere påberåbelse af webmetoden


I apache vil ignite cache-indtastning se ud som følger:

  • Cachenøgle :
    CacheKey [idHash=46158416, hash=1558187086, checksum=2921583030, count=5, multiplier=37, hashcode=1558187086, updateList=[com.blu.ignite.mapper.UserMapper.getAllObjectsTypeByGroup, 0, 2147483647, SELECT t.object_type, count(*) as cnt FROM all_objects t group by t.OBJECT_TYPE, SqlSessionFactoryBean]]
  • Værdiklasse :java.util.ArrayList
  • Cacheværdi :
     [UobjectGroupBy [idHash=2103707742, hash=1378996400, cnt=1, object_type=EDITION], UobjectGroupBy [idHash=333378159, hash=872886462, cnt=444, object_type=INDEX PARTITION], UobjectGroupBy [idHash=756814918, hash=1462794064, cnt=32, object_type=TABLE SUBPARTITION], UobjectGroupBy [idHash=931078572, hash=953621437, cnt=2, object_type=CONSUMER GROUP], UobjectGroupBy [idHash=1778706917, hash=1681913927, cnt=256, object_type=SEQUENCE], UobjectGroupBy [idHash=246231872, hash=1764800190, cnt=519, object_type=TABLE PARTITION], UobjectGroupBy [idHash=1138665719, hash=1030673983, cnt=4, object_type=SCHEDULE], UobjectGroupBy [idHash=232948577, hash=1038362844, cnt=1, object_type=RULE], UobjectGroupBy [idHash=1080301817, hash=646054631, cnt=310, object_type=JAVA DATA], UobjectGroupBy [idHash=657724550, hash=1248576975, cnt=201, object_type=PROCEDURE], UobjectGroupBy [idHash=295410055, hash=33504659, cnt=54, object_type=OPERATOR], UobjectGroupBy [idHash=150727006, hash=499210168, cnt=2, object_type=DESTINATION], UobjectGroupBy [idHash=1865360077, hash=727903197, cnt=9, object_type=WINDOW], UobjectGroupBy [idHash=582342926, hash=1060308675, cnt=4, object_type=SCHEDULER GROUP], UobjectGroupBy [idHash=1968399647, hash=1205380883, cnt=1306, object_type=PACKAGE], UobjectGroupBy [idHash=1495061270, hash=1345537223, cnt=1245, object_type=PACKAGE BODY], UobjectGroupBy [idHash=1328790450, hash=1823695135, cnt=228, object_type=LIBRARY], UobjectGroupBy [idHash=1128429299, hash=1267824468, cnt=10, object_type=PROGRAM], UobjectGroupBy [idHash=760711193, hash=1240703242, cnt=17, object_type=RULE SET], UobjectGroupBy [idHash=317487814, hash=61657487, cnt=10, object_type=CONTEXT], UobjectGroupBy [idHash=1079028994, hash=1960895356, cnt=229, object_type=TYPE BODY], UobjectGroupBy [idHash=276147733, hash=873140579, cnt=44, object_type=XML SCHEMA], UobjectGroupBy [idHash=24378178, hash=1621363993, cnt=1014, object_type=JAVA RESOURCE], UobjectGroupBy [idHash=1891142624, hash=90282027, cnt=10, object_type=DIRECTORY], UobjectGroupBy [idHash=902107208, hash=1995006200, cnt=593, object_type=TRIGGER], UobjectGroupBy [idHash=142411235, hash=444983119, cnt=14, object_type=JOB CLASS], UobjectGroupBy [idHash=373966405, hash=1518992835, cnt=3494, object_type=INDEX], UobjectGroupBy [idHash=580466919, hash=1394644601, cnt=2422, object_type=TABLE], UobjectGroupBy [idHash=1061370796, hash=1861472837, cnt=37082, object_type=SYNONYM], UobjectGroupBy [idHash=1609659322, hash=1543110475, cnt=6487, object_type=VIEW], UobjectGroupBy [idHash=458063471, hash=1317758482, cnt=346, object_type=FUNCTION], UobjectGroupBy [idHash=1886921697, hash=424653540, cnt=7, object_type=INDEXTYPE], UobjectGroupBy [idHash=1455482905, hash=1776171634, cnt=30816, object_type=JAVA CLASS], UobjectGroupBy [idHash=49819096, hash=2110362533, cnt=2, object_type=JAVA SOURCE], UobjectGroupBy [idHash=1916179950, hash=1760023032, cnt=10, object_type=CLUSTER], UobjectGroupBy [idHash=1138808674, hash=215713426, cnt=2536, object_type=TYPE], UobjectGroupBy [idHash=305229607, hash=340664529, cnt=23, object_type=JOB], UobjectGroupBy [idHash=1365509716, hash=623631686, cnt=12, object_type=EVALUATION CONTEXT]]

Konklusion

Dyr databasedrift kan reduceres ved at bruge L2-cache, korrekt brug af L2-cache i MyBatis kan øge applikationens ydeevne fra 10 til 20 gange. Apache Ignite i hukommelsesdatagitteret er en meget velegnet kandidat til dette formål. Du kan bestemt også bruge Hazelcash, EhCache eller andre Caching-værktøjer.

No
Java tag