分享知识 传递快乐

1.EhCache
EhCache是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
主要的特性有:
(1)快速,
(2)简单,
(3)多种缓存策略,
(4)缓存数据有两级:内存和磁盘,因此无需担心容量问题,
(5)缓存数据会在虚拟机重启的过程中写入磁盘,
(6)可以通过RMI、可插入API等方式进行分布式缓存,
(7)具有缓存和缓存管理器的侦听接口,
(8)支持多缓存管理器实例,以及一个实例的多个缓存区域,
(9)提供Hibernate的缓存实现,


2.OScache
主要的特性有:
缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。
拥有全面的API--OSCacheAPI给你全面的程序来控制所有的OSCache特性。
永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。
支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。
缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)


3.谈谈你mvc的理解
MVC是Model-View-Controler的简称。即模型-视图-控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。
MVC中的模型、视图、控制器它们分别担负着不同的任务。
视图:视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
模型:模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性
控制器:当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。
然后根据处理的结果调用相应的视图来显示处理的结果。
MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。


4.你一般用spring做什么?
控制反转IOCAOP


5.spring是什么?根据你的理解详细谈谈你的见解。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用


简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
轻量--从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
控制反转--Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反--不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面--Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发。应用对象只实现它们应该做的--完成业务逻辑--仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
容器--Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建--基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例--以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架--Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。


6.什么是spring?
Spring是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。


7.谈谈你对Spring的理解。
Spring是实现了工厂模式的工厂类(在这里有必要解释清楚什么是工厂模式),这个类名为BeanFactory(实际上是一个接口),在程序中通常BeanFactory的子类ApplicationContext。Spring相当于一个大的工厂类,在其配置文件中通过<bean>元素配置用于创建实例对象的类名和实例对象的属性。
Spring提供了对IOC良好支持,IOC是一种编程思想,是一种架构艺术,利用这种思想可以很好地实现模块之间的解耦,IOC也称为DI(DepencyInjection)。
Spring提供了对AOP技术的良好封装,AOP称为面向切面编程,就是系统中有很多各不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入权限判断,加入异常处理,这种应用称为AOP。
实现AOP功能采用的是代理技术,客户端程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明,有两种方式可以实现相同的方法声明,一是实现相同的接口,二是作为目标的子类。
在JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类,如果要为某个类生成子类,则可以用CGLIB。在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以Advice对象进行提供,显然要创建出代理对象,至少需要目标类和Advice类。spring提供了这种支持,只需要在spring配置文件中配置这两个元素即可实现代理和aop功能。
(以上,也可以结合自己使用感受谈自己的看法)


8.使用Spring框架的好处是什么?
轻量:Spring是轻量的,基本的版本大约2MB。
控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器:Spring包含并管理应用中对象的生命周期和配置。
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
异常处理:Spring提供方便的API把具体技术相关的异常(比如由JDBC,HibernateorJDO抛出的)转化为一致的unchecked异常。


9.项目中如何体现Spring中的切面编程,距离说明。
面向切面编程:主要是横切一个关注点,将一个关注点模块化成一个切面。在切面上声明一个通知(Advice)和切入点(Pointcut);通知:是指在切面的某个特定的连接点(代表一个方法的执行。通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。)上执行的动作。通知中定义了要插入的方法。切入点:切入点的内容是一个表达式,以描述需要在哪些对象的哪些方法上插入通知中定义的方法。
项目中用到的Spring中的切面编程最多的地方:声明式事务管理。
a、定义一个事务管理器
b、配置事务特性(相当于声明通知。一般在业务层的类的一些方法上定义事务)
c、配置哪些类的哪些方法需要配置事务(相当于切入点。一般是业务类的方法上)


10.什么是SpringIOC容器?
SpringIOC负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。


11.IOC的优点是什么?
IOC或依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。


12.什么是Spring的依赖注入?
依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。


13.有哪些不同类型的IOC(依赖注入)方式?
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。


14.哪种依赖注入方式你建议使用,构造器注入,还是Setter方法注入?
你两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。


15.解释AOP
面向切面的编程,或AOP,是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。


SpringBoot
16.什么是SpringBoot
描述:SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目。大多数SpringBoot项目只需要很少的配置文件。


17.SpringBoot核心功能
独立运行Spring项目:Springboot可以以jar包形式独立运行,运行一个SpringBoot项目只需要通过java-jarxx.jar来运行。
内嵌servlet容器:SpringBoot可以选择内嵌Tomcat、jetty或者Undertow,这样我们无须以war包形式部署项目。
提供starter简化Maven配置:spring提供了一系列的startpom来简化Maven的依赖加载,例如,当你使用了spring-boot-starter-web,会自动加入如图5-1所示的依赖包。
自动装配Spring:SpringBoot会根据在类路径中的jar包,类、为jar包里面的类自动配置Bean,这样会极大地减少我们要使用的配置。当然,SpringBoot只考虑大多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean,而SpringBoot灭有提供支持,则可以自定义自动配置。
准生产的应用监控:SpringBoot提供基于httpsshtelnet对运行时的项目进行监控。
无代码生产和xml配置:SpringBoot不是借助与代码生成来实现的,而是通过条件注解来实现的,这是Spring4.x提供的新特性。


18.SpringBoot优缺点
优点:
(1)快速构建项目。
(2)对主流开发框架的无配置集成。
(3)项目可独立运行,无须外部依赖Servlet容器。
(4)提供运行时的应用监控。
(5)极大的提高了开发、部署效率。
(6)与云计算的天然集成。
缺点:
如果你不认同spring框架,也许这就是缺点。


19.SpringBoot特性
(1)创建独立的Spring项目
(2)内置Tomcat和Jetty容器
(3)提供一个starterPOMs来简化Maven配置
(4)提供了一系列大型项目中常见的非功能性特性,如安全、指标,健康检测、外部配置等
(5)完全没有代码生成和xml配置文件


20.SpringBootCLI
SpringBootCLI是SpringBoot提供的控制台命令工具。


21.SpringBoot几个常用的注解
(1)@RestController和@Controller指定一个类,作为控制器的注解
(2)@RequestMapping方法级别的映射注解,这一个用过SpringMVC的小伙伴相信都很熟悉
(3)@EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置SpringMVC和tomcat容器
(4)@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类,完成元数据bean的初始化。
(5)@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上
(6)@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。
(7)@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean
(8)@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,SpringBoot才会正确识别。


22.简单说下你对SpringCloud的理解
SpringCloud是Pivotal提供的用于简化分布式系统构建的工具集。SpringCloud引入了云平台连接器(CloudConnector)和服务连接器(ServiceConnector)的概念。云平台连接器是一个接口,需要由云平台提供者进行实现,以便库中的其他模块可以与该云平台协同工作。
SpringCloud最重要的一点是它可以和SpringBoot一起工作,SpringBoot可以帮助开发者更容易地创建基于Spring的应用程序和服务。
从SpringBoot项目名称中的Boot就可以看出来,SpringBoot的作用在于创建和启动新的基于Spring框架的项目。SpringBoot会选择最适合的Spring子项目和第三方开源库进行整合。大部分SpringBoot应用只需要非常少的配置就可以快速运行起来。SpringBoot包含的特性如下:
(1)创建可以独立运行的Spring应用。
(2)直接嵌入Tomcat或Jetty服务器,不需要部署WAR文件。
(3)提供推荐的基础POM文件来简化ApacheMaven配置。
(4)尽可能的根据项目依赖来自动配置Spring框架。
(5)提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查。
(6)没有代码生成,也没有XML配置文件。
(7)服务发现和智能路由
(8)每一个服务都含有一个特定意义的微服务架构。
(9)也可以根据自己扩展学习的再多多发挥,不说则已,说则正确。


23.谈谈你对Hibernate的理解。
面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象、建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化。
为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库来保存大量对象信息。从Java程序的运行功能上来讲,保存对象状态的功能相比系统运行的其他功能来说,应该是一个很不起眼的附属功能,java采用jdbc来实现这个功能,这个不起眼的功能却要编写大量的代码,而做的事情仅仅是保存对象和恢复对象,并且那些大量的jdbc代码并没有什么技术含量,基本上是采用一套例行公事的标准代码模板来编写,是一种苦活和重复性的工作。
通过数据库保存java程序运行时产生的对象和恢复对象,其实就是实现了java对象与关系数据库记录的映射关系,称为ORM(即ObjectRelationMapping),人们可以通过封装JDBC代码来实现了这种功能,封装出来的产品称之为ORM框架,Hibernate就是其中的一种流行ORM框架。使用Hibernate框架,不用写JDBC代码,仅仅是调用一个save方法,就可以将对象保存到关系数据库中,仅仅是调用一个get方法,就可以从数据库中加载出一个对象。
使用Hibernate的基本流程是:配置Configuration对象、产生SessionFactory、创建session对象,启动事务,完成CRUD操作,提交事务,关闭session。
使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库连接信息和方言等,还要为每个实体配置相应的hbm.xml文件,hibernate.cfg.xml文件中需要登记每个hbm.xml文件。
在应用Hibernate时,重点要了解Session的缓存原理,级联,延迟加载和hql查询。
(以上,也可以结合自己使用JDBC时的繁琐谈hibernate的感受)


24.iBatis与Hibernate有什么不同?
相同点:屏蔽jdbcapi的底层访问细节,使用我们不用与jdbcapi打交道,就可以访问数据。
jdbcapi编程流程固定,还将sql语句与java代码混杂在了一起,经常需要拼凑sql语句,细节很繁琐。
ibatis的好处:屏蔽jdbcapi的底层访问细节;将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。
Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,ibatis需要我们自己在xml配置文件中写sql语句,hibernate要比ibatis功能负责和强大很多。因为hibernate自动生成sql语句,我们无法控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用ibatis就是不错的选择,因为ibatis还是由我们自己写sql语句。


25.在hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决?
解决方案一,:按照Object[]数据取出数据,然后自己组bean
解决方案二:对每个表的bean写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1filed1,type2field2),然后在hql里面就可以直接生成这个bean了。


26.介绍一下Hibernate的二级缓存
按照以下思路来回答:
(1)首先说清楚什么是缓存
(2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存
(3)最后再说如何配置Hibernate的二级缓存。
缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似HashMap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。
Hibernate的Session就是一种缓存,我们通常将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。
由于Session代表一次会话过程,一个Session与一个数据库连接相关连,所以Session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关闭。并且Session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,因此,Hibernate的Session这一级缓存的缓存作用并不明显,应用价值不大。Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存。我们希望的是一个人使用过,其他人也可以使用,session没有这种效果。
二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起Hibernate的二级缓存。
扩展知识:一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。


27.Hibernate工作原理及为什么要用?
原理:读取并解析配置文件;读取并解析映射信息,创建SessionFactory;打开Session;创建事务Transation;持久化操作;提交事务;关闭Session;关闭SesstionFactory。
为什么要用:
对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码;
Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作;
hibernate使用Java反射机制,而不是字节码增强程序来实现透明性;
hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。


28.tomcat给你你怎样去调优?
(1)JVM参数调优:表示JVM初始化堆的大小。建议堆的最大值设置为可用内存的最大值的80%左右,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。
(2)禁用DNS查询:当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值。
(3)调整线程数:通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。


29.请解释Tomcat中使用的连接器是什么?
在Tomcat中,使用了两种类型的连接器:
(1)HTTP连接器:它有许多可以更改的属性,以确定它的工作方式和访问功能,如重定向和代理转发
(2)AJP连接器:它以与HTTP连接器相同的方式工作,但是他们使用的是HTTP的AJP协议。AJP连接器通常通过插件技术mod_jk在Tomcat中实现


30.解释如何使用WAR文件部署web应用程序?
在Tomcat的web应用程序目录下,jsp、servlet和它们的支持文件被放置在适当的子目录中。你可以将web应用程序目录下的所有文件压缩到一个压缩文件中,以.war文件扩展名结束。你可以通过在webapps目录中放置WAR文件来执行web应用程序。当一个web服务器开始执行时,它会将WAR文件的内容提取到适当的webapps子目录中。


31.Tomcat的缺省是多少,怎么修改?
Tomcat的缺省端口号是8080,修改Tomcat端口号:
(1)找到Tomcat目录下的conf文件夹
(2)进入conf文件夹里面找到server.xml文件
(3)打开server.xml文件
(4)在server.xml文件里面找到下列信息


32.tomcat有那几种Connector运行模式?
tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态。
(1)bio:默认的模式,性能非常低下,没有经过任何优化处理和支持.
(2)nio:利用java的异步io护理技术,noblockingIO技术.
(3)apr:安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能,必须要安装apr和native,直接启动就支持apr。下面的修改纯属多余,仅供大家扩充知识,但仍然需要安装apr和native。如nio修改模式,修改protocol为org.apache.coyote.http11.Http11AprProtocol。


33.Tomcat有几种部署方式?
tomcat中四种部署项目的方法
第一种方法:
在tomcat中的conf目录中找到server.xml中的,修改Context节点属性。
第二种方法:
将web项目文件件拷贝到webapps目录中。
第三种方法:
很灵活,在conf目录中,新建Catalina(注意大小写)\localhost目录,在该目录中新建一个xml文件,名字可以随意取,只要和当前文件中的文件名不重复就行了。
第3个方法有个优点,可以定义别名。服务器端运行的项目名称为path,外部访问的URL则使用XML的文件名。这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径,非常有效。
第2、3还有优点,可以定义一些个性配置,如数据源的配置等。
第四种办法,:

可以用tomcat在线后台管理器,一般tomcat都打开了,直接上传war就可以。



34.Redis和MongoDB,MySQL


Redis是完全在内存中保存数据的数据库,使用磁盘只是为了持久性目的,Redis数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的LRU算法删除数据,持久化是使用RDB方式或者aof方式。


MongoDB是文档型的非关系型数据库,MongoDB更类似MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询JSON数据,能存储海量数据,但是不支持事务。


MongoDB的所有数据实际上是存放在硬盘的,所有要操作的数据通过mmap的方式映射到内存某个区域内。


然后,MongoDB就在这块区域里面进行数据修改,避免了零碎的硬盘操作。


至于mmap上的内容flush到硬盘就是操作系统的事情了,所以,如果,MongoDB在内存中修改了数据后,mmap数据flush到硬盘之前,系统宕机了,数据就会丢失。




MySQL无论数据还是索引都存放在硬盘中。到要使用的时候才交换到内存中。能够处理远超过内存总量的数据。


数据量和性能:


当物理内存够用的时候,Redis>MongoDB>MySQL


当物理内存不够用的时候,Redis和MongoDB都会使用虚拟内存。


实际上如果Redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。


但是,MongoDB不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。


MongoDB还是能够保证性能。有人使用mongodb存储了上T的数据。


MySQL根本就不需要担心数据量跟内存的关系。


Redis事务支持比较弱,只能保证事务中的每个操作连续执行


mongodb不支持事务



MongoDB内置了数据分析的功能(mapreduce),Redis不支持



Redis只能使用单线程,性能受限于CPU性能




35.MySQL的复制原理以及流程


基本原理流程,3个线程以及之间的关联;


(1)主:binlog线程--记录下所有改变了数据库数据的语句,放进master上的binlog中。


(2)从:io线程--在使用startslave之后,负责从master上拉取binlog内容,放进自己的relaylog中。


(3)从:sql执行线程--执行relaylog中的语句。




36.MySQL中myisam与innodb的区别,至少5点


(1)问5点不同;


A.InnoDB支持事物,而MyISAM不支持事物;


B.InnoDB支持行级锁,而MyISAM支持表级锁;


C.InnoDB支持MVCC,而MyISAM不支持;


D.InnoDB支持外键,而MyISAM不支持;


E.InnoDB不支持全文索引,而MyISAM支持。


(2)innodb引擎的4大特性


插入缓冲(insertbuffer),二次写(doublewrite),自适应哈希索引(ahi),预读(readahead)。


(3)2者selectcount(*)哪个更快,为什么?


myisam更快,因为myisam内部维护了一个计数器,可以直接调取。




37.MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义


(1)varchar与char的区别


char是一种固定长度的类型,varchar则是一种可变长度的类型。


(2)varchar(50)中50的涵义


最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为orderbycol采用fixed_length计算col长度(memory引擎也一样)。


(3)int(20)中20的涵义


是指显示字符的长度,但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0,20表示最大显示宽度为20,但仍占4字节存储,存储范围不变。


(4)mysql为什么这么设计


对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样。




38.问了innodb的事务与日志的实现方式


(1)有多少种日志;


A.错误日志:记录出错信息,也记录一些警告信息或者正确的信息。


B.查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。


C.慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。


E.二进制日志:记录对数据库执行更改的所有操作。


F.中继日志:


G.事务日志:


(2)事物的4种隔离级别


隔离级别;读未提交(RU);读已提交(RC);可重复读(RR);串行。


(3)事务是如何通过日志来实现的,说得越深入越好。


事务日志是通过redo和innodb的存储引擎日志缓冲(Innodblogbuffer)来实现的,当开始一个事务的时候,会记录该事务的lsn(logsequencenumber)号;当事务执行时,会往InnoDB存储引擎的日志的日志缓存里面插入事务日志;当事务提交时,必须将存储引擎的日志缓冲写入磁盘(通过innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志。这种方式称为"预写日志方式"。




39.表中有大字段X(例如:text类型),且字段X不会经常更新,以读为为主,请问您是选择拆成子表,还是继续放一起;写出您这样选择的理由。


答:拆带来的问题:连接消耗+存储拆分空间;不拆可能带来的问题:查询性能;如果能容忍拆分带来的空间问题,拆的话最好和经常要查询的表的主键在物理结构上放置在一起(分区)顺序IO,减少连接消耗,最后这是一个文本列再加上一个全文索引来尽量抵消连接消耗。


如果能容忍不拆分带来的查询性能损失的话:上面的方案在某个极致条件下肯定会出现问题,那么不拆就是最好的选择




40.存储过程与触发器的区别?


触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用Execute语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。




41.工厂模式


主要解决:主要解决接口选择的问题。


优点:


(1)一个调用者想创建一个对象,只要知道其名称就可以了。


(2)扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。


(3)屏蔽产品的具体实现,调用者只关心产品的接口。


缺点:


每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。


使用场景:


(1)日志记录器


(2)数据库访问




42.单例模式


注意:


(1)单例类只能有一个实例。


(2)单例类必须自己创建自己的唯一实例。


(3)单例类必须给所有其他对象提供这一实例。


主要解决:一个全局使用的类频繁地创建与销毁。


优点:


(1)在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。


(2)避免对资源的多重占用(比如写文件操作)。


缺点:


没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。




43.迭代器模式


意图:提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示。


主要解决:不同的方式来遍历整个整合对象。


何时使用:遍历一个聚合对象。


如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。


关键代码:定义接口:hasNext,next。


应用实例:JAVA中的iterator。


优点:


(1)它支持以不同的方式遍历一个聚合对象。


(2)迭代器简化了聚合类。


(3)在同一个聚合上可以有多个遍历。


(4)在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。


缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。


使用场景:


(1)访问一个聚合对象的内容而无须暴露它的内部表示。


(2)需要为聚合对象提供多种遍历方式。


(3)为遍历不同的聚合结构提供一个统一的接口。




注意事项:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。




44.代理模式


在代理模式(ProxyPattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。


意图:为其他对象提供一种代理以控制对这个对象的访问。


主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。


何时使用:想在访问一个类时做一些控制。


如何解决:增加中间层。


关键代码:实现与被代理类组合。


应用实例:


(1)Windows里面的快捷方式。


(2)猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。


(3)买火车票不一定在火车站买,也可以去代售点。


(4)一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。


(5)springaop。


优点:职责清晰;高扩展性;智能化。


缺点:


(1)由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。


(2)实现代理模式需要额外的工作,有些代理模式的实现非常复杂。


使用场景:


按职责来划分,通常有以下使用场景:远程代理、虚拟代理、Copy-on-Write代理、保护(ProtectorAccess)代理、Cache代理、防火墙(Firewall)代理、同步化(Synchronization)代理、智能引用(SmartReference)代理。


注意事项:


(1)和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。


(2)和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。




45.中介者模式


中介者模式(MediatorPattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。


意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。


主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。


何时使用:多个类相互耦合,形成了网状结构。


如何解决:将上述网状结构分离为星型结构。


关键代码:对象Colleague之间的通信封装到一个类中单独处理。


应用实例:


(1)中国加入WTO之前是各个国家相互贸易,结构复杂,现在是各个国家通过WTO来互相贸易。


(2)机场调度系统。


(3)MVC框架,其中C(控制器)就是M(模型)和V(视图)的中介者。


优点:


(1)降低了类的复杂度,将一对多转化成了一对一。


(2)各个类之间的解耦。


(3)符合迪米特原则。


缺点:中介者会庞大,变得复杂难以维护。


使用场景:


(1)系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。


(2)想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。


注意事项:不应当在职责混乱的时候使用。