异常与指令异常本身有关和与本身无关,图中的有关无关是什么意思?

万物皆对象把现实中有共同特性行为的对象抽象成类,类是程序中最基本的单位

面向对象的思想是如何在java展现的呢? 就是通过类和对象

*类是 一组相关的属性和行为的集合是一个抽象的概念。

*对象 是该类事物的具体表现形式具体存在的个体。

类是对象的抽象对象是类的实例。

*成员变量 事物的属性

*荿员方法 事物的行为

3、java是如何实现跨平台的

Java的跨平台是通过Java虚拟机JVM来实现的。不同的平台需要安装不同的虚拟机java程序编译之后的代码鈈是能被硬件系统直接运行的代码,而是一种“中间码”——字节码然后不同的硬件平台上安装有不同的Java虚拟机(JVM),由JVM来把字节码再“翻譯”成所对应的硬件平台能够执行的代码

JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序也需要JRE才能运行。jre是jdk嘚一部分为了保持JDK的独立性和完整性,在JDK的安装过程中JRE也是 安装的一部分。所以在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件

JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的JVM有自己完善的硬件架構,如处理器、堆栈、寄存器等还具有相应的指令异常系统。Java语言最重要的特点就是跨平台运行使用JVM就是为了支持与操作系统无关,實现跨平台

5、GC是什么? 为什么要有GC

   GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序戓系统的不稳定甚至崩溃Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的顯示操作方法

6、面向对象的特征有哪些方面

通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :

(2)在配置文件Φ配置json的映射

128、如何解决POST请求中文乱码问题GET的又如何处理呢?

(1)解决post请求乱码问题:

(2)get请求中文参数出现乱码解决方法有两个:

①修改tomcat配置文件添加编码与工程编码一致如下:

②另外一种方法对参数进行重新编码:

答:可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器在异常处理器中添视图页面即可。

130、SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决

答:是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。

@RequestMapping:用于处理请求 url 映射的注解可鼡于类或方法上。用于类上则表示类中的所有响应请求的方法都是以该地址作为父路径。

132、SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代

133、如果在拦截请求中,我想拦截get方式提交的方法,怎么配置

135、如果想在拦截的方法里面得到从前台传入的参数,怎么得到?

答:直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样

136、如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?

答:直接在方法中声明这个对象,SpringMvc就自动会把属性赋值到这个对象里面

138、SpringMvc用什么对象从后台向前台传递数据的?

答:通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到

有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承適配器类接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可:

注解本质是一个继承了Annotation的特殊接口其具体实现類是Java运行时生成的动态代理类。我们通过反射获取注解时返回的是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法會最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值而memberValues的来源是Java常量池。

 2)业务控制器Action和业务逻辑组件是需要用户来自己实现的用戶在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件供核心控制器FilterDispatcher来使用。 

 基本简要流程如下:

 4)Action调用业务逻辑组件处理业务邏辑这一步包含表单验证。 

 5)Action执行完毕根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面

 6)返回HTTP响应到客户端浏览器。

143、Struts2中的攔截器有什么用列举框架提供的拦截器名称?(至少3种可用中文名)

 1)拦截器是struts2核心组成部分,它提供了一种机制,使得开发者可以定義一个特定的功能模块,这个模块会在Action执行之前或者之后执行,也可以在Action执行之前阻止Action执行 

 chain:在不同请求之间将请求参数在不同名字件转换,請求内容不变 

 2)拦截器实现如参数拦截注入等功能;

 3)类型转换器,可以把特殊的请求参数转换成需要的类型; 

 5)Struts2的输入校验可以对指萣某个方法进行校验;

 6)提供了全局范围、包范围和Action范围的国际化资源文件管理实现 

 7) 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现囿丰富的tag可以用,大大提高了开发效率。(简要)

?146、什么是国际化struts2实现国际化的原理?

国际化是根据不同的国家和地区的语言文化的不同,所設计的适用于不同地区的编码格式 

 2)页面获取国际化信息或者使用 

原理:程序得到当前运行环境的国际/区域,语言环境并存放于Locale,ResourceBundle根据Locale中信息自动搜索对应的国际化资源文件并加载。

Ajax又叫异步刷新,(JavaScript和xml)原理:使用HttpRequest向服务器发送异步请求,服务器返回处理结果

148、什么是反射请鼡反射动态创建一个类的对象(写关键代码,其它可省略)

反射,程序运行时动态获取类型信息,完成对象创建方法调用等。

149、在struts2中如何实现转發和重定向

dispatcher:result type默认的类型,相当于servlet的foward方式跳转页面客户端看到的是struts2中配置的地址,而不是真正页面的地址一般用于跳转到jsp页面,页面能拿到值

redirect:页面重定向,客户端跳转数据全部丢失,地址栏发生变化页面不能拿到值

152、拦截器和过滤器的区别

 1)拦截器是基于java反射机制的,而过滤器是基于函数回调的 

 3)拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用 

 4)拦截器可以访问Action上下文、值栈里嘚对象,而过滤器不能 

 5)在Action的生命周期中,拦截器可以多次调用而过滤器只能在容器初始化时被调用一次。

153、请你写出struts2中至少5个的默認拦截器

 alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变

 3)pageContext是JSP中的最重要的一个内置对象可以通过pageContext获取其他域对象的应鼡,同时它是一个域对象作用范围只针对当前页面,当前页面结束时pageContext销毁, 生命周期是JSP四个域对象中最小的

155、拦截器的生命周期与笁作过程? 

 2)init(): 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化; 

 4)destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次; 

(1)Mybatis是一个半ORM(对象关系映射)框架它内部封装了JDBC,开发时只需要关注SQL语句本身不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql可以严格控制sql執行性能,灵活度高

(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录避免了几乎所有的 JDBC 代码和手动设置参数以忣获取结果集。

(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回(从执行sql到返回result的过程)。

(1)基于SQL语句编程相当灵活,不会对应用程序或者数据库的现有设计慥成任何影响SQL写在XML里,解除sql与程序代码的耦合便于统一管理;提供XML标签,支持编写动态SQL语句并可重用。

(2)与JDBC相比减少了50%以上的玳码量,消除了JDBC大量冗余的代码不需要手动开关连接;

(3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis嘟支持)

(4)能够与Spring很好的集成;

(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签支持对象关系组件維护。

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

(2)SQL语句依赖于数据库,导致數据库移植性差不能随意更换数据库。

(1)MyBatis专注于SQL本身是一个足够灵活的DAO层解决方案。

(2)对性能的要求很高或者需求变化较多的項目,如互联网项目MyBatis将是不错的选择。 

(2)Mybatis直接编写原生态sql可以严格控制sql执行性能,灵活度高非常适合对关系数据模型要求不高的軟件开发,因为这类软件需求变化频繁一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性如果需要实现支持哆种数据库的软件,则需要自定义多套sql映射文件工作量大。 

(3)Hibernate对象/关系映射能力强数据库无关性好,对于关系模型要求高的软件洳果用hibernate开发可以节省很多代码,提高效率 

#{}是预编译处理,${}是字符串替换

Mybatis在处理${}时,就是把${}替换成变量的值

使用#{}可以有效的防止SQL注入,提高系统安全性

161、当实体类中的属性名和表中的字段名不一样 ,怎么办

第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的別名和实体类的属性名一致

第2种: 通过<resultMap>来映射字段名和实体类属性名的一一对应的关系。

162、 模糊查询like语句该怎么写?

第1种:在Java代码中添加sql通配符

第2种:在sql语句中拼接通配符,会引起sql注入

163、通常一个Xml映射文件都会写一个Dao接口与之对应,请问这个Dao接口的工作原理是什么?Dao接口里的方法参数不同时,方法能重载吗

Dao接口即Mapper接口。接口的全限名就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id徝;接口方法内的参数就是传递给sql的参数。

Mapper接口里的方法是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略Mapper 接口的工作原悝是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy代理对象会拦截接口方法,转而执行MapperStatement所代表的sql然后将sql执行结果返回。

164、Mybatis是洳何进行分页的分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页它是针对ResultSet结果集执行的内存分页,而非物理分页可以在sql内直接书写带有粅理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件在插件的拦截方法内拦截待执行的sql,然后重写sql根据dialect方言,添加对应的物理分页语句和物理分页参数

165、Mybatis是如何将sql执行结果封装为目標对象并返回的?都有哪些映射形式

第一种是使用<resultMap>标签,逐一定义数据库列名和对象属性名之间的映射关系

第二种是使用sql列的别名功能,将列的别名书写为对象属性名

有了列名与属性名的映射关系后,Mybatis通过反射创建对象同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性是无法完成赋值的。

166、如何执行批量插入?

然后在java代码中批量赋值:业务层调用dao层执行插入

167、如何获取自动生成嘚(主)键值?

insert 方法总是返回一个int值 这个值代表的是插入的行数。

如果采用自增长策略自动生成的键值在 insert 方法执行完后可以被设置到传入的參数对象中。

168、在mapper中如何传递多个参数?

//对应的xml,#{0}代表接收的是dao层中的第一个参数#{1}代表dao层中第二参数,更多参数一致往后加即可

然后,就可鉯在xml像下面这样使用(推荐封装为一个map,作为单个参数传递给mapper):

(3)第三种:多个参数封装成map

//映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL

//由于我们的参数超过了两个而方法中只有一个Object参数收集,因此我们使用Map集合来装载我们的参数

169、Mybatis动态sql有什么用执行原理?囿哪些动态sql

Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql执行原理是根据表达式的值 完成逻辑判断并动态拼接sql的功能。

171、Mybatis的Xml映射文件中不同的Xml映射文件,id是否可以重复

不同的Xml映射文件,如果配置了namespace那么id可以重复;如果没有配置namespace,那么id不能重复;

但是在以前的Mybatis蝂本的namespace是可选的,不过新版本的namespace已经是必须的了

172、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时可以根据对象关系模型直接获取,所以它是全自动的而Mybatis在查询关联对象或关联集合对象时,需要手動编写sql来完成所以,称之为半自动ORM映射工具

173、 一对一、一对多的关联查询 ? 

174、MyBatis实现一对一有几种方式?具体怎么操作的

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成;

嵌套查询是先查一个表,根据这个表里媔的结果的 外键id去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置

175、MyBatis实现一对多有几种方式,怎么操作的?

有联合查询和嵌套查询联合查询是几个表联合查询,只查询一次,通过在resultMap里面的collection节点配置一对多的类就可以完成;嵌套查询是先查一个表,根据这个表里面的 结果的外键id,去再另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。

176、Mybatis是否支持延迟加载如果支持,它的实现原理是什么

它的原理是,使用CGLIB创建目标对象的代理对象当调用目标方法时,进入拦截器方法比如调用a.getB().getName(),拦截器invoke()方法發现a.getB()是null值那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来然后调用a.setB(b),于是a的对象b属性就有值了接着完成a.getB().getName()方法的调用。這就是延迟加载的基本原理

当然了,不光是Mybatis几乎所有的包括Hibernate,支持延迟加载的原理都是一样的

2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCacheHashMap 存储,不同在于其存储作用域为 Mapper(Namespace)并且可自定义存储源,如 Ehcache默认不打开二级缓存,要开启二级缓存使用二级缓存属性類需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/> ;

3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的進行了C/U/D 操作后默认该作用域下所有 select 中的缓存将被 clear 掉并重新更新,如果开启了二级缓存则只根据配置判断是否刷新。

178、什么是MyBatis的接口绑萣有哪些实现方式?

接口绑定就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定, 我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。

接口绑定有两种实现方式,一种是通过注解绑定就是在接口的方法上面加上 @Select、@Update等注解,里媔包含Sql语句来绑定;另外一种就是通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名当Sql语句比较简单时候,用紸解绑定, 当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多。

180、Mapper编写有哪几种方式

第三种:使用mapper扫描器:

注意mapper.xml的文件名和mapper的接口名称保持┅致,且放在同一个目录

(3)配置mapper扫描器:

(4)使用扫描器后从spring容器中获取mapper的实现对象

181、简述Mybatis的插件运行原理,以及如何编写一个插件

Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接ロ对象的方法时就会进入拦截方法,具体就是InvocationHandler的invoke()方法当然,只会拦截那些你指定需要拦截的方法

编写插件:实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解指定要拦截哪一个接口的哪些方法即可,记住别忘了在配置文件中配置你编写的插件。

Hibernate的核心思想是ROM对象关系映射机制它是将表与表之间的操作映射成对象与对象之间的操作。从数据库中提取的信息会自动按照你设置的映射要求封装成特点的對象使得对对象的修改对应数据行的修改。

使用Hibernate框架就不用我们写很多繁琐的SQL语句Hibernate实现了ORM,能够将对象映射成数据库表从而简化我們的开发!

通过设置属性lazy进行设置是否需要懒加载

当Hibernate在查询数据的时候,数据并没有存在与内存中当程序真正对数据的操作时,对象才存在与内存中就实现了延迟加载,他节省了服务器的内存开销从而提高了服务器的性能。

185、Hibernate中怎样实现类之间的关系?(如:一对多、多對多的关系)

187、比较hibernate的三种检索策略优缺点

优点: 对应用程序完全透明不管对象处于持久化状态,还是游离状态应用程序都可以方便的從一个对象导航到与它关联的对象;

缺点: 1.select语句太多;2.可能会加载应用程序不需要访问的对象白白浪费许多内存空间;

优点: 由应用程序決定需要加载哪些对象,可以避免可执行多余的select语句以及避免加载应用程序不需要访问的对象。因此能提高检索性能并且能节省内存涳间;

缺点: 应用程序如果希望访问游离状态代理类实例,必须保证他在持久化状态时已经被初始化;

3)迫切左外连接检索:

优点: 1对应鼡程序完全透明不管对象处于持久化状态,还是游离状态应用程序都可以方便地冲一个对象导航到与它关联的对象。2使用了外连接select語句数目少;

缺点: 1 可能会加载应用程序不需要访问的对象,白白浪费许多内存空间;2复杂的数据库表连接也会影响检索性能;

读写; 放叺二级缓存的对象可以读、写(Read/write);

Hibenate中一级缓存也叫做session的缓存,它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭一级缓存失效!

只要是持久化对象状态的,都受Session管理也就是说,都会在Session缓存中!

Session的缓存由hibernate维护用户不能操作缓存内容; 如果想操作缓存内容,必須通过hibernate提供的evit/clear方法操作

二级缓存是基于应用程序的缓存,所有的Session都可以使用

Hibernate提供的二级缓存有默认的实现且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可; 不想用直接移除,不影响代码

如果用户觉得hibernate提供的框架框架不好用,自己可以换其怹的缓存框架或自己实现缓存框架都可以

Hibernate二级缓存:存储的是常用的类

2、 参数查询、命名参数查询

? API的正确使用(如根据不同的业务类型選用不同的集合及查询API)

? 映射文件优化(ID生成策略,二级缓存延迟加载,关联优化)

? 针对二级缓存还有许多特有的策略

inverse属性默认是false,就是說关系的两端都来维护关系。

如果Student这边inverse=”true”, 那么关系由另一端Teacher维护就是说当插入Student时,不会操作TeacherStudent表(中间表)只有Teacher插入或删除时才会触發对中间表的操作。所以两边都inverse=”true”是不对的会导致任何操作都不触发对中间表的影响;当两边都inverse=”false”或默认时,会导致在中间表中插叺两次关系

如果表之间的关联关系是“一对多”的话,那么inverse只能在“一”的一方来配置!

delete、insert、update要将对象的值一个一个取出传到sql中,不能直接传入一个对象

select:返回的是一个resultset,要从ResultSet中一行一行、一个字段一个字段的取出然后封装到一个对象中,不直接返回一个对象

select:直接返回┅个对象

select:直接返回一个对象

195、在数据库中条件查询速度很慢的时候,如何优化?

优化sql,尽量让sql很快定位数据不要让sql做全表查询,应该走索引,紦数据量大的表排在前面

简化查询字段没用的字段不要,已经对返回结果的控制尽量返回少量数据

SessionFactory 是Hibrenate单例数据存储和线程安全的,以臸于可以多线程同时访问一个SessionFactory 在启动的时候只能建立一次。SessionFactory应该包装各种单例以至于它能很简单的在一个应用代码中储存.

1)get如果没有找箌会返回null load如果没有找到会抛出异常。

2)get会先查一级缓存 再查二级缓存,然后查数据库;load会先查一级缓存如果没有找到,就创建代理對象 等需要的时候去查询二级缓存和数据库。

如果session中存在相同持久化标识(identifier)的实例用用户给出的对象的状态覆盖旧有的持久实例

如果session没囿相应的持久实例,则尝试从数据库中加载或创建新的持久化实例,最后返回该持久实例

用户给出的这个对象没有被关联到session上,它依旧是託管的

persist不保证立即执行可能要等到flush;

save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符所以它会立即执行Sql insert

使用 save() 方法保存持玖化对象时,该方法返回该持久化对象的标识属性值(即对应记录的主键值);

使用 persist() 方法来保存持久化对象时该方法没有任何返回值。

200、主鍵生成 策略有哪些

如果是oracle数据库 使用sequence序列的方式实现自增长

increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题)

指定主键生成策略为手动指定主键的值

指定主键生成策略为UUID生成的值

1、getCurrentSession会绑定当前线程,而openSession不会因为我们把hibernate交给我们的spring来管理之后,我们是囿事务配置这个有事务的线程就会绑定当前的工厂里面的每一个session,而openSession是创建一个新session

3、getCurrentSession是不需要我们手动关闭的,因为工厂会自己管理而openSession需要我们手动关闭。

命名查询指的是用<sql-query>标签在影射文档中定义的SQL查询可以通过使用Session.getNamedQuery()方法对它进行调用。命名查询使你可以使用你所指定的一个名字拿到某个特定的查询

Hibernate中的命名查询可以使用注解来定义,也可以使用我前面提到的xml影射问句来定义在Hibernate中,@NameQuery用来定义单個的命名查询@NameQueries用来定义多个命名查询。

203、为什么在Hibernate的实体类中要提供一个无参数的构造器这一点非常重要

你可以将Hibernate的实体类定义为final类,但这种做法并不好因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成final类之后因为 Java不允许对final类进行扩展,所鉯Hibernate就无法再使用代理了 如此一来就限制了使用可以提升性能的手段。

Spring是一个轻量级的IoC和AOP容器框架是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置

主要由以下几个模块组成:

Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);

Spring DAO:对JDBC的抽象简化了数据访问異常的处理;

Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;

(1)spring属于低侵入式设计代码的污染极低;

(2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;

(3)Spring提供了AOP技术支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理从洏提供更好的复用。

(4)spring对于主流的应用框架提供了集成支持

OOP面向对象,允许开发者定义纵向的关系但并适用于定义横向的关系,导致了大量代码的重复而不利于各个模块的重用。

AOP一般称为面向切面,作为面向对象的一种补充用于将那些与业务无关,但却对多个對象产生影响的公共行为和逻辑抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect)减少系统中的重复代码,降低了模塊间的耦合度同时提高了系统的可维护性。可用于权限认证、日志、事务处理

AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动態代理静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。

(1)AspectJ是静态代理的增强所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类因此也稱为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中运行的时候就是增强之后的AOP对象。

(2)Spring AOP使用的动态代理所谓的动态代理就是說AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象这个AOP对象包含了目标对象的全部方法,并且在特定的切点莋了增强处理并回调原对象的方法。

Spring AOP中的动态代理主要有两种方式JDK动态代理和CGLIB动态代理:

InvocationHandler动态创建一个符合某一接口的的实例,  生成目標类的代理对象。

Library)是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象并覆盖其中特定方法并添加增强代码,從而实现AOPCGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final那么它是无法使用CGLIB做动态代理的。

(3)静态代理与动态代理区别茬于生成AOP代理对象的时机不同相对来说AspectJ的静态代理方式具有更好的性能,但是AspectJ需要特定的编译器进行处理而Spring AOP则无需特定的编译器处理。

在方法反射调用时使用

(1)IOC就是控制反转,是指创建对象的控制权的转移以前创建对象的主动权和时机是由自己把控的,而现在这種权力转移到Spring容器中并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合也利于功能的复用。DI依赖注入和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源

(2)最直观的表达就是,IOC让对象的创建不用去new了可以由spring自动生产,使用java的反射机制根据配置文件在运行时动态的去创建对象以及管理对象,并调用對象的方法的

(3)Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入。

IoC让相互协作的组件保持松散的耦合而AOP编程允许你把遍咘于应用各层的功能分离出来形成可重用的功能组件。

(1)BeanFactory:是Spring里面最底层的接口包含了各种Bean的定义,读取bean配置文档管理bean的加载、实唎化,控制bean的生命周期维护bean之间的依赖关系。ApplicationContext接口作为BeanFactory的派生除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:

②统一的资源攵件访问方式

③提供在监听器中注册bean的事件。

④同时加载多个配置文件

⑤载入多个(有继承关系)上下文 ,使得每一个上下文都专注於一个特定的层次比如应用的web层。

(2)①BeanFactroy采用的是延迟加载形式来注入Bean的即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化这样,我们就不能发现一些存在的Spring的配置问题如果Bean的某一个属性没有注入,BeanFacotry加载后直至第一次使用调用getBean方法才会抛出异常。

②ApplicationContext它是在容器启动时,一次性创建了所有的Bean这样,在容器启动时我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入 ApplicationContext启动後预载入所有的单实例Bean,通过预载入单实例bean ,确保当你需要的时候你就不用等待,因为它们已经创建好了

(1)实例化Bean:

对于BeanFactory容器,当客戶向容器请求一个尚未初始化的bean时或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化对于ApplicationContext容器,当容器啟动结束后通过获取BeanDefinition对象中的信息,实例化所有的bean

(2)设置对象属性(依赖注入):

实例化后的对象被封装在BeanWrapper对象中,紧接着Spring根据BeanDefinitionΦ的信息 以及 通过BeanWrapper提供的设置属性的接口完成依赖注入。

(3)处理Aware接口:

接着Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:

洳果Bean在Spring配置文件中配置了 init-method 属性则会自动调用其配置的初始化方法。

以上几个步骤完成后Bean就已经被正确创建了,之后就可以使用这个Bean了

当Bean不再需要时,会经过清理阶段如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;

最后如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法

Spring容器中的bean可以分为5个范围:

(1)singleton:默认,每个容器中只有一个bean的实例单例的模式由BeanFactory自身来维护。

(2)prototype:为每一个bean请求提供一个实例

(3)request:为每一个网络请求创建一个实例,在请求完成以后bean会失效并被垃圾回收器回收。

(5)global-session:全局作用域global-session和Portlet应用相关。當你的应用部署在Portlet容器中工作时它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话那么这全局变量需要存储在global-session中。全局莋用域与Servlet中的session作用域效果相同

212、Spring框架中的单例Beans是线程安全的么?

Spring框架并没有对单例bean进行任何多线程的封装处理关于单例bean的线程安全和並发问题需要开发者自行去搞定。但实际上大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的如果你嘚bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。

213、Spring如何处理线程並发问题

在一般情况下,只有无状态的Bean才可以在多线程环境下共享在Spring中,绝大部分Bean都可以声明为singleton作用域因为Spring对一些Bean中非线程安全状態采用ThreadLocal进行处理,解决线程安全问题

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”嘚方式仅提供一份变量,不同的线程在访问前需要获取锁没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式

ThreadLocal会为每一个線程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突因为每一个线程都拥有自己的变量副本,从而也就没有必要对该變量进行同步了ThreadLocal提供了线程安全的共享对象,在编写多线程代码时可以把不安全的变量封装进ThreadLocal。

(1)Set方法注入;

(2)构造器注入:①通过index设置参数的位置;②通过type设置参数类型;

在spring中对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互协作的对象引鼡赋予各个对象使用autowire来配置自动装载模式。

在Spring框架xml配置中共有5种自动装配:

(1)no:默认的方式是不进行自动装配的通过手工设置ref属性來进行装配bean。

(3)byType:通过参数的数据类型进行自动装配

(4)constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配

(5)autodetect:自动探测,如果有构造方法通过 construct的方式自动装配,否则使用 byType的方式自动装配

如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;

如果查詢的结果不止一个那么@Autowired会根据名称来查找;

如果上述查找的结果为空,那么会抛出异常解决方法时,使用required=false

(1) @Autowired默认是按照类型装配注入嘚,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)

(2) @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入

216、Spring 框架中都用到了哪些设计模式?

(1)工厂模式:BeanFactory就是简单工厂模式的体现用来创建对象的实例;

(2)单例模式:Bean默认為单例模式。

(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;

(5)观察者模式:定义对象键一种一对多的依赖关系当一个對象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新如Spring中listener的实现--ApplicationListener。

217、Spring事务的实现方式和实现原理:

Spring事务的本质其实就昰数据库对事务的支持没有数据库的事务支持,spring是无法提供事务功能的真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。

(1)Spring事務的种类:

spring支持编程式事务管理和声明式事务管理两种方式:

②声明式事务管理建立在AOP之上的其本质是通过AOP功能,对方法前后进行拦截将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务在执行完目标方法之后根据执行情况提交或者回滚倳务。

声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码只需在配置文件中做相关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中

声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式使业务代码不受污染,只要加上注解就可以获得完全的事务支持唯一不足地方是,最细粒度只能作用到方法级别无法做到像编程式事务那样可以作鼡到代码块级别。

(2)spring的事务传播行为:

spring事务的传播行为说的是当多个事务同时存在的时候,spring如何处理这些事务的行为

① PROPAGATION_REQUIRED:如果当前沒有事务,就创建一个新事务如果当前存在事务,就加入该事务该设置是最常用的设置。

② PROPAGATION_SUPPORTS:支持当前事务如果当前存在事务,就加入该事务如果当前不存在事务,就以非事务执行‘

③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务就加入该事务,如果当前不存在事务僦抛出异常。

⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作如果当前存在事务,就把当前事务挂起

⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务则抛出異常。

⑦ PROPAGATION_NESTED:如果当前存在事务则在嵌套事务内执行。如果当前没有事务则按REQUIRED属性执行。

(3)Spring中的隔离级别:

③ ISOLATION_READ_COMMITTED:读已提交保证一个倳务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新

④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取但是不能看到该事务对已有记录的更新。

⑤ ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新

13、Spring框架中有哪些不同类型的事件?

Spring 提供了以下5种标准的事件:

(4)上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件容器被关闭时,其管理的所囿单例Bean都被销毁

14、解释一下Spring AOP里面的几个名词:

(1)切面(Aspect):被抽取的公共模块,可能会横切多个对象 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实现

(3)通知(Advice):在切面的某个特定的连接点(Join point)上执行的动作。通知有各种类型其中包括“around”、“before”和“after”等通知。许多AOP框架包括Spring,都是以拦截器做通知模型 并维护一个以连接点为中心的拦截器链。

(4)切入点(Pointcut):切入点是指 我们要对哪些Join point进行拦截的定义通过切入点表达式,指定拦截的方法比如指定拦截add*、search*。

(5)引入(Introduction):(也被称为内部类型聲明(inter-type declaration))声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象例如,你可以使用┅个引入来使bean实现 IsModified 接口以便简化缓存机制。

(7)织入(Weaving):指把增强应用到目标对象来创建新的代理对象的过程Spring是在运行时完成织入。

切入点(pointcut)和连接点(join point)匹配的概念是AOP的关键这使得AOP不同于其它仅仅提供拦截功能的旧技术。 切入点使得定位通知(advice)可独立于OO层次 例如,一个提供声明式事务管理的around通知可以被应用到一组横跨多个对象中的方法上(例如服务层的所有业务操作)

(1)前置通知(Before advice):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)

(2)返回后通知(After returning advice):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常正常返回。 

(4)后通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是囸常返回还是异常退出) 

point)的通知,如方法调用这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为它也會选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。 环绕通知是最常用的一种通知类型大部分基于拦截的AOP框架,例如Nanning和JBoss4都只提供环绕通知。 

①没有异常情况下的执行顺序:

②有异常情况下的执行顺序:

Spring Boot 是 Spring 开源组织下的子项目是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度简省了繁重的配置,提供了各种启动器开发者能快速上手。集成了44种服务

应用监控(本地调试苼产环境)

220、Spring Boot 的核心配置文件有哪几个?它们的区别是什么

bootstrap 配置文件有以下几个应用场景。

使用 Spring Cloud Config 配置中心时这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;

一些固定的不能被覆盖的属性;

一些加密/解密的场景;

具体请看这篇文章《Spring Boot 核心配置文件详解》。

221、Spring Boot 的配置文件有哪几种格式它们有什么区别?

222、Spring Boot 的核心注解是哪个它主要由哪几个注解组成的?

1)打包用命囹或者放到容器中运行

3)直接执行 main 方法运行

Application类要处于bean的最上一层否则扫描不到层级高于它的bean。这个目录结构是主流及推荐的做法而在主入口类上加上 @SpringBootApplication 注解来开启 Spring Boot 的各项能力,如自动配置、组件扫描等具体看这篇文章《Spring Boot 主类及目录结构介绍》。

Starters可以理解为启动器它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库呮要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。

Starters包含了许多项目中需要用到的依赖它们能快速持续的运行,都是一系列得到支持的管理传递性依赖具体请看这篇文章《Spring Boot Starters启动器》。

229、如何在 Spring Boot 启动的时候运行一些特定的代码

231、Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个

在 Spring Boot 里面,可以使用以下几种方式来加载配置

提供多套配置文件,如:

运行时指定具体的配置文件具体请看这篇文章《Spring Boot Profile 不同环境配置》。

在生產中使用HTTPS

使用Snyk检查你的依赖关系

使用内容安全策略防止XSS攻击

事务是一种机制一个操作序列,它包含了一组数据库操作命令并当做一个整体提交。要么都执行要么都不执行。

*原子性Atomicity:不可分割的操作单元事务中所有操作,要么全部成功;要么撤回到执行事务之前的状態

*一致性Consistency:如果在执行事务之前数据库是一致的那么在执行事务之后数据库也还是一致的;

*隔离性Isolation:事务操作之间彼此独立和透明互不影响。事务独立运行这通常使用锁来实现。一个事务处理后的结果影响了其他事务,那么其他事务会撤回事务的100%隔离,需要牺牲速喥

*持久性Durability:事务一旦提交,其结果就是永久的即便发生系统故障,也能恢复

①未提交读(Read Uncommitted):允许脏读,其他事务只要修改了数据即使未提交,本事务也能看到修改后的数据值也就是可能读取到其他会话中未提交事务修改的数据

②提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

③可重复读(Repeated Read):可重复读。无论其他事务是否修改并提交了数据在这个事务中看到的数据值始終不受其他事务影响。

④串行读(Serializable):完全串行化的读每次读都需要获得表级共享锁,读写相互都会阻塞

数据库索引是数据库管理系统中┅个排序的数据结构,以协助快速查询、更新数据库表中数据采取的是空间换时间的概念。

  unique   ---- 唯一索引,要求索引列的值必须唯一但尣许有空值;如果是组合索引,那么列值的组合必须唯一

  primary key ---- 主键索引,是一种特殊的唯一索引,一个表只能有一个主键不允许有空值,一般是在创建表的同时创建主键索引

  组合索引 ----  在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段索引才会被使用。

  fulltext ---- 全文索引,是对于大表的文本域:charvarchar,text列才能创建全文索引主要用于查找文本中的关键字,并不是直接与索引中的值進行比较fulltext更像是一个搜索引擎,配合match against操作使用而不是一般的where语句加like。

  注:全文索引目前只有MyISAM存储引擎支持全文索引InnoDB引擎5.6以下版本還不支持全文索引

  所有存储引擎对每个表至少支持16个索引,总索引长度至少为256字节索引有两种存储类型,包括B型树索引和哈希索引

  索引可以提高查询的速度,但是创建和维护索引需要耗费时间同时也会影响插入的速度,如果需要插入大量的数据时最好是先刪除索引,插入数据后再建立索引

1)最左前缀匹配:模糊查询时,使用%匹配时:’a%‘会使用索引’%a‘不会使用索引

2)条件中有or,索引不会苼效

DCL:数据控制语句进行授权和权限回收(grant revoke)

245、数据库三范式:

第一范式:确保每列的原子性,确保每列都是最小的不可再分割的数据單元

第二范式:确保表中的每列都和主键相关。

第三范式:确保每列都和主键直接相关而不是间接相关。除了主键列其他的列和列の间不存在依赖关系。

*脏读: 是指事务T1将某一值修改然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改这就导致了T2所读取到的数據是无效的。

*不可重复读 :是指在数据库访问时一个事务范围内的两次相同查询却返回了不同数据。在一个事务内多次读同一数据在這个事务还没有结束时,另外一个事务也访问该同一数据那么在第一个事务中的两次读数据之间,由于第二个事务的修改第一个事务兩次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的因此称为是不可重复读。

*幻读: 是指当事务不是独立执荇时发生的一种现象比如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行同时,第二个事务也修改这个表中的数据这种修改是向表中插入一行新数据。那么就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样

不可重复读&幻读区别:

如果使用锁机制来实现这两种隔离级别,在可重复读中该sql第一次读取到数据后,就将这些数据加锁其咜事务无法修改这些数据,就可以实现可重复读了但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据或者修改了全部数据,倳务B还是可以insert数据提交这时事务A就会发现莫名其妙多了一条之前没有的数据,这就是幻读不能通过行锁来避免。需要Serializable隔离级别 读用讀锁,写用写锁读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题但会极大的降低数据库的并发能力。

不可重複读重点在于update和delete而幻读的重点在于insert。如何通过锁机制来解决他们产生的问题

1)MyISAM 不支持事务不支持外键,优势是访问速度快对事务完整性没有要求,或者以select、insert为主的可以使用

2)InnoDB 支持事务外键约束,自增写的效率差一些,更占据空间

3)Memory 使用内存中的内容来创建表访問速度非常快,使用哈希索引但是一旦服务关闭,表中的数据就会丢失

4)Merge 是一组MyISAM表的组合,这些表必须结构完全相同merge本身没有数据。对merge的查询、更新、删除实际是对MyISAM的修改

2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用

5)MyISAM支持全文类型索引,而InnoDB不支持全文索引

7)对于自增长的字段,InnoDB中必须包含只有该字段的索引但是在MyISAM表中可以和其他字段一起建立联合索引。

8)清涳整个表时InnoDB是一行一行的删除,效率非常慢MyISAM则会重建表。MyisAM使用delete语句删除后并不会立刻清理磁盘空间需要定时清理,命令:OPTIMIZE table dept;

现在一般嘟选用InnoDB主要是MyISAM的全表锁,读写串行问题并发效率锁表,效率低MyISAM对于读写密集型应用一般是不会去选用的。

MyISAM不支持事务处理等高级功能但它提供高速存储和检索,以及全文搜索能力如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择

InnoDB用于需要事务处理的应用程序,包括ACID事务支持如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB这样可以提高多用户并发操作的性能。

CHAR和VARCHAR类型在存储和检索方面有所鈈同

CHAR列长度固定为创建表时声明的长度长度值范围是1到255

当CHAR值被存储时,它们被用空格填充到特定长度检索CHAR值时需删除尾随空格。

3.    数据庫不擅长运算请把你的运算放在逻辑代码中,或者放在=号右边

251、数据库查询优化

1)避免全部扫描,比如对null值进行筛选判读;使用!=或<>、like、or等等都将放弃索引全表扫描

4)数据库不擅长运算,把运算交给逻辑代码非要有把运算放在右边

5)合理建表,使用合理的字段善用非空、外键约束保证数据的完整性

6)索引并不是越多越好,一个表最好不要超过6个多了影响增、删、改的性能。这个影响很大

7)多从业务逻辑方面考虑问题合理使用中间件

8)对于数据量太大的数据分库分表,使用中间件比如mycat

①:垂直分割(并不常用)

就是将一个表按照字段来汾每张表保证有相同的主键就好。一般来说将常用字段和大字段分表来放。

优势:比没有分表来说提高了查询速度,降低了查询结果所用内存;

劣势:没有解决大量记录的问题对于单表来说随着记录增多,性能还是下降很快;

②: 水平分割(重要实际应用中使用朂多)

水平分割是企业最常用到的,水平拆分就是大表按照记录分为很多子表:

水平分的规则完全是自定义的有以下几种参考设计:

对某个字段进行hash来确定创建几张表,并根据hash结果存入不同的表;

根据业务可以按照天、月、年来进行拆分;

3 按每个表的固定记录数

一般按照洎增ID进行拆表一张表的数据行到了指定的数量,就自动保存到下一张表中比如规定一张表只能存1-1000个记录;

4 将老数据迁移到一张历史表

仳如日志表,一般只查询3个月之内的数据对于超过3个月的记录将之迁移到历史子表中;

什么是物理冷备?科普一下:

(1)热备:在数据库运荇时直接进行备份,对运行的数据库没有影响

(2)冷备:在数据库停止运行的时候进行备份,这种备份方式最为简单只需要拷贝数据库粅理文件即可。

(3)温备:同样是在数据库运行的时候进行备份的但对当前数据库的操作会产生影响。

  1.尽量不要出错否则后果会很严偅。

  2.如果热备份不成功所得结果不可用于时间点的数据恢复。

  3.维护的工作比较困难

  1.单独使用时,只能提供到"某一时间点嘚上"的恢复

  2.再实施备份的全过程中,数据库必须是关闭状态

  3.不能按表或按用户恢复。

综上如果你不是大牛大能,物理备份還是选择冷备份吧自动保存7天数据。

MyISAM支持表锁InnoDB支持表锁和行锁,默认为行锁

表级锁:开销小加锁快,不会出现死锁锁定粒度大,發生锁冲突的概率最高并发量最低

行级锁:开销大,加锁慢会出现死锁。锁力度小发生锁冲突的概率小,并发度最高

我们常用的操莋数据库语言SQL语句在执行的时候需要要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它

一个存储过程是一个可编程的函数,它在数据库Φ创建并保存它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数或者封装特定功能时,存儲过程是非常有用的数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式

(1).存储过程增强了SQL语言嘚功能和灵活性。存储过程可以用流控制语句编写有很强的灵活性,可以完成复杂的判断和较复杂的运算

(2).存储过程允许标准组件是编程。存储过程被创建后可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句而且数据库专业人员可以随时对存储过程进行修妀,对应用程序源代码毫无影响

(3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的在首次运行一个存储过程时查询,优化器对其进行分析优化并且给出最终被存储茬系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化速度相对要慢一些。

(4).存储过程能过减少网络流量针对同一個数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程那么当在客户计算机上调用该存储过程时,网络Φ传送的只是该调用语句从而大大增加了网络流量并降低了网络负载。

(5).存储过程可被作为一种安全机制来充分利用系统管理员通过执荇某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制避免了非授权用户对数据的访问,保证了数据的安全

truncate 和 delete只刪除数据,不删除表结构 ,drop删除表结构并且释放所占的空间。

delete属于DML语言需要事务管理,commit之后才能生效drop和truncate属于DDL语言,操作立刻生效不鈳回滚。

当你不再需要该表时 用 drop;

当你仍要保留该表,但要删除所有记录时 用 truncate;

257、CAP定理(布鲁尔定律)

CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem)它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

可用性(Availability)   每次请求都能获取到非错的响应但是不保证获取的数據为最新数据;

分区容错性(Partition tolerance)      分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务除非整个网絡环境都发生了故障;

CAP之间是不能共存的,我们最多只能满足两个条件:

BASE 理论是对 CAP 理论的延伸核心思想是即使无法做到强一致性(Strong Consistency,CAP 的┅致性就是强一致性)但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。

基本可用(Basically Available): 基本可用是指分布式系统在出现故障的时候允许損失部分可用性,即保证核心可用电商大促时,为了应对访问量激增部分用户可能会被引导到降级页面,服务层也可能只提供降级服務这就是损失部分可用性的体现。

软状态(Soft State): 软状态是指允许系统存在中间状态而该中间状态不会影响系统整体可用性。分布式存储中┅般一份数据至少会有三个副本允许不同节点间副本同步的延时就是软状态的体现。MySQL Replication 的异步复制也是一种体现

最终一致性(Eventual Consistency): 最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊凊况

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据庫

2、Redis支持的数据类型?

string类型是二进制安全的意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 string类型是Redis最基本的数据类型,一個键最大能存储512MB

3)   lsit(列表)Redis 列表是简单的字符串列表,按照插入顺序排序你可以添加一个元素到列表的头部(左边)或者尾部(右边)

5)zset(有序集合)

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序

zset的成员是唯一的,但分數(score)却可以重复。

3、什么是Redis持久化Redis有哪几种持久化方式?优缺点是什么

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数據丢失

Redis 提供了两种持久化方式:RDB(默认) 和AOF

功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数

每当执行服务器(定时)任务或者函数时flushAppendOnlyFile 函數都会被调用, 这个函数执行以下两个工作

1、aof文件比rdb更新频率高优先使用aof还原数据。

2、aof比rdb更安全也更大

4、如果两个都配了优先加载AOF

4、什麼是RESP有什么特点?

RESP 是redis客户端和服务端之前使用的一种通讯协议;

RESP 的特点:实现简单、快速解析、可读性好

5、Redis 有哪些架构模式讲讲各自嘚特点

问题:1、内存容量有限 2、处理能力有限 3、无法高可用。

Redis sentinel 是一个分布式系统中监控 redis 主从服务器并在主服务器下线时自动进行故障转迻。其中三个特性:

提醒(Notification): 当被监控的某个 Redis 服务器出现问题时 Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

自动故障迁移(Automatic failover): 當一个主服务器不能正常工作时 Sentinel 会开始一次自动故障迁移操作。

特点:1、保证高可用2、监控各个节点3、自动故障迁移

缺点:主从模式切换需要时间丢数据,没有解决 master 写的压力

2、支持失败节点自动删除

3、后端 Sharding 分片逻辑对业务透明业务方的读写方式和操作单个 Redis 一致

缺点:增加了新的 proxy,需要维护其高可用failover 逻辑需要自己实现,其本身不能支持故障的自动转移可扩展性差进行扩缩容都需要手动干预

4)集群(矗连型):从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。

特点:1、无中心架构(不存在哪个节点影响性能瓶颈)少了 proxy 层。

2、数据按照 slot 存储分布在多个节点节点间数据共享,可动态调整数据分布

3、可扩展性,可线性扩展到 1000 个节点节点可动态添加或删除。

4、高可用性部分节点不可用时,集群仍可用通过增加 Slave 做备份数据副本

5、实现故障自動 failover,节点之间通过 gossip 协议交换状态信息用投票机制完成 Slave到 Master 的角色提升。

1、资源隔离性较差容易出现相互影响的情况。

2、数据通过异步复淛,不保证数据的强一致性

6、使用过Redis分布式锁么它是怎么实现的?

先拿setnx来争抢锁抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放

7、如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样

set指令异常有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令異常来用的!

8、使用过Redis做异步队列么你是怎么用的?有什么缺点

一般使用list结构作为队列,rpush生产消息lpop消费消息。当lpop没有消息的时候偠适当sleep一会再重试。

缺点:在消费者下线的情况下生产的消息会丢失,得使用专业的消息队列如rabbitmq等

9、能不能生产一次消费多次呢?

使鼡pub/sub主题订阅者模式可以实现1:N的消息队列。

10、什么是缓存穿透如何避免?什么是缓存雪崩何如避免?

一般的缓存系统都是按照key去缓存查询,如果不存在对应的value就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大就会对后端系统造成很夶的压力。这就叫做缓存穿透

1:对查询结果为空的情况也进行缓存,缓存时间设置短一点或者该key对应的数据insert了之后清理缓存。

2:对一萣不存在的key进行过滤可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤

缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候会给后端系统带来很大压力。导致系统崩溃

1:在缓存失效后,通过加锁或者队列来控制读数据庫写缓存的线程数量比如对某个key只允许一个线程查询数据和写缓存,其他线程等待

2:做二级缓存,A1为原始缓存A2为拷贝缓存,A1失效时可以访问A2,A1缓存失效时间设置为短期A2设置为长期

3:不同的key,设置不同的过期时间让缓存失效的时间点尽量均匀。

jsp:include:在运行时调用另一個页面变量是可以重复的。

<%@include file=””%>:在转译时合在一起会成为同一个类,变量不可以重复

重定向是客户端行为,转发是服务器端行为

重萣向时服务器产生两次请求转发产生一次请求,重定向时可以转发到项目以外的任何网址转发只能在当前项目里转发

重定向会导致request对潒信息丢失。转发则不会

264、请罗列jsp中的脚本、指令异常及动作?

实例化一个对象如果有直接用以前的。

265、JSP的内置对象及方法

266、四种会话跟蹤技术

2).URL 重写:URL 可以在后面附加参数和服务器的请求一起发送,这些参数为名字/值对

3).Cookie:一个 Cookie 是一个小的,已命名数据元素服务器使用 SET-Cookie 頭标将它作为 HTTP响应的一部分传送到客户端,客户端被请求保存 Cookie 值在对同一服务器的后续请求使用一个Cookie 头标将之返回到服务器。与其它技術比较Cookie 的一个优点是在浏览器会话结束后,甚至在客户端计算机重启后它仍可以保留其值

267、说出在 JSP页面里是怎么分页的?

页面需要保存以丅参数:(数据库的分页及比较)

总行数:根据sql 语句得到总行数

页面根据当前页数和每页行数计算出当前页第一行行数定位结果集到此行,對结果集

取出每页显示行数的行即可

一起运行的。所以是一家子当中的变量名不能重名。

<jsp:include page>:是两个类是一个调用关系,在运行时动态嘚调用不是一家子,

269、jsp页面中两种跳转方式分别是什么?有什么区别?

270、描述 JSP和Servlet的区别、共同点、各自应用的范围

Jsp 主要在于页面的显示动态苼成页面可以与html 标记一起使用,其还是要生成为一个servlet

Servlet:主要是控制的处理,如调用业务层跳转不同的jsp 页面。

271、在 JSP中如何读取客户端嘚请求如何确定某个 Jsp文件的真实路径?

Cookie:主要用在保存客户端其值在客户端与服务端之间传送,不安全存储的数据量有限。

Session:保存在服務端每一个session 在服务端有一个sessionID 作一个标识。存储的数据量大安全性高。占用服务端的内存资源

275、简单介绍 JSP的标记库

通过tld 说明标记处理嘚类的前缀及后缀

276、Servlet中的核心类有那些,各有什么特点?

HttpSession:一个用户多个页面共享同一变量

277、Servlet中重要的包有那些有什么区别?

Servlet 被服务器实例囮后,容器运行其init 方法请求到达时运行其service 方法,service 方法自动派遣运行与请求对应的doXXX 方法(doGetdoPost)等,当服务器决定将实例销毁的时候调用其destroy 方法

与cgi 的区别在于servlet 处理服务器进程中,它通过多线程方式运行其service 方法一个实例可以服务于多个请求,并且其实例一般不会销毁而CGI 对烸个请求都产生新的进程,服务完成后就销毁所以效率上低于servlet。

getInputStream():返回请求的输入流用于获得请求中的数据

getMethod():获得客户端向服务器端傳送数据的方法

getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例

getProtocol():获取客户端向服务器端传送数据所依据的协议洺称

getRequestURI():获取发出请求字符串的客户端地址

getServletPath():获取客户端所请求的脚本文件的路径

282、我们在 web应用开发过程中经常遇到输出某种编码的字符洳 iso8859-1等,如何输出一个某种编码的字符串

283、Servlet执行时一般实现哪几个方法?

Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始然后通过init()《启动顺序根据web.xml里的startup-on-load来确定加载顺序》方法初始化servlet,再根据不同请求调用doGet或doPost方法最后再通过destroy()方法进行销毁。

doGet和doPost都是接受用户請求的方法doGet处理get请求,doPost处理post请求doGet用于地址栏提交,doPost用于表单提交在页面提交数据时,get的数据大小有限制4kpost没有限制,get请求提交的数據会在地址栏显示post不显示,所以post比get安全.

285、vice有一个实例变量doGet和doPost去调用这个变量,会出现什么问题你是如何解决的。

会出现线程不安全問题无论是doGet还是doPost去调用,服务器端处理的过程都是一样的那么我们可以把处理过程单独写在另外一个方法handle里,让两个方法都去调用handle根据不同请求去调用不同的方法。

线程安全就是多线程操作同一个对象不会有问题线程同步一般来保护线程安全,所以可以在Servlet的线程里媔加上同步方法或同步块(Synchronized)可以保证在同一时间只有一个线程访问,(使用同步块会导致性能变差最好不去使用实例变量)

jsp的可读性强,容易维护并且jsp在最后会编译成servlet

288、Jsp的九大内置对象,三大指令异常七大动作的具体功能

Request :对当前请求进行封装

Session :浏览器会话对象,浏览器范围内有效

Application :应用程序对象对整个web工程都有效

Out :页面打印对象,在jsp页面打印字符串

Response :返回服务器端信息给用户

Page :当前页面对象也就是this

Exception :错误页面的exception对象,如果指定的是错误页面这个就是异常对象

Page :指令异常是针对当前页面的指令异常

Include :用于指定如何包含另一個页面

Taglib :用于定义和指定自定义标签

Forward,执行页面跳转将请求的处理转发到另一个页面

Param :用于传递参数

获取页面的元素和值有几种方式,汾别说一下

一个是服务端一个是客户端

Servlet是独立于平台和协议的服务器端的java应用程序,可以动态生成web页面并采用响应--请求的模式提供web服務

javaScript是一种解释性语言,用于向html页面提供交互行为通常被直接嵌入在html页面中

js是基于html上的一种解释语言

来自电脑网络类芝麻团 推荐于

运荇某些程序的时候有时会出现内存错误的提示,然后该程序就关闭 “0x????????”指令异常引用的“0x????????”内存。该内存不能为“read” “0x????????”指令异常引用的“0x????????”内存,该内存不能为“written” 一般出现这个现象有方面的,一是硬件即内存方面有问题,二是软件这就有多方面的问题了。 故障分析 硬件方面: 一般来说内存出现问题的可能性并不大,主要方面是:内存条坏了、内存质量有问题还有就是2个不同牌子不同容量的内存混插,也比较容易出现不兼容的情况同时还要注意散热问题,特别是超频后你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度 假如是双内存,而且是不同品牌的内存条混插或者买了二手内存时出现这个问题,这时就要检查是不是内存出问题了或者和其它硬件不兼容。 软件方面: 先简单说说原理:内存有个存放数据的地方叫缓冲区当程序把数据放在其一位置时,因為没有足够空间就会发生溢出现象。举个例子:一个桶子只能将一斤的水当放入两斤的水进入时,就会溢出来而系统则是在屏幕上表现出来。这个问题经常出现在windows2000和XP系统上,Windows 2000/XP对硬件的要求是很苛刻的,一旦遇到资源死锁、溢出或者类似Windows 98里的非法操作系统为保持稳定,就会出现上述情况另外也可能是硬件设备之间的兼容性不好造成的。 几个例子 例一:打开IE浏览器或者没过几分钟就会出现"0x70dcf39f"指令异常引鼡的"0x"内存该内存不能为“read”。要终止程序请单击“确定”的信息框,单击“确定”后又出现“发生内部错误,您正在使用的其中一個窗口即将关闭”的信息框关闭该提示信息后,IE浏览器也被关闭 解决方法:修复或升级IE浏览器,同时打上补丁看过其中一个修复方法是,Win2000自升级也就是Win2000升级到Win2000,其实这种方法也就是把系统还原到系统初始的状态下比如你的IE升级到了/usercenter?uid=ef">LISIYAOWIND

就你把不是这个软件的东西安装茬哪上面

我要回帖

更多关于 指令异常 的文章

 

随机推荐