春招:百日准备(8/100)
学习思路如下:
二、JavaEE部分—题目
❤2、Hibernate
1、阐述实体对象的三种状态以及转换关系。
2、Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个线程能够共享同一个Session吗)?
3、Hibernate中Session的load和get方法的区别是什么?
4、如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?
5、简述Hibernate常见优化策略。
6、锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制。
7、Hibernate如何实现分页查询?
8、谈一谈Hibernate的一级缓存、二级缓存和查询缓存。
❤3、Struts
1、说说STRUTS的应用
❤4、Mybatis
1、解释一下MyBatis中命名空间(namespace)的作用。
2、MyBatis中的动态SQL是什么意思?
❤5、MVC
1、Spring MVC注解的优点
2、springmvc和spring-boot区别?
3、SpringMVC的运行机制,运行机制的每一部分的相关知识?
4、谈谈Spring MVC的工作原理是怎样的?
❤6、各框架对比与项目优化
1、Mybatis和Hibernate区别?
2、介绍一下你了解的Java领域的Web Service框架。
❤7、JPA
1、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。
2、EJB与JAVA BEAN的区别?
3、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
4、EJB的角色和三个对象是什么?
5、说说EJB规范规定EJB中禁止的操作有哪些?
6、EJB的**机制是什么?
7、EJB的几种类型分别是什么
8、EJB需直接实现它的业务接口或Home接口吗,请简述理由。
答案部分:2)Hibernate
1、阐述实体对象的三种状态以及转换关系。
答:
- 瞬时态: 当new一个实体对象后,这个对象处于瞬时态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被JVM的垃圾回收机制回收。这个对象所保存的数据与数据库没有任何关系,除非通过Session的save()、saveOrUpdate()、persist()、merge()方法把瞬时态对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久态对象。
- 持久态: 持久态对象的实例在数据库中有对应的记录,并拥有一个持久化标识(ID)。对持久态对象进行delete操作后,数据库中对应的记录将被删除,那么持久态对象与数据库记录不再存在对应关系,持久态对象变成移除态(可以视为瞬时态)。持久态对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。
-
游离态: 当Session进行了close()、clear()、evict()或flush()后,实体对象从持久态变成游离态,对象虽然拥有持久和与数据库对应记录一致的标识值,但是因为对象已经从会话中清除掉,对象不在持久化管理之内,所以处于游离态(也叫脱管态)。游离态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。
2、Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个线程能够共享同一个Session吗)?
答:
- (1)SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。对于应用程序,通常将SessionFactory通过单例的模式进行封装。
- (2)Session是一个轻量级非线程安全的对象(线程间不能共享Session),它表示与数据库进行交互的一个工作单元。Session是由SessionFactory创建的,在任务完成之后会被关闭。Session是持久层服务对外提供的主要接口。Session会延迟获取数据库连接(也就是在需要的时候才会获取)。为了避免创建太多的session,可以使用TreadLocal来获取当前的session,无论你调用多少次getCurrentSession()方法,返回的都是同一个session。
3、Hibernate中Session的load和get方法的区别是什么?
答:
1)get 是 立即检索, load 是延迟检索。
2)get方法直接返回实体类对象,load方法返回实体类对象的代理。
3)如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。
4)在Hibernate 3之前,get方法只在一级缓存中进行数据查找,如果没有找到对应的数据则越过二级缓存,直接发出SQL语句完成数据读取;load方法则可以从二级缓存中获取数据;从Hibernate 3开始,get方法不再是对二级缓存只写不读,它也是可以访问二级缓存的。
4、如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?
答:
延迟加载: 并不是在读取的时候就把数据加载进来,而是等到使用时再加载,Hibernate使用了代理机制实现延迟加载。我们使用Session的load()方法加载数据或者一对多关联映射在使用延迟加载的情况下从一的一方加载多的一方,得到的都是虚拟代理,简单的说,返回给用户的并不是实体本身,而是实体对象的代理。代理对象在用户调用getter方法时才会去数据库加载数据,但加载数据就需要数据库连接,而当我们把会话关闭时,数据库连接就同时关闭了。
-
1)关闭延迟加载特性。 操作起来比较简单,因为hibernate的延迟加载特性是在hbm配置里面可控制的。默认lazy=“true”,改为lazy="false"就可以了。 但是使用这个解决办法带来的隐患是十分大的。 首先,出现no session or session was closed就证明了您已经在使用外键关联表,如果去掉延迟加载的话,则表示每次查询的开销都会变得十分的大,如果关联表越多,后果也可以想象得到。所以不建议使用这个方法解决。
-
2)在session关闭之前把我们想要查询的数据先获取了。 首先需要了解一下session什么时候关闭,也就是它的生命周期。通常情况下hibernate会在查询数据关闭session,而使用getHibernateTemplate().get方法查询后会延迟关闭的时间。会在事务结束后才关闭。 使用拦截器(Interceptor)或过滤器(Filter)控制session。 spring为解决hibernate这一特性提供的解决方案,可以有效的控制session生命周期。
5、简述Hibernate常见优化策略。
答:常用的策略有
① 制定合理的缓存策略(二级缓存、查询缓存)。
② 采用合理的Session管理机制。
③ 尽量使用延迟加载特性。
④ 设定合理的批处理参数。
⑤ 如果可以,选用UUID作为主键生成器。
⑥ 如果可以,选用基于版本号的乐观锁替代悲观锁。
⑦ 在开发过程中, 开启hibernate.show_sql选项查看生成的SQL,从而了解底层的状况;开发完成后关闭此选项。
⑧ 考虑数据库本身的优化,合理的索引、恰当的数据分区策略等都会对持久层的性能带来可观的提升,但这些需要专业的DBA(数据库管理员)提供支持。
6、锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制。
答:锁机制的作用是保证共享资源可以进行排他性的访问。
-
悲观锁是认为操作共享资源的过程中,存在并发操作,所以在操作之前会将共享资源锁住;
数据库中主要是通过数据库底层的锁机制才能保证真正的数据访问排他性。
缺点:并发量不高,效率低; -
乐观锁是对并发操作共享资源持乐观态度,通常采用更加宽松的锁机制来解决悲观锁导致的性能问题;
在数据库的层面一般通过多版本控制来实现,读取数据后获取数据的版本号,更新数据时将此版本号加一
如果提交的数据的版本号大于数据库中此纪录当前版本号则更新数据,否则认为是过期数据。
7、Hibernate如何实现分页查询?
答:参考—https://www.cnblogs.com/1540340840qls/p/7749646.html
-
通过Hibernate实现分页查询: 开发人员只需要提供HQL语句(调用Session的createQuery()方法)或查询条件(调用Session的createCriteria()方法)、设置查询起始行数(调用Query或Criteria接口的setFirstResult()方法)和最大查询行数(调用Query或Criteria接口的setMaxResults()方法),并调用Query或Criteria接口的list()方法,Hibernate会自动生成分页查询的SQL语句。
8、谈一谈Hibernate的一级缓存、二级缓存和查询缓存。
答:
-
1)一级缓存: Hibernate的Session提供了一级缓存的功能,默认总是有效的,当应用程序保存持久化实体、修改持久化实体时,Session并不会立即把这种改变提交到数据库,而是缓存在当前的Session中,除非显示调用了Session的flush()方法或通过close()方法关闭Session。通过一级缓存,可以减少程序与数据库的交互,从而提高数据库访问性能。
-
2)二级缓存: SessionFactory级别的二级缓存是全局性的,所有的Session可以共享这个二级缓存。但二级缓存默认是关闭的,需要显式开启并指定需要使用哪种二级缓存实现类(可以使用第三方提供的实现)。一旦开启了二级缓存并设置了需要使用二级缓存的实体类,SessionFactory就会缓存访问过该实体类的每个对象,除非缓存的数据超出了指定的缓存空间。
-
3)查询缓存: 一级缓存和二级缓存都是对整个实体进行缓存,不会缓存普通属性,如果希望对普通属性进行缓存,可以使用查询缓存。查询缓存是将HQL或SQL语句以及它们的查询结果作为键值对进行缓存,对于同样的查询可以直接从缓存中获取数据。查询缓存默认也是关闭的,需要显式开启。
答案部分:3)Struts
1、说说STRUTS的应用。
答:非常详细—https://blog.****.net/godlk/article/details/80761550
答案部分:4)Mybatis
1、解释一下MyBatis中命名空间(namespace)的作用。
答:
在大型项目中,可能存在大量的SQL语句,这时候为每个SQL语句起一个唯一的标识(ID)就变得并不容易了。为了解决这个问题,在MyBatis中,可以为每个映射文件起一个唯一的命名空间,这样定义在这个映射文件中的每个SQL语句就成了定义在这个命名空间中的一个ID。只要我们能够保证每个命名空间中这个ID是唯一的,即使在不同映射文件中的语句ID相同,也不会再产生冲突了。
2、MyBatis中的动态SQL是什么意思?
答:参考—https://blog.****.net/troubleshooter/article/details/78460222
-
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。
-
MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set
foreach
答案部分:5)MVC
1、Spring MVC注解的优点
答:注解是一种分散式的元数据,与源代码耦合。
- 1)XML配置起来有时候冗长,此时注解可能是更好的选择,如jpa的实体映射;注解在处理一些不变的元数据时有时候比XML方便的多,比如spring 声明式事务管理,如果用xml写的代码会多的多;
- 2)注解最大的好处就是简化了XML配置;其实大部分注解一定确定后很少会改变,所以在一些中小项目中使用注解反而提供了开发效率;
- 3)注解相对于XML的另一个好处是类型安全的,XML只能在运行期才能发现问题。
2、springmvc和spring-boot区别?
答:
1)springboot 囊括了springmvc, 帮助程序员快速的搭建一个web框架,不需要xml进行配置。
2)传统的springmvc 是一个controller的拦截器,基于servlet构建出来的框架。
-
springmvc概念:
是Spring的一个模块,是一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或服务开发——URL路由、Session、模板引擎、静态Web资源等。 -
springboot概念:
Spring框架需要进行大量的配置,Spring Boot引入自动配置的概念,让项目设置变得很容易。
Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。
1)spring boot只是一个配置工具,整合工具,辅助工具
2)springmvc是框架,项目中实际运行的代码
3)spring boot占用的资源也比spring mvc多 -
区别:
-
1)Spring Boot提供极其快速和简化的操作,让 Spring 开发者快速上手。
-
2)Spring Boot提供了 Spring 运行的默认配置。
-
3)Spring Boot为通用 Spring项目提供了很多非功能性特性,例如:嵌入式
Serve、Security、统计、健康检查、外部配置等等。
3、SpringMVC的运行机制,运行机制的每一部分的相关知识?
答:如图所示,详细参考—https://blog.****.net/u012475786/article/details/89480938
4、谈谈Spring MVC的工作原理是怎样的?
答:工作原理:
上面的是springMVC的工作原理图:
- 1)客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.
- 2)DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。
- 3-4)DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。
- 5)Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。
- 6)Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。
- 7)Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。
答案部分:6)各框架对比与项目优化
1、Mybatis和Hibernate区别?
答:详细参考—https://blog.****.net/qq_41378597/article/details/88070335
2、介绍一下你了解的Java领域的Web Service框架。
详细参考—https://blog.****.net/qq877507054/article/details/60136842
答:Java领域的Web Service框架很多,包括Axis2(Axis的升级版本)、Jersey(RESTful的Web Service框架)、CXF(XFire的延续版本)、Hessian、Turmeric、JBoss SOA等,其中绝大多数都是开源框架。
答案部分:7)JPA
1、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。
答:EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。
- JNDI: Java Naming and Directory Interface 术语解释:一组帮助做多个命名和目录服务接口的API。
- RMI: Java Remote Method Invocation 术语解释:一种用于实现远程过程调用的应用程序编程接口。
- JAT: JAT是一种灵活的Java基础框架,可以很容易的扩展它来改善工程的启动时间。
1)Session Bean用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个Session Bean来为客户端服务。SessionBean可以直接访问数据库,但通常,它会通过Entity Bean实现数据访问。
2)Entity Bean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个EntityBean时,容器会自动将Entity Bean的状态和数据库同步。
-
区别:
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。
1)对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。
2)对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
概念:
-
EJB并不是一个产品。它是Java服务器端服务框架的规范,软件厂商根据它来实现EJB服务器。
应用程序开发者可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。
EJB规范详细地解释了一些最小但是必须的服务,如事务,安全和名字等。软件厂商根据这些规范要求以保证一个enterprise bean能使用某个必需的服务。规范并没有说明厂商如何实现这些服务。这使得通过阅读规范来学习EJB更加困难,因为它允许厂商在不牺牲核心服务的可移植性的前提下来提供一些增强功能。 -
EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序当然,还有许多方式可以实现分布式应用,类似微软的.net技术。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。
2、EJB与JAVA BEAN的区别?
答:详细参考—https://blog.****.net/cs_fei/article/details/9824639
-
EJB的定义:
EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序当然,还有许多方式可以实现分布式应用,类似微软的.net技术。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。 -
JAVA Bean的定义:
最初,JavaBean的目的是为了将可以重复使用的软件代码打包标准。特别是用于帮助厂家开发在综合开发环境(IDE)下使用的java软件部件。这些包括如Grid控件,用户可以将该部件拖放到开发环境中。从此,JavaBean就可以扩展为一个java web 应用的标准部件,并且JavaBean部件框架已经扩展为企业版的 Bean(EJB)。
JavaBean 和 Server Bean(通常称为 Enterprise JavaBean (EJB))有一些基本相同之处。它们都是用一组特性创建,以执行其特定任务的对象或组件。它们还有从当前所驻留服务器上的容器获得其它特性的能力。这使得 bean 的行为根据特定任务和所在环境的不同而有所不同。 -
区别:两者是完全不同的
JavaBean是一个组件,而EJB就是一个组建框架
1)JavaBean面向的是业务逻辑和表示层的显示,通过编写一个JavaBean,可以将业务逻辑的事件和事务都放在其中,然后通过它的变量属性将所需要的内容在表示层传递显示。
2)EJB是部署在服务器上的可执行组建或商业对象。EJB有一个部署描述符,通过这个部署描述符可以对EJB的属性进行描述。EJB不和表示层交互。
通常,对于简单的服务器端应用来说,使用JavaBean是很不错的选择。虽然对于复杂的服务器端应用来说,使用JavaBean同样可以达到相同的效果,但这么做,所有底层的实现都必须手工来重新编写。而EJB不必用户关心它的底层操作,而只要关心它的外部实现即可。
3、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
答:
- SessionBean: Stateless Session Bean(无状态) 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。当客户机第一次调用一个Stateful(有状态) Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例。
- EntityBean: Entity Beans能存活相对较长的时间,并且状态是持续的。只要数据库中的数据存在,Entity beans就一直存活。而不是按照应用程序或者服务进程来说的。即使EJB容器崩溃了,Entity beans也是存活的。Entity Beans生命周期能够被容器或者Beans自己管理。
-
EJB通过以下技术管理实务: 对象管理组织(OMG)的对象实务服务(OTS),Sun Microsystems的Transaction Service(JTS)、Java Transaction API(JTA),开发组(X/Open)的XA接口。
4、EJB的角色和三个对象是什么?
答:一个完整的基于EJB的分布式计算结构由六个角色组成,这六个角色可以由不同的开发商提供,每个角色所作的工作必须遵循Sun公司提供的EJB规范,以保证彼此之间的兼容性。
-
六个角色分别是:
EJB组件开发者(Enterprise Bean Provider) 、应用组合者(Application Assembler)、部署者(Deployer)、EJB 服务器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container Provider)、系统管理员(System Administrator) -
三个对象分别是:
Remote(Local)接口、Home(LocalHome)接口、Bean类
5、说说EJB规范规定EJB中禁止的操作有哪些?
答:
- 1.不能操作线程和线程 API(线程 API指非线程对象的方法如 notify,wait等)
- 2.不能操作awt
- 3.不能实现服务器功能
- 4.不能对静态属生存取
- 5.不能使用IO 操作直接存取文件系统
- 6.不能加载本地库
- 7.不能将this 作为变量和返回
- 8.不能循环调用
6、EJB的**机制是什么?
答:EJB使用实例池化机制,对于无状态会话bean,实例化机制相对来说用较少的系统资源实现更大的系统吞吐率。
-
实例池(Instance pooling)
类经过构造方法,返回实例。容器通过创建数个实例放到池子中。
当用户调用无状态会话bean,容器从池中取出一个实例,为用户提供服务。
实例池的元素(实例)个数控制有几种情况:
1.池中实例足够多,有多少取多少。出现用户断开连接的情况下,实例会返回到池中,待重用。
2.池中实例不足,再内存允许情况下,创建实例,来满足高峰需求。
3.当高峰过后,会适当销毁一些实例。
但对于状态会话bean,这种方式不太试用,因为每个实例都保存着不同的客户信息。所以需要引入**机制。 -
**机制
定义: 序列化是指将对象保存到硬盘中。由于连接的用户会在相当长的时间内没有有效动作,所以考虑将他们的实例对象从内存迁移硬盘。等到用户有了有效动作,读取硬盘内容对对象实例成员进行反序列化,载入内存。
序列化(内存到硬盘)过程称为钝化(passivated).
反序列化(从硬盘到内存)过程称为**(activated).
需要注意的是反序列化会创建新的bean实例,但是通过刚从硬盘读入内存的成员数据初始化。
7、EJB的几种类型分别是什么?
答:EJB 依照特性的不同,目前区分为三种,分别是 Session Bean ,Entity Bean ,以及 Message Driven Bean
即EJB包含:会话Bean 、实体Bean、消息驱动Bean
8、EJB需直接实现它的业务接口或Home接口吗,请简述理由。
答:
远程接口和Home接口不需要直接实现,他们的实现代码是由服务器产生的,程序运行中对应实现类会作为对应接口类型的实例被使用。