server精简版代理意外终止 sql_来自阿里巴巴内部JAVA面试宝典意外流出

前言

来自阿里巴巴内部面试宝典意外流出!

c6af873cb71fbbd955400fb768d90ae5.png

面试宝典内容(JVM+Mybatis+Zookeeper),附答案+解析

MyBatis系列面试宝典

572b3e32b6461b70982e85a0cebd6b4c.png

1.MyBatis是什么?

  • Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。
  • MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

2.Mybatis优缺点:

优点

  • 与传统的数据库访问技术相比,ORM有以下优点:基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
  • 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接。
  • 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
  • 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
  • 能够与Spring很好的集成

缺点

SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

ac3275c99423ddb9e752bc540db4bd92.png

3.MyBatis和Hibernate的适用场景?

  • MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。
  • 对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

开发难易程度和学习成本

  • Hibernate 是重量级框架,学习使用门槛高,适合于需求相对稳定,中小型的项目,比如:办公自动化系统
  • MyBatis 是轻量级框架,学习使用门槛低,适合于需求变化频繁,大型的项目,比如:互联网电子商务系统

总结

  • MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,
  • Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架

4.MyBatis的功能架构是怎样的

c967d0d63d7cd8aa2e3a437279f1fceb.png
  • 我们把Mybatis的功能架构分为三层:
  • API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  • 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  • 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑

5.Mybatis如何执行批量操作

  • 使用foreach标签
  • foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach标签的属性主要有item,index,collection,open,separator,close。
  • item   表示集合中每一个元素进行迭代时的别名,随便起的变量名;
  • index   指定一个名字,用于表示在迭代过程中,每次迭代到的位置,不常用;
  • open   表示该语句以什么开始,常用“(”;
  • separator 表示在每次进行迭代之间以什么符号作为分隔符,常用“,”;
  • close   表示以什么结束,常用“)”。
  • 在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:

1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封

装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key.

具体用法如下:

 //推荐使用INSERT INTO emp(ename,gender,email,did)VALUES(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
INSERT INTO emp(ename,gender,email,did)VALUES(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})

使用ExecutorType.BATCH

  • Mybatis内置的ExecutorType有3种,默认为simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优; 但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的
  • 具体用法如下:
//批量保存方法测试//批量保存方法测试@Testpublic void testBatch() throws IOException{SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();//可以执行批量操作的sqlSessionSqlSession openSession =sqlSessionFactory.openSession(ExecutorType.BATCH);//批量保存执行前时间long start = System.currentTimeMillis();try {EmployeeMapper mapper =openSession.getMapper(EmployeeMapper.class);for (int i = 0; i < 1000; i++) {mapper.addEmp(newEmployee(UUID.randomUUID().toString().substring(0, 5), "b", "1"));}openSession.commit();long end = System.currentTimeMillis();//批量保存执行后的时间System.out.println("执行时长" + (end - start));//批量 预编译sql一次==》设置参数==》10000次==》执行1次 677
//非批量 (预编译=设置参数=执行 )==》10000次 1121} finally {openSession.close();}}
  • mapper和mapper.xml如下
public interface EmployeeMapper {//批量保存员工Long addEmp(Employee employee);}
```insert into employee(lastName,email,gender)values(#{lastName},#{email},#{gender})```

JVM系列面试宝典

33c9430500e06311a33ecfe72b3e95e3.png

1.详解JVM内存模型

思路: 给面试官画一下JVM内存模型图,并描述每个模块的定义,作用,以及可能会存在的问题,如栈溢出等。

我的答案:

JVM内存结构

4735fa0935a818e0260149027bbf024a.png
  • 程序计数器:当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有。
  • Java虚拟栈:存放基本数据类型、对象的引用、方法出口等,线程私有。
  • Native方法栈:和虚拟栈相似,只不过它服务于Native方法,线程私有。
  • Java堆:java内存最大的一块,所有对象实例、数组都存放在java堆,GC回收的地方,线程共享。
  • 方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。(即永久带),回收目标主要是常量池的回收和类型的卸载,各线程共享

2.说说内存屏障

内存屏障,也叫内存栅栏,是一种CPU指令,用于控制特定条件下的重排序和内存可见性问题。

LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。

StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。

LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。

StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。 在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能。

3.happen-before原则

  • 单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作。锁的happen-before原则:同一个锁的unlock操作happen-before此锁的lock操作。
  • volatile的happen-before原则:对一个volatile变量的写操作happen-before对此变量的任意操作(当然也包括写操作了)。
  • happen-before的传递性原则:如果A操作 happen-before B操作,B操作happen-before C操作,那么A操作happen-before C操作。
  • 线程启动的happen-before原则:同一个线程的start方法happen-before此线程的其它方法。
  • 线程中断的happen-before原则 :对线程interrupt方法的调用happen-before被中断线程的检测到中断发送的代码。
  • 线程终结的happen-before原则: 线程中的所有操作都happen-before线程的终止检测。
  • 对象创建的happen-before原则: 一个对象的初始化完成先于他的fifinalize方法调用。

4.怎么打破双亲委派模型?

打破双亲委派机制则不仅要继承ClassLoader类,还要重写loadClass和fifindClass方法。

5.强引用、软引用、弱引用、虚引用的区别?

思路: 先说一下四种引用的定义,可以结合代码讲一下,也可以扩展谈到ThreadLocalMap里弱引用用处。

我的答案:

1)强引用

我们平时new了一个对象就是强引用,例如 Object obj = new Object();即使在内存不足的情况下,JVM

宁愿抛出OutOfMemory错误也不会回收这种对象。

2)软引用

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。

SoftReference softRef=new SoftReference(str); // 软引用

用处: 软引用在实际中有重要的应用,例如浏览器的后退按钮。按后退时,这个后退时显示的网页内容是重新进行请求还是从缓存中取出呢?这就要看具体的实现策略了。

(1)如果一个网页在浏览结束时就进行内容的回收,则按后退查看前面浏览过的页面时,需要重新构建

(2)如果将浏览过的网页存储到内存中会造成内存的大量浪费,甚至会造成内存溢出

如下代码:

Browser prev = new Browser(); // 获取页面进行浏览SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用if(sr.get()!=null){rev = (Browser) sr.get(); // 还没有被回收器回收,直接获取}else{prev = new Browser(); // 由于内存吃紧,所以对软引用的对象回收了sr = new SoftReference(prev); // 重新构建}

3)弱引用

具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

String str=new String("abc");WeakReference abcWeakRef = new WeakReference(str);str=null;等价于str = null;System.gc();

4)虚引用

如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。

Zookeeper系列面试宝典

d18efabe47b383650ee108bf6ae15e4c.png

1.Zookeeper 的 java 客户端都有哪些?

java 客户端:zk 自带的 zkclient 及 Apache 开源的 Curator。

2.说几个 zookeeper 常用的命令。

常用命令:ls get set create delete 等。

3.Zookeeper 的典型应用场景

Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员可以使用它来进行分布式数据的发布和订阅。

通过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watcher 事件通知机制,可以非常方便的构建一系列分布式应用中年都会涉及的核心功能,如:

(1)数据发布/订阅

(2)负载均衡

(3)命名服务

(4)分布式协调/通知

(5)集群管理(6)Master 选举

(7)分布式锁

(8)分布式队列

4.负载均衡

zk 的命名服务

命名服务是指通过指定的名字来获取资源或者服务的地址,利用 zk 创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。

5.集群支持动态添加机器吗?

其实就是水平扩容了,Zookeeper 在这方面不太好。两种方式:

全部重启:关闭所有 Zookeeper 服务,修改配置之后启动。不影响之前客户端的会话。

逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常用的方式。

3.5 版本开始支持动态扩容

6.Zookeeper 下 Server 工作状态

服务器具有四种状态,分别是 LOOKING、FOLLOWING、LEADING、OBSERVING。

(1)LOOKING:寻 找 Leader 状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。

(2)FOLLOWING:跟随者状态。表明当前服务器角色是 Follower。

(3)LEADING:领导者状态。表明当前服务器角色是 Leader。

(4)OBSERVING:观察者状态。表明当前服务器角色是 Observer。

7.Chroot 特性

3.2.0 版本后,添加了 Chroot 特性,该特性允许每个客户端为自己设置一个命名空间。如果一个客户端设置了 Chroot,那么该客户端对服务器的任何操作,都将会被限制在其自己的命名空间下。

通过设置 Chroot,能够将一个客户端应用于 Zookeeper 服务端的一颗子树相对应,在那些多个应用公用一个 Zookeeper 进群的场景下,对实现不同应用间的相互隔离非常有帮助。

最后来自小编的福利

fa4104a06ee8c5771409e54f82fb406f.png

上述面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2020收集的一些大厂的面试真题(都整理成文档,小部分截图)。

资料获取方式:关注小编+转发文章+私信【面试资料】获取下述资料。

部分资料图片:

5c459660fffb3c10a1fbb1542bf54ba0.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天津科技大学计算机网络,计算机网络PPT(天津科技大学讲稿-张强)第一章英文对照...

计算机网络课程讲义Chapter 1 IntroductionA note on the use of these ppt slides:We’re making these slides freely available to all (faculty, students, readers). They’re in PowerPoint form so you can add, modify, and delete slides (including this one) and sl…

sox处理mp3_音频处理常用Linux命令总结(一)

今天总结一下常用的linux音频处理工具soX - Sound eXchangesoxisoxi 常用选项soxi: SoX vUsage: soxi [-V[level]] [-T] [-t|-r|-c|-s|-d|-D|-b|-B|-p|-e|-a] infile1 ...-V[n] Increment or set verbosity level (default is 2)-T With -s, -d or -D, display the tota…

2019年12月计算机统考答案,2019年12月计算机等级WPS考前冲刺练习题及答案

【导语】2019年12月计算机等级考试已经进入冲刺阶段&#xff0c;为了方便考生及时有效的备考&#xff0c;那么&#xff0c;无忧考网为您精心整理了2019年12月计算机等级WPS考前冲刺练习题及答案&#xff0c;把握机会抓紧练习吧。如想获取更多计算机等级考试的模拟题及备考资料&…

七乐彩中奖规则表_【开奖】双色球第2020094期开奖结果出炉!你中奖了吗?

东莞福彩——让您人生多福&#xff0c;生活多彩&#xff01;购福彩&#xff0c;做公益&#xff0c;圆梦想。●活动进行时●点击了解↓↓↓●【活动1】727福彩嘉年华&#xff1a;福彩携1000万体验券喊你来生日趴&#xff01;●【活动2】刮刮乐新票“超给力”重磅来袭&#xff01…

远程计算机 函数不支持,win7远程桌面连接提示要求的函数不受支持怎么办

摘要 腾兴网为您分享:win7远程桌面连接提示要求的函数不受支持怎么办&#xff0c;作业大师&#xff0c;智学网&#xff0c;虚拟助手&#xff0c;喜马拉雅等软件知识&#xff0c;以及winrar纯净&#xff0c;powerdesigner中文&#xff0c;云协同&#xff0c;smc选型软件&#xf…

arcgis vue 添加图层优化_行业 | ArcGIS制图技巧(超全)

↑ 点击上方「中国测绘学会」可快速关注我们地理信息系统(Geographic Information System或 Geo&#xff0d;Information system&#xff0c;GIS)有时又称为“地学信息系统”。它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下&#xff0c;对整个或部分地…

图片大_2020跨年图片 元旦快乐祝福图片 2019再见2020你好图片大全 新年图片

听说你会画蛋&#xff0c;“圆蛋”画得好这是上天的垂青&#xff0c;但要成为一名令人仰慕的画家&#xff0c;还要靠你不懈的追求。愿你为“圆蛋”而努力&#xff0c;因元旦而快乐终生&#xff01;元旦要到&#xff0c;预祝你用开心享受节日每一秒&#xff0c;用高兴感受生活真…

ise的时钟ip核_Vivado CIC IP核滤波器详解(一)

引言&#xff1a;从本文开始&#xff0c;我们详细介绍Xilinx CIC IP核滤波器相关知识&#xff0c;包括CIC IP核提供的特性、IP核接口描述以及IP核设计指导等相关内容。1.概述级联积分器梳状(CIC)滤波器&#xff0c;也称为Hogenauer滤波器&#xff0c;是用于实现数字系统中大采样…

潍坊经贸每年单招计算机的成绩,2018潍坊职业学院单招成绩查询时间

2018潍坊职业学院单招成绩查询时间2017-12-28 16:59:50文/丁雪竹潍坊职业学院单招什么时候出成绩&#xff0c;考试分数什么时候公布&#xff1f;高三网小编整理了2018潍坊职业学院单招成绩查询入口&#xff0c;希望大家都能在系统官网上查询到自己的成绩。潍坊职业学院单招什么…

天津大学计算机预推免机试_2019预推免汇总 | 9.18New!

设计保研2019年预推免汇总栏目开通了&#xff01;为了抢夺优质生源&#xff0c;每年9月&#xff0c;各大高校会以院系为单位组织开展预推免活动。对于设计保研的同学而言&#xff0c;预推免不容忽视&#xff01;为了帮助大家打赢这场信息战&#xff0c;小设将在官方通知发布的第…

和在线视频会议服务器,什么是视频会议服务器端和客户端?

什么是视频会议服务器端?越来越多的企业采用私有化在企业内部部署视频会议&#xff0c;就不可避免的需要自行搭建视频会议服务器&#xff0c;什么是视频会议服务器端&#xff0c;视频会议服务器端有什么用?视频会议服务器端是整套视频会议的枢纽,是用来传输以及存储用户信息的…

zookeeper 默认端口_ZooKeeper知识点汇总

一、ZooKeeper简介1. ZooKeeper是什么​ Apache ZooKeeper是一个开源的分布式服务框架&#xff0c;为分布式应用提供协调服务&#xff0c;用来解决分布式应用中的数据管理问题&#xff0c;如&#xff1a;配置管理、域名服务、分布式同步、集群管理等官网 https://zookeeper.apa…

侍魂服务器维修,侍魂胧月传说合服活动开启 4月15日更新内容预告

侍魂胧月传说合服活动开启。侍魂胧月传说将会在4月15日执行停机更新&#xff0c;此次更新将会开启合服活动&#xff0c;即对多组服务器进行合服互通&#xff0c;随之而来还有服务器内开展一些合服活动&#xff0c;此外还有对家族矿战玩法的优化及商城的调整更新&#xff0c;那么…

电脑pro,大师屏幕,小米归来!小米笔记本Pro 15 OLED首发评测

2016 年 7 月&#xff0c;小米正式杀入笔记本市场&#xff0c;推出了两款轻薄本。在当时主流的轻薄本市场都用着低色域 TN 屏和塑料机身的情况下&#xff0c;小米用高素质的屏幕和金属 CNC 一体化机身搅动了整个市场。遗憾的是&#xff0c;小米笔记本的模具在这之后更新的并不频…

无线路由器的DNS服务器怎么设置,无线路由器DNS的设置方法

路由器DNS怎么设置&#xff1f;其实一般情况下路由器上的DNS是无需进行设置&#xff1b;如果你电脑、手机等设备连接到路由器后&#xff0c;只能够登录QQ&#xff0c;网页打不开。这是因为路由器上的DNS配置被接触/串改了原标题&#xff1a;"无线路由器DNS的设置方法"…

仪表盘刻度调整_惊艳了我的仪表盘 那些年我遇到最美的“面孔”

文| G哥汽仪表盘上的信息可以让车主们了解自己座驾的状况&#xff0c;出彩的仪表盘设计甚至能让消费者购车时对这款车一见倾心&#xff0c;回顾过往曾经惊艳到我们的那些酷炫仪表盘&#xff0c;那些面孔你是否还依稀还记得……汽车的什么地方最凸显其科技感&#xff1f;营造高科…

负数比较大小_人教版六下【第一单元】负数比较负数的大小

点击蓝色文字关注我们吧&#xff01;主讲人邬卫老师&#xff0c;长沙市喻沛名师“错例研究”工作室成员。今天讲的微课是人教版小学数学六年级下册第一单元《负数》中有关“比较负数的大小”的典型错题分析。 摘要仿例组练 掌握了这些解题策略及方法之后&#xff0c;我们…

创建数组_如何创建数组

js数组js的数组不是典型的数组典型的数组元素的数据类型相同使用连续的内存储存通过数字下标获取元素但是js的数组不这样元素的数据类型可以不同内存不一定连续的&#xff08;对象是随机储存的&#xff09;不可以通过数字下标&#xff0c;而是通过字符串下标这意味着数组可以有…

node.js 实现udp传输_Node.js实战15:通过udp传输文件。

本文将要写一个udp服务器&#xff0c;和一个udp客户端&#xff0c;并实现客户端发送文件给服务器。服务器端代码如下&#xff1a;var dgram require("dgram");server();function server(){var socket dgram.createSocket("udp4");socket.on("messag…

mysql镜像压缩包使用_如何连接docker的mysql镜像

展开全部推荐使用Dockerfile方式。服务的管理使用的是supervisord, 因为dockerfile里只会有一个cmd生效,如果我想62616964757a686964616fe58685e5aeb931333361326332通过ssh去管理容器还要有mysql服务的启动起来 cmd的方式就无法实现&#xff0c;当然容器不需要以sshd的方式去管…