• Atitit mybatis缓存遇到的问题与解决 1.1. 只有getobj 没有执行putobject 1 1.2. 默认所有的select要读取缓存怎么办。。执行过滤 可以自己定义个白名单。


    Atitit mybatis缓存遇到的问题与解决

    1.1. 只有getobj  没有执行putobject 1

    1.2. 默认所有的select要读取缓存怎么办。。执行过滤 可以自己定义个白名单。 2

    1.3. 默认namespace up del操作清空缓存,做了拦截不让他自动清空,不让缓存失效。使用时间到期清空模式 3

    2. 缓存内容与执行顺序不对 增加synchronized 锁定 3

    2.1. 可能没有走缓存,导致curkey还是上次的。每次putclr curkey put增加sync锁,保证走完 3

    2.2. 每次getxx执行前去除curkey thredlocal遍量 3

    2.3. 增加keytag 教研校验   这个额 keytag mybati配置文件里面的 nanespace.sqlid 4

    1.1. 只有getobj  没有执行putobject

    估计是因为没有提交,所以还没有putobj  ,应该会自己putobj的,如果不能,那么需要自己在业务里面增加

    可能是spring了但是却取消了事务模式。。所以没有提交

     //ati set cache       

              new MybatisRedisCache().putObjectByThrdlocalCurKey( uMap);

              //end set cache finish

     

    public void putObjectByThrdlocalCurKey(Object uMap) {

       Object curkey=   MybatisRedisCache.curkey.get();

       putObject(curkey,uMap);

    }

     

     

     

     

     public static ThreadLocal<Object>  curkey;

        // 获取员工编号和姓名

            Map uMap = getOperation(map);

            //ati set cache

              Object curkey=   MybatisRedisCache.curkey.get();

              new MybatisRedisCache().putObject(curkey, uMap);

     

     

    1.2. 默认所有的select要读取缓存怎么办。。执行过滤 可以自己定义个白名单。

    白名单机制,不然每个select都要默认走,,要一个个加麻烦。。Usecache=false麻烦  还有黑名单机制

     

        @Override

        public void putObject(Object key, Object value) {

     //   Object curkey=   MybatisRedisCache.curkey.get();

       String string_curkey = key.toString().toLowerCase();

    if(string_curkey.contains("tmp") || string_curkey.contains("temp") || string_curkey.contains("count") || string_curkey.contains("insert") || string_curkey.contains("update") || string_curkey.contains("delete") || string_curkey.contains("drop") || string_curkey.contains("exist"))

       return;

        try {

         logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject key:" + key + "        ,val:" + value);

         if(key==null)return;

          Jedis Jedis1=  createReids();

          byte[] serialize_key = SerializeUtil_prjcli_pkgcache.serialize(key.toString());

    Jedis1.set(serialize_key, SerializeUtil_prjcli_pkgcache.serialize(value));

          Jedis1.expire(serialize_key, 300);  //def 5min

    } catch (Exception e) {

    logger.error(" mybatisredis cache.putObject ", e);

    e.printStackTrace();

    }

           

    }

     

     

     

    public void putObjectByThrdlocalCurKey(Object uMap) {

        

       Object curkey=   MybatisRedisCache.curkey.get();

       String string_curkey = curkey.toString().toLowerCase();

    if(string_curkey.contains("tmp") || string_curkey.contains("temp") || string_curkey.contains("count") || string_curkey.contains("insert") || string_curkey.contains("update") || string_curkey.contains("delete") || string_curkey.contains("drop") || string_curkey.contains("exist"))

       return;

       byte[] key2 = SerializeUtil_prjcli_pkgcache.serialize(string_curkey);

       Jedis Jedis1=  createReids();

       if(!Jedis1.exists(key2))

       putObject(curkey,uMap);

    1.3. 默认namespace up del操作清空缓存,做了拦截不让他自动清空,不让缓存失效。使用时间到期清空模式

    2.  缓存内容与执行顺序不对 增加synchronized 锁定

    2.1. 可能没有走缓存,导致curkey还是上次的。每次putclr curkey put增加sync锁,保证走完

    2.2. 每次getxx执行前去除curkey thredlocal遍量

    MybatisRedisCache.curkey.set(null);

     

     

       synchronized (CliSendAdviceBo.class) {

            MybatisRedisCache.curkey.set(null);

                 m = getBCK01A(map);  //  cache

                  //ati set cache       

            

    Object key=MybatisRedisCache.curkey.get();

                    new MybatisRedisCache().putObjectByThrdlocalCurKey_AsynProxy("getBCK01A",m);

                    //end set cache finish

    }

       Map m ;

            synchronized (CliSendAdviceBo.class) {

                 m = getBCK01A(map);  //  cache

                  //ati set cache        

                    new MybatisRedisCache().putObjectByThrdlocalCurKey(m);

                    //end set cache finish

    }

         

     

     

    2.3. 增加keytag 教研校验   这个额 keytag mybati配置文件里面的 nanespace.sqlid

    public void putObjectByThrdlocalCurKey_AsynProxy(final String key_valideTag, final Object param_shouldbelist) {

    //if("a".equals("a"))

    //return;

    final Object curkey1 = MybatisCacheWzGuava.curkey.get();

    AsynUtil_prjcli.execMeth_Async(new FutureTask<>(new Callable() {

    @Override

    public Object call() throws Exception {

    putObjectByThrdlocalCurKey(key_valideTag, curkey1, param_shouldbelist);

    return null;

    }

    }), "threadName");

    }

    /**

     *

     * @param param_shouldbelist

     * @param m

     * @param parameter

     */

    synchronized public void putObjectByThrdlocalCurKey(String key_valideTag, Object curkey1,

    Object param_shouldbelist) {

    Object curkey = MybatisRedisCache.curkey.get();

    if (curkey1 == null)

    return;

    if (curkey1.toString().contains("getBCK01A"))

    System.out.println("dbg");

    if (key_valideTag.length() > 0)

    if (!curkey1.toString().toLowerCase().contains(key_valideTag.toLowerCase().trim()))

    return;

     

     

    /clinical/src/main/java/com/cnhis/cloudhealth/clinical/util/cache/MybatisCacheWzGuava.java

  • 相关阅读:
    浏览器渲染
    微信h5页面制作总结
    chrome开发工具指南之综述
    零碎记录
    docker 容器已经启动,但是无法访问
    Docker的安装及使用
    python目录选择
    centos7 设置进程开机自启动
    语句中传入变量
    kafka -> structuredStreaming读取kafka日志 ->自定义输出到mysql
  • 原文地址:https://www.cnblogs.com/attilax/p/15197655.html
Copyright © 2020-2023  润新知