您的位置:澳门皇家赌场真人在线 > 皇家赌场游戏 > Mybatis常会合试题,读取数据库时报java【澳门皇家

Mybatis常会合试题,读取数据库时报java【澳门皇家

发布时间:2019-10-04 15:43编辑:皇家赌场游戏浏览(120)

    本文首要教学Mybatis的以下知识点:

    #{}和${}的区别是什么?

    难点陈诉:

    如图所示,依次对图中开展疏解。

    在堆里贮存着大概多一些java对象实例,垃圾搜聚器在对堆进行回收在此之前,第一件业务正是明确这一个目的之中怎么着还“存活”着(即透过别的路子都无法儿选取的对象)。

    • Mybatis缓存
      • 一流缓存
      • 二级缓存
      • 与Ehcache整合
    • Mapper代理
      • 行使Mapper代理就无须写完毕类了
    • 逆向工程
      • 自动生成代码

    在Mybatis中,有三种占位符

    行使Connection、Statement/PreparedStatement、ResultSet来取数据库音信:

    澳门皇家赌场 1java对象与monitor的关联图

    在Java中,是经过可达性剖判(Reachability Analysis)来判别对象是或不是存活的。该算法的基本思路就是经过一些被称之为引用链的对象作为源点,从那几个节点最初向下找寻,搜索走过的路线被喻为(Reference Chain),当三个指标到GC Roots未有其他引用链相连时(即从GC Roots节点到该节点不可达),则表明该指标是不可用的。

    缓存的含义

    • #{}剖判传递踏入的参数数据
    • ${}对传递步入的参数原样拼接在SQL中
    • #{}是预编写翻译管理,${}是字符串替换
    • 使用#{}可以使得的严防SQL注入,升高系统安全性。

    .........ResultSet rs = stmt.executeQuery();String str1 = rs.getString;......String str2 = rs.getString;.........

    1. 大家理解JVM堆中存放的是指标实例。对象实例包蕴多少个部分。分别是与对象实例非亲非故的对象头,实例数据,填充数据。
    2. 对象头中包蕴多少个部分:MarkWord和指向元数据的指针。所占内部存款和储蓄器为2*JVM位数(在32bitJVM中就占8个字节)。马克Word和指向元数据的指针分别占贰个JVM位数。注意:假如目的是数组,则是3*JVM位数,多多少个象征数组的长短。
    3. MarkWord,存款和储蓄对象的hashCode、GC分代年龄以及锁消息。独有1个JVM位数,那么到底存的是甚?官方解释为:因为各类对象都会有,为了节约空间,JVM采纳了空间复用。即当对象处于区别情况的时候,马克Word存款和储蓄的内容是不均等的。
      • 无锁态时:存款和储蓄的是hashCode、分代年龄。
      • 净重级锁时:存款和储蓄的是指向monitor的指针。synchronized是重量级锁。
    4. monitor,在Java中是ObjectMonitor(JVM源码中C++完毕)来落实管程。管程大家承接再说,以往只说它是对互斥量和复信号量的包裹就可以。

    澳门皇家赌场 2可达性深入分析算法判别指标是不是足以回收如上海教室所示,object1~object4对GC Root都是可达的,表达不可被回收,object5和object6对GC Root节点不可达,表明其得以被回收。在Java中,可看作GC Root的对象包涵以下两种:

    • 将用户时临时查询的多寡放在缓存中,客户去查询数据就毫无从磁盘上(关系型数据库数据文件)查询,从缓存中询问,进而巩固查询功能,解决了高并发系统的属性难点。

    当实体类中的属性名和表中的字段名差别样 ,如何做 ?

    当推行到String str2 = rs.getString;时抛出非凡:java.sql.SQLException: 流已被关闭

    我们那边就说一下ObjectMonitor中多少个重大字段的意思:

    • 设想机栈(栈帧中的本地变量表)中引用的靶子
    • 方法区中类静态属性援引的指标
    • 方法区中常量援引的对象
    • 地点方法栈中JNI(即日常说的Native方法)引用的目的

    澳门皇家赌场 3那边写图片描述

    第1种: 通过在询问的sql语句中概念字段名的外号,让字段名的外号和实体类的特性名同样

    检查程序代码,缺未察觉有如何非常的地点,那么终究是哪些来头促成的呢?

    • _count:记录owner线程获取锁的次数。这句话很好驾驭,那也调节了synchronized是可重入的。
    • _owner:指向具备该对象的线程
    • _澳门皇家赌场,WaitSet:存放处于wait状态的线程队列。
    • _EntryList:存放等待锁而被block的线程队列。

    正是在可达性深入分析算法中不可达的靶子,也决不是“非死不可”的,那时候它们暂且处于“缓刑”阶段,要真的宣布一个目的谢世,起码要经历双重标识进度。标志的前提是指标在实行可达性剖判后开采并未与GC Roots相连接的援引链。1. 第一遍标志并张开壹次筛选。筛选的尺度是此目的是还是不是有不可或缺实践finalize()方法。当对象未有覆盖finalize方法,也许finzlize方法已经被设想机调用过,设想机将那二种意况都算得“无需实施”,对象被回收。2. 次之次标识譬如这一个指标被决断为有至关重要施行finalize()方法,那么那个目的将会被停放在一个名字为:F-Queue的行列之中,并在稍后由一条设想机自动创立的、低优先级的Finalizer线程去施行。这里所谓的“试行”是指设想时机接触这么些办法,但并不承诺会等待它运转截止。那样做的由来是,假设贰个目的finalize()方法中实施缓慢,也许产生死循环,将很或许会招致F-Queue队列中的其余对象永远处于等候情形,以致招致整个内部存款和储蓄器回收种类崩溃。Finalize()方法是指标脱逃与世长辞时局的末尾壹次机遇,稍后GC将对F-Queue中的对象开展首回小框框标志,假若目的要在finalize()中中标营救本身----只要重新与引用链上的别样的三个对象创设关联就可以,例如把本人赋值给有些类变量或对象的积极分子变量,那在第三次标识时它将移除出“将要回收”的成团。假如指标那时候还没躲过,那繁多它就实在被回收了。

    mybatis提供一流缓存和二级缓存

     <select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”> select order_id id, order_no orderno ,order_price price form orders where order_id=#{id}; </select> 
    

    出错原因及消除措施:

    _Mybatis常会合试题,读取数据库时报java【澳门皇家赌场】。count和_owner很好理解,后边三个体系我们例如来验证:假使大家写出如下代码:

    从可达性算法中得以看出,决断指标是或不是可达时,与“引用”有关。那么如何景况下得以说七个对象被引用,引用到底意味着如何?在JDK1.2自此,Java对援引的概念进行了增添,能够将援引分为以下四类:

    澳门皇家赌场 4此地写图片描述

    第2种: 通过<resultMap>来映射字段名和实业类属性名的逐一对应的涉嫌

    留心查阅java api文书档案,在ResultSet类的最上边有一段文字:

    澳门皇家赌场 5image.png澳门皇家赌场 6image.png

    • 强引用(Strong Reference)
    • 软引用(Soft Reference)
    • 弱引用(Weak Reference)
    • 虚引用(Phantom Reference)
    • mybatis拔尖缓存是二个SqlSession品级,sqlsession只可以访问本身的一流缓存的数目
    • 二级缓存是跨sqlSession,是mapper等第的缓存,对于mapper等第的缓存不一样的sqlsession是足以共享的。
     <select parameterType="int" resultMap="orderresultmap"> select * from orders where order_id=#{id} </select> <resultMap type=”me.gacl.domain.order” id=”orderresultmap”> <!–用id属性来映射主键字段–> <id property=”id” column=”order_id”> <!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–> <result property = “orderno” column =”order_no”/> <result property=”price” column=”order_price” /> </reslutMap>
    

    默许的 ResultSet 对象不可更新,只有贰个向前移动的指针。由此,只可以迭代它贰遍,并且不得不按从第一行到最后一行的顺序举办。

    1. 想要获取monitor的线程先进入monitor的_EntryList队列阻塞等待。即遭受synchronized关键字时。
    2. 如果monitor的_owner为空,则从队列中移出并赋值与_owner。
    3. 假定在前后相继里调用了wait()方法,则该线程步入_WaitSet队列。注意wait方法大家以前讲过,它会自由monitor锁,将在_owner赋值为null并进入_WaitSet队列阻塞等待。那时别的在_EntryList中的线程就能够收获锁了。
    4. 当程序里别的线程调用了notify/notifyAll方法时,就能够唤起_WaitSet中的有个别线程,那几个线程就能够再一次尝试获得monitor锁。假若成功,则就能够化为monitor的owner。
    5. 当程序里超出synchronized关键字的功效范围甘休时,就能将monitor的owner设为null,退出。

    那四种引用从上到下,依次裁减

    看完上边对Mybatis的缓存的分解,我们开采Mybatis的缓存和Hibernate的缓存是颇为常常的..

    笔者以为第二种艺术会好一点。

    就是说ResultSet只能前进挪动),并且不得不按所取的记录的列的顺序来读取,所以那边:

    聊到此处大家大概会有毛病:上述的那一个步骤是怎么落到实处的吗?其实我们地方只聊起了ObjectMonitor的多少个成员变量,那么它必然有成员方法来操作那一个分子变量。如图:

    3.1 强引用

    强引用就是指在程序代码中广泛存在的,类似Object obj = new Object()那好像的援用,只要强援引在,垃圾搜罗器恒久不会收集被引述的对象。也正是说,宁愿出现内部存款和储蓄器溢出,也不会回收那个指标。

    Mybatis的一流缓存原理

    怎么赢得自动生成的键值?

    String str1 = rs.getString;String str2 = rs.getString;

    澳门皇家赌场 7image.png

    3.2 软引用

    软引用是用来描述一些有用但实际不是要求的对象,在Java中用java.lang.ref.SoftReference类来代表。对于软引用关联着的对象,独有在内部存款和储蓄器不足的时候JVM才会回收该对象。因而,那或多或少方可很好地用来消除OOM的难点,而且那么些特点很相符用来贯彻缓存:举个例子网页缓存、图片缓存等。

    import java.lang.ref.SoftReference; public class Main { public static void main(String[] args) { SoftReference<String> sr = new SoftReference<String>(new String; System.out.println; }}
    

    澳门皇家赌场 8这里写图片描述

    只要我们平时插入数据的话,假若我们想要知道刚刚插入的数据的主键是稍微,大家得以由此以下的方式来获得

    假定所取的笔录里字段田野同志2在田野(field)1在此之前,而读取的时候读田野2在读田野同志1之后,那么就能够抛出上述卓殊!!

    • 大家能够知道其实上述的操作都对应了ObjectMonitor的不二等秘书籍。即wait/notify/notifyAll那一个底层都以调用ObjectMonitor的格局而已。
    • 那边大家得以回看一下大家事先使用的synchronized+wait/notify/notifyAll来贯彻生产者和花费者的例证结合起来看。

    3.3 弱引用

    弱援用也是用来说述非必须对象的,当JVM实行垃圾回收时,无论内部存款和储蓄器是还是不是充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来代表。下面是采取示例:

    import java.lang.ref.WeakReference; public class Main { public static void main(String[] args) { WeakReference<String> sr = new WeakReference<String>(new String; System.out.println; System.gc(); //通知JVM的gc进行垃圾回收 System.out.println; }}
    

    第一遍发出一个询问sql,sql查询结果写入sqlsession的超级缓存中,缓存使用的数据结构是八个map

    需求:

    昨天我们来回看一下管程。

    3.4 虚引用

    虚援用和前边的软援用、弱引用分裂,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如若二个指标与虚援用关联,则跟未有援引与之提到同样,在其余时候都恐怕被垃圾回收器回收。要潜心的是,虚引用必得和援引队列关联应用,当垃圾回收器盘算回收七个指标时,要是开掘它还恐怕有虚援引,就能够把那一个虚援引投入到与之 关联的援用队列中。程序能够透过判定援引队列中是不是业已步入了虚援引,来领悟被引述的靶子是不是快要被垃圾回收。假若程序意识某些虚引用已经被投入到援用队列,那么就足以在所援引的靶子的内部存款和储蓄器被回收在此之前运用供给的行路。

    import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue; public class Main { public static void main(String[] args) { ReferenceQueue<String> queue = new ReferenceQueue<String>(); PhantomReference<String> pr = new PhantomReference<String>(new String, queue); System.out.println; }}
    
    • key:hashcode+sql+sql输入参数+输出参数
    • value:客商音信
    • user对象插入到数据库后,新记录的主键要经过user对象回来,通过user获取主键值。

    管程 (German:Monitors,也称为监视器) 是一种程序结构,结构内的五个子程序造成的多少个办事线程互斥访谈分享资源。

    引进管程的案由实信号量机制的弱项:进度自备同步操作,P操作多量分散在相继进度中,不易管理,易产生死锁。管程特点:管程封装了同步操作,对经过掩盖了一道细节,简化了一道功用的调用分界面。

    3.5 软援用和弱援引更为证实

    在SoftReference类中,有多少个艺术,三个构造方法和三个get方法(WekReference类似):

    public class SoftReference<T> extends Reference<T> { /** * Timestamp clock, updated by the garbage collector */ static private long clock; /** * Timestamp updated by each invocation of the get method. The VM may use * this field when selecting soft references to be cleared, but it is not * required to do so. */ private long timestamp; /** * Creates a new soft reference that refers to the given object. The new * reference is not registered with any queue. * * @param referent object the new soft reference will refer to */ public SoftReference(T referent) { super; this.timestamp = clock; } /** * Creates a new soft reference that refers to the given object and is * registered with the given queue. * * @param referent object the new soft reference will refer to * @param q the queue with which the reference is to be registered, * or <tt>null</tt> if registration is not required * */ public SoftReference(T referent, ReferenceQueue<? super T> q) { super(referent, q); this.timestamp = clock; } /** * Returns this reference object's referent. If this reference object has * been cleared, either by the program or by the garbage collector, then * this method returns <code>null</code>. * * @return The object to which this reference refers, or * <code>null</code> if this reference object has been cleared */ public T get() { T o = super.get(); if (o != null && this.timestamp != clock) this.timestamp = clock; return o; }}
    

    get方法用来猎取与软援引关联的对象的援引,即便该目的被回收了,则赶回null。

    在应用软援引和弱援用的时候,大家得以显得地经过System.gc()来通告JVM进行垃圾回收,但是要小心的是,尽管发出了通报,JVM不必然会立时推行,也正是说那句是无力回天确认保障此时JVM一定会进展垃圾回收的。

    同八个sqlsession再度发出同样的sql,就从缓存中取不走数据库。倘若四遍中间出现commit操作,本sqlsession中的一流缓存区域一体清空,下一次再去缓存中查询不到所以要从数据库查询,从数据库查询到再写入缓存。

    缓慢解决思路:

    轻易易行地说管程正是叁个概念,任何语言都足以达成。指标正是为着简化同步调用的长河。回看一下刚刚大家说的Java中的达成ObjectMonitor。它现实干了怎样事,其实就是管程须要干哪些事。

    3.6 虚引用特别印证:

    虚引用中有三个构造函数,能够看看,其必需和三个援用队列一同存在。get()方法永久再次回到null,因为虚援用永恒不可达。

    public class PhantomReference<T> extends Reference<T> { /** * Returns this reference object's referent. Because the referent of a * phantom reference is always inaccessible, this method always returns * <code>null</code>. * * @return <code>null</code> */ public T get() { return null; } /** * Creates a new phantom reference that refers to the given object and * is registered with the given queue. * * <p> It is possible to create a phantom reference with a <tt>null</tt> * queue, but such a reference is completely useless: Its <tt>get</tt> * method will always return null and, since it does not have a queue, it * will never be enqueued. * * @param referent the object the new phantom reference will refer to * @param q the queue with which the reference is to be registered, * or <tt>null</tt> if registration is not required */ public PhantomReference(T referent, ReferenceQueue<? super T> q) { super(referent, q); }}
    

    参考

    • 《深远精通Java设想机》

    澳门皇家赌场 9此处写图片描述

    • 通过LAST_INSERT_ID()获取刚插入记录的自增主键值,在insert语句试行后,实践select LAST_INSERT_ID()就足以拿走自增主键。
    1. Java对象与monitor的关系:通过在Java对象头中的mark word中蕴藏了指向monitor的指针。
    2. 知道了Java中的管程ObjectMonitor的办事原理,知道了Java语法中的wait/notify/notifyAll方法底层都以调用了ObjectMonitor的格局。
    3. 知情了管程的定义,一种程序结构,封装了同步操作,制止直接运用PV时限信号量。

    Mybatis一级缓存值得注意的地点:

    mysql:

    本文由澳门皇家赌场真人在线发布于皇家赌场游戏,转载请注明出处:Mybatis常会合试题,读取数据库时报java【澳门皇家

    关键词:

上一篇:没有了

下一篇:没有了