日常问题总结,mybatis的typeHandler使用

  1. 基本数据类型是值传递,引用数据类型是地址

String类型用final修饰,虽然它是引用传递,但是它不可以被修改,所以String处理时,其实是新创建了一个对象;

public class StringTest {
    public static void main(String[] args) {
        String s="origin";
        ChangeClass changeClass = new StringTest().new ChangeClass();
        changeClass.change(s);
        System.out.println(s);
    }

    class ChangeClass {
        public ChangeClass() {
            super();
        }

        public void change(String s){
            s=s+"update";
        }
    }
}

origin

  1. 垃圾回收

GC 是垃圾回收器的简称,全称是Garbage Collection。Java 的垃圾回收器并不是特指一种,Java官方本身就提供了很多个GC回收器供用户选择,还有各个Java虚拟机厂商(例如 Azul 的PCG、C4)也自己设计开发了很多优秀的垃圾回收器。

Stop The World 也是一个很重要的关键词,它会在任何一种GC算法中发生,其实可以把它理解为JVM GC在清理内存时,整个程序的停顿时间。当 Stop The World 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到 GC 任务完成。每一代的Java垃圾回收器,都把缩减 Stop The World 停顿时间作为很重要的目标。

JVM GC只回收堆区和方法区内的基本类型数据和对象。

Java性能优化之JVM GC(垃圾回收机制) - 知乎 (zhihu.com)

栈区的数据(仅指基本类型数据),在超出作用域后会自动出栈释放掉,所以其不在JVM GC的管理范围内。

怎么判断对象可以被回收了?

简单来说就是:对象没有引用了或者对象不可达

怎么判断对象是否存活?常见的有两种算法,分别是 引用计数法 和 可达性分析法

引用计数法

在对象中添加引用的计数器,当被引用家+1,引用失效就-1,当回收时,计数器为0则进行回收;但是它不能回收相互引用的对象,所以主流的java虚拟机都没有用这种

可达性分析法(根搜索算法)

其实不止是Java,C# 也是使用可达性分析算法来判断对象是否存活的,这个算法也可以称之为根搜索算法。

Java目前在用的主流虚拟机,都是采用可达性分析法来判断对象是否可被回收的,它通过若干个根节点组成的集合(GC Roots),向下遍历搜索,遍历的过程就是一条引用链,没有在这个链条上面的对象,是不可能被再次使用的,可以判定为可回收的对象。

标记 - 清除算法

标记 - 复制算法

  1. 线程安全问题

package com.chenlei.day001;


public class SystemTest {

    public static void main(String[] args) {
        SellTicket st = new SellTicket();
        new Thread(st, "窗口1").start();
        new Thread(st, "窗口2").start();
        new Thread(st, "窗口3").start();
    }
}

class SellTicket implements Runnable {
    private int count = 100;

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        while (count > 0) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + "卖出了1张票,还剩余" + (--count) + "张票");
        }
    }

}

用同一个runable对象创建的线程对象之间可以共享变量count;

但是容易出现线程安全问题,此时我们则可以用锁来锁住对象,或者方法或者代码段,尽量减小锁的粒度,如果锁打的粒度比较大,判断锁和等待锁释放的时间会比较长,反而降低程序运行效率

Day02

  1. mysql中创建枚举类字段时,枚举值不能是中文。否则报错;

2.mybatis连接数据库时,两个配置文件,加载时,我们是加载核心配置文件,不是映射文件,不然解析时; 找了半天这个问题,进入到源码里面debug,发现environment和properties两个参数都为空,但是我环境又配置了的,都快崩溃了,后来发现自己文件写错了,把自己都逗笑了,真的是太粗心了!!!!!!!!

3.mybatis在映射时有提供类型映射处理器,在重写方法后,记得在核心配置文件中(一定加在最上面,加在environment后面时会报红),添加typehandler,让其注册,最好是映射resultmap中,添加到具体的字段上; 

突然想到之前写mapper文件时,遇到过写查询结果映射,用resulttype自动匹配,因为前后台实体没有同步,导致传到前台的数据,属性的值混乱,一方面是要同步前后台实体,另一个方面最好用resultmap强制绑定列和字段,而且resulttype底层会用反射出来的method会按照驼峰命名,如果属性名取名不是很合理的话,会很容易匹配不上(具体不研究了,反正用resultmap就对了);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值