发表于: 2020-10-29 23:58:17

1 1558


1.JVM运行以及内存分配   
Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。
在Java程序运行过程中,JVM定义了各种区域用于存储运行时数据。其中的有些数据区域在JVM启动时创建,并只在JVM退出时销毁;其它的数据区域与每个线程相关。这些数据区域,在线程创建时创建,在线程退出时销毁。

Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。

内存分配有点难以看懂。
 
2.jdbc连接池原理及分析   

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。

 

3.Mybatis有哪些常用标签?怎么使用标签来完成动态查询? 
定义sql语句标签:select查找,insert增加,delete删除,update增加
1.if: 起一个判断的作用,即你传入什么条件它就查询对应的信息,,从而就可以过滤掉空值.
 2..choose(when,otherwise): 有时候,我们不想用所有的条件语句,而只是只想从中选择一个,mybatis提供choose,类似于switch语句

3.where:  where元素知道只有一个以上的if条件有值的情况下才去插入where子句,若有“AND"或者"OR"开头,则where元素也会去将他们删除

4.set(用于智能执行更新语句):  set元素会动态设置前置的set关键字,同时也会消除无关的逗号
   
4.什么叫反射?反射的坏处是什么?有哪些反射的应用场景?    
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
优点:运行期类型的判断,动态加载类,提高代码灵活度。
缺点:性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多。
使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;spring的动态代理, Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息


5.什么是SVN,小乌龟是什么,SVN的文件版本号是怎么来的,哪些文件应该上传到SVN,哪些不该上传?Git和SVN的区别又是什么?    

Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。

进行svn操作需要记住很多操作命令,而且每次都要重复输入。小乌龟就是这样一个简化svn操作的软件。极大的方便了svn操作。

每次提交创建一个新的版本,版本号会自动修改。之所以需要版本号是因为我们需要多人协作开发的时候,解决以下列问题:1.备份多个版本,占用磁盘空间大  2.解决代码冲突困难  3.追溯问题代码的修改人和修改时间  4.难于恢复至以前正确版本  5.无法进行权限控制   6.容易引发BUG,项目版本发布困难

最核心的区别,svn是集中式管理的版本服务器,Git是分布式管理的版本服务器。svn有一个中心服务器管理保存所有文件的修订版本,而Git每一个终端就是一个仓库,客户端并不只提取最新版本的快照,而是把原始的代码仓库完整地镜像下来。每一次的提取操作,实际上都是一次对代码仓库的完整备份。svn需要联网才能操作,而git不需要,git可以在本地仓库进行操作,联网是push上去就好了。svn的权限控制比较严格,可以按组、个人针对某个子目录的权限控制(每个目录下都会有个.svn的隐藏文件)。而git没有严格的权限管理控制,只有账号角色划分(在项目的home文件下有且只有一个.svn目录)。


6.什么是AOP,适用于哪些场景,AOP的实现方案有哪些? 

 这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。AOP是Spring提供的关键特性之一。AOP即面向切面编程,是OOP编程的有效补充。使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。 
场景一: 记录日志
场景二: 监控方法运行时间 (监控性能)
场景三: 权限控制
场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
场景五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )
1、JDK动态代理
2、Cglib动态代理


7.Map,List,Array,Set之间的关系是什么,分别适用于哪些场景,集合大家族还有哪些常见的类?    

List:List接口是有序的,会精确的将元素插入到指定的位置,和下面的Set接口不同,List接口允许有相同元素
Array:是所以随机访问一串对象中,最有效率的一种,但是元素类型必须相同,且容量固定无法改变。
Set:是一种不包含重复元素的Collection接口
Map:此接口实现的Key到Value的映射,一个Map中不能包含相同的Key,每个Key只能映射一个Value


8.Spring的IOC有几种方式?它们之间的差别是什么,应该选择Annonation还是应该选择XML?    

有两种方式,XML和Annotation。接口注入;setter方法注入;构造方法注入;

接口注入:
接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。

Setter 注入:
通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。

构造器注入:
在构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。
Spring boot以后,更推荐使用Annotation


9..JDBCTemplate和JDBC  

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,
可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
JdbcTemplate,就是模板,是Spring框架为我们提供的。
所以JDBCTemplate就是Spring对JDBC的封装,通俗点说就是Spring对jdbc的封装的模板。
区别:
jdbc需要每次进行数据库连接, 然后处理SQL语句,传值,关闭数据库。
甚至有时还可能会出现数据库忘记关闭导致连接被占用。
在以后的工作中,客户的需求肯定不是一成不变的,这就导致经常会改动数据库内容。
通过JDBCtemplate我们只需更改需要更改的那一部分内容就可以了,不需要进行全局修改。
Spring将替我们完成所有的JDBC底层细节处理工作。  


10.为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么? 

接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体现了“如果你是……则必须能……”的理念。是一种规范。具体的实现交给实现类,更方便大家统一标准。在一个程序中,不同部分的源代码是不同的人写的。   


11.为什么要处理异常,Try/Catch应该在什么样的场景下使用,在真实的系统中,会出现网络中断,DB连接不上的错误吗?多久会发 生一次?

try/catch是java程序员经常用的程序块,怎么用,什么时候catch异常,什么时候抛出异常?用不好,程序可能会有致命性错误。

使用的基本原则

对异常的处理,两种方式,一是添加 throws exceptions,向上抛出,交由方法的调用方处理该异常;二是使用try/catch块,捕捉异常,自己处理。

选择哪种方式,取决于异常应该怎么处理。

使用抛出异常的情景主要有:

1. 异常必须由容器来处理,异常时容器做出不同处理的依据和触发;

例如:有事务处理的方法中,事务相关的逻辑必须抛出异常,而不能捕获异常,否则会导致事务不回滚。

2. 本地方法不知道如何处理,只有调用方才可能知道如何处理异常;

例如:一些底层的方法,其可能出现多种异常,且调用方可能根据不同的异常做出不同的处理,只能抛出异常,而且必须是具体的异常类型,而不能是笼统的Exception类型。

使用try/catch捕获异常的情景主要有:

1. 程序块中语句可能的异常不能引起其他逻辑中断;

例如:缓存逻辑不能影响正常的逻辑运行,故缓存逻辑应该放在try/catch块中。

2. 必须对异常进行处理,否则会降低用户使用体验。

例如:异常到了Controller层,若不处理则会返回404或500错误页面,因此,必须使用try/catch处理各种异常。

如果出现DB断开---->一般是开销太大才会DB断开,一般很少发生

正常状况下mysql对于空闲的链接可能会8小时自动关闭。    


12.日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?  

通常一个类只有一个 LOG 对象,如果有父类可以将 LOG 定义在父类中。
日志变量类型定义为门面接口(如 slf4j 的 Logger),实现类可以是log4j、logback等日志实现框架,不要把实现类定义为变量类型,否则日志切换不方便,也不符合抽象编程思想。
使用参数化形式{}占位,[]进行参数隔离
这样一看就知道[]里面是输出的动态参数,{}用来占位类似绑定变量,而且只有真正准备打印的时候才会处理参数,方便定位问题。
输出不同级别的日志

最常用的即是error,warn,info,debug四种了  

模块运行日志:模块运行日志包括消息队列的监控、线程的运行状态。该日志应该以INFO级别打印,并且采用间隔打印,或叫做定时打印。以减少日志打印总量。从该角度可以反应出该模块是否有消息队列积压,是否所有线程都运行正常。消息队列的打印可以采用日下格式:

使用统一的关键字Monitor来标示模块运行日志。队列监控日志使用|队列名|消息放入速度|消息取出速度|消息放入个数|消息取出个数|当前队列消息个数|。线程监控日志使用|线程名|线程状态码|,线程状态码可以自己扩展。0表示正常1表示运行结束2表示线程阻塞。

业务日志:业务日志打印用户请求流程,能够清楚的使用某几个关键字可以提取一个用户的业务流程就可以。业务日志要分详细日志,如上BossAgent打印的日志,非常详细,应该都打印DEBUG级别的日志,而另外就需要打印总结性日志,总结性日志以INFO级别打印,包括|请求开始时间|请求结束时间|请求主体|请求类型|请求结果|请求外部资源返回结果|。其中请求主体可以继续扩展,如BossAgent的请求主体可以扩展为|手机号码|省份编码|MM2消息SEQUENCE|,DSS的请求主体可能属性更多一些,|手机号码|手机密码|手机UA|手机MOD|手机MAN|计费类型|套餐类型|白名单|。

模块性能日志:模块的性能日志应该能够通过该日志清晰的反应该模块目前性能,包括外部请求的压力,内部请求处理速度。

模块外部资源日志:模块的外部资源日志需要详细记录,现今单独的模块很少见了,很多大型复杂的系统往往是由多个模块构成,模块间采用或标准或私有协议进行通信。这种场景下爆发的问题往往比较复杂,并且与多个模块都有关系或是责任。所以在模块级别上将该模块所依赖的外部资源都打印出来非常重要,通过这些日志应该能够完成快速定位问题与哪些模块相关联或是哪些模块需要负根本责任。通常模块的外部资源包括数据库,系统间内部模块、第三方系统。如BossAgent的外部资源包括数据库,系统间内部模块为PSS、第三方系统应该是一级Boss。数据库资源的打印应该包括所有的SQL语句,这个非常重要,无论是问题的定位还是后续的SQL优化,还是数据库架构的调整,都需要这些信息能够快读的整理出该模块所有的SQL语句,提供给专业的DBA进行分析。SQL语句的打印还应该包括参数的打印。




13.为什么需要单步调试?Debug的时候IDE是怎么找到源码的?    

单步调试是指程序开发中,为了找到程序的bug,通常采用的一种调试手段,一步一步跟踪程序执行的流程,根据变量的值,找到错误的原因。


14.可否远程连接到线上直接调试?真实的项目中,遇到问题的排查方案是什么?    

可以,查看日志的打印的异常


15.Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?   

控制反转(Inversion of Control) 就是依赖倒置原则的一种代码设计的思路。具体采用的方法就是所谓的依赖注入(Dependency Injection) 

什么是依赖倒置原则?假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底盘设计车身,最后根据车身设计好整个汽车。这里就出现了一个“依赖”关系:汽车依赖车身,车身依赖底盘,底盘依赖轮子。

但这时候你如果需要修改轮子大小,那么底盘,车身,汽车整个都需要修改。

而依赖倒置是:先定汽车,在来设计车身,底盘,最后设计轮子,这样轮子的修改不会影响到整个汽车的修改。

依赖注入,就是把底层类作为参数传入上层类,实现上层类对下层类的“控制”。这里我们用构造方法传递的依赖注入方式重新写车类的定义。


1.增加耦合,会访问到内部属性
2.更新的地方比较多,难于维护


16.什么是贫血模型,什么是充血模型?为什么我们会强制要求使用贫血模型?    

领域模型是领域内的概念类或现实世界中对象的可视化表示,又称为概念模型或分析对象模型,它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。

贫血模型是指使用的领域对象中只有setter和getter方法(POJO),所有的业务逻辑都不包含在领域对象中而是放在业务逻辑层。有人将我们这里说的贫血模型进一步划分成失血模型(领域对象完全没有业务逻辑)和贫血模型(领域对象有少量的业务逻辑),我们这里就不对此加以区分了。充血模型将大多数业务逻辑和持久化放在领域对象中,业务逻辑(业务门面)只是完成对业务逻辑的封装、事务和权限等的处理。

贫血模型和充血模型的分层架构。更加细粒度的有失血模型,贫血模型,充血模型,胀血模型。贫血模型就是domain ojbect包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到Service层。失血模型简单来说,就是domain object只有属性的getter/setter方法的纯数据类,所有的业务逻辑完全由business object来完成(又称Transaction Script),这种模型下的domain object被Martin Fowler称之为“贫血的domain object”。

充血模型和第二种模型差不多,所不同的就是如何划分业务逻辑,即认为,绝大多业务逻辑都应该被放在domain object里面(包括持久化逻辑),而Service层应该是很薄的一层,仅仅封装事务和少量逻辑,不和DAO层打交道。

贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。

优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Business Logic->Data Access(ADO.NET)。当然Business Logic是依赖Domain Object的。似乎现在流行的架构就是这样,当然层次还可以细分。

该模型的缺点是不够面向对象,领域对象只是作为保存状态或者传递状态使用,所以就说只有数据没有行为的对象不是真正的对象。在Business Logic里面处理所有的业务逻辑,在POEAA(企业应用架构模式)一书中被称为Transaction Script模式。

充血模型:层次结构和上面的差不多,不过大多业务逻辑和持久化放在Domain Object里面,Business Logic只是简单封装部分业务逻辑以及控制事务、权限等,这样层次结构就变成Client->(Business Facade)->Business Logic->Domain Object->Data Access。

优点是面向对象,Business Logic符合单一职责,不像在贫血模型里面那样包含所有的业务逻辑太过沉重。

缺点是如何划分业务逻辑,什么样的逻辑应该放在Domain Object中,什么样的业务逻辑应该放在Business Logic中,这是很含糊的。即使划分好了业务逻辑,由于分散在Business Logic和Domain Object层中,不能更好的分模块开发。熟悉业务逻辑的开发人员需要渗透到Domain Logic中去,而在Domian Logic又包含了持久化,对于开发者来说这十分混乱。 其次,因为Business Logic要控制事务并且为上层提供一个统一的服务调用入口点,它就必须把在Domain Logic里实现的业务逻辑全部重新包装一遍,完全属于重复劳动。


17.clean,install,package,deploy分别代表什么含义?  

clean 可将根目录下生成的target文件移除,(清除所有编译结果或者打包结果)
install 项目安装到本地仓库了,并且是jar和pom同时安装。 
package 项目打包到项目的target目录下。java项目生成 jar包, web项目生成war包  
deploy 是将jar包上传远程库的命令。  


18.怎么样能让Maven跳过JUnit?   

Maven打包项目为什么要跳过测试?

答:执行maven打包发布项目时,如果测试类中有测试用例代码,打包maven默认会将测试用例一起编译,编译不通过则会报错。且容易对数据库的数据造成影响。

在pom.xml的build中添加

 

可使用mvn命令

(1) mvn install -Dmaven.test.skip=true 

(2) mvn install -DskipTests

在执行run as时候加上参数:

clean install compile -Dmaven.test.skip=true

配置IDEA


19.为什么要用Log4j来替代System.out.println?    

1. Log4j就是帮助开发人员进行日志输出管理的API类库。它最重要的特点就可以配置文件灵活的设置日志信息的优先级、日志信息的输出目的地以及日志信息的输出格式。

2. Log4j除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。

3. 程序员经常会遇到脱离java ide环境调试程序的情况,这时大多数人会选择使用System.out.println语句输出某个变量值的方法进行调试。这样会带来一个非常麻烦的问题:一旦哪天程序员决定不要显示这些System.out.println的东西了就只能一行行的把这些垃圾语句注释掉。若哪天又需调试变量值,则只能再一行行去掉这些注释恢复System.out.println语句。

使用log4j可以很好的处理类似情况。


20.为什么DB的设计中要使用Long来替换掉Date类型?    

Long类型方便传输与增改,date有点事直观,而在数据库中的时间往往不会直接提取给用户,数据库中的时间用来保存数据创建修改的时间戳。如create_at、update_at这种不会被用户直接读取的字段,就可以用long来提高效率。
将date类型转换为long类型
1.有利于计算时间差
2.方便java与数据库之间的传输
3.编码实战可以通过long login_at = System.currentTimeMillis()获得当前时间的long类型 也可以通过Date date1=new Date()来获得当前时间,再用long time=date1.getTime()将其转化为long类型。然后在数据库中的相应字段设置类型为bigint即可,在数据库中取得数据后,可以在转为相应的时间格式。


21.自增ID有什么坏处?什么样的场景下不使用自增ID?  

自增id首先需要是表的主键,在删除一行记录后,id也随之删除,但之后添加的一行记录中的id会在被删除的id后+1,而不是保持id连续性。正是因为自增ID的缺点也就是无法在多个表中,或者多个数据库中保持ID主键唯一不重复,所以若是使用分布式数据库以及数据合并的情况下时不能使用自增ID的。若是能够有其他的字段能作为主键保证唯一性,无需使用自增ID,在需要该字段保持连续性的时候,不会使用自增id。
  
22.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?    
索引是一种树状结构,其中存储了关键字和指向包含关键字所在记录的数据页的指针。当使用索引查找时,系统沿着索引的树状结构,根据索引中关键字和指针,找到符合查询条件的的记录。最后,将全部查找到的符合查询语句条件的记录显示出来。 
在数据量达到几万时,性能差别就比较直观。
1、装载数据后再建立索引。
2、频繁搜索的列可以作为索引。
3、在联接属性上建立索引(主外键)。
4、经常排序分组的列。
5、删除不经常使用的索引
6、指定索引块的参数,如果将来会在表上执行大量的insert操作,建立索引时设定较大的ptcfree。
7、指定索引所在的表空间,将表和索引放在不同的表空间上可以提高性能。


23.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。 

普通索引
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。 
因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。 
只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。 
mysql > ALTER TABLE {table_name} ADD INDEX index_name ( {column} )
唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。 
在对该列进行增或改时,首先会检查是否重复,在执行增改操作,否则报出duplica错误,拒绝操作。 
mysql > ALTER TABLE {table_name} ADD UNIQUE index_name ( {lolumn} )
   
24.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?    
是的,唯一索引,在进行增改操作时,会检查是否重复来保证唯一性。
25.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?    

create_at是在行插入时以当时的时间为值插入。
update_at实在行一旦被修改的时候,以当时时间为值插入。
这两个字段做为数据的属性,不该该调用给外部的接口。


26.修真类型应该是直接存储Varchar,还是应该存储int?   

修真类型用varchar不如用int查询效率高,但是用int需要对每个特定的值做一个对应修真类型的映射或定义。
 
27.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?    

什么是VARCHAR、Text、LongText?

它们都是MySQL数据库的字符串类型,用来存储字符数据。区别是存储的数据长度、大小不一样。我们可以根据需求选择使用哪种字符串类型。

在字符长度不超过255时 使用一个字节存储长度

超过255时用两个字节存储长度

每行的varchar总和不得超过65535字节 如果想存储更长的字符串建议选用text格式

既然varchar是变长的 而且不超过255字符时都是用一个字节来存储长度 那么是不是意味着varchar(4) 与varchar(100) 在存储四个字符长度的内容 比如 "abcd"时是完全一样的呢?

  mysql在查询时对于varchar字段在内存中是采用固定宽度而不是储存时的变长宽度 尤其是查询时创建的隐形临时表 所以在选择字段属性时还是适可而止 根据自己的业务来选择最合适的并且最小的长度 从而来提高查询速度 减少数据库服务器的开销


何时选用varchar列来储存?

1 字符串列最大长度比平均长度大很多的列  充分发挥变长的特点

2 字符串列较少被更新的列  因为innodb引擎一个存储页为16k 频繁的更新变长字段可能导致存储页的分裂 产生存储碎片 

3 多字节字符集 如utf-8 

需要注意的是:

mysql数据库的varcahr类型在4.1以下版本中最大长度限制为255字节

mysql5.0以上的版本中varchar数据类型的长度支持到了65535字节。

Text和LongText 也是长度可变的类型

Text的最大长度是可以存储 65535 (2^16 – 1) 个字符

LongText的最大长度是可以存储4294967295 (2^32 – 1) 个字符。

varchar有系统默认长度,所以必须在括号里定义长度,可以有默认值。

text不能有默认值,存储或检索过程中,不存在大小写转换。

经常变化的字段用varchar,能用varchar的地方不用text(效率上: char>varchar>text)


28.怎么进行分页数据的查询,如何判断是否有下一页?   
MySQL数据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到sql语句后面就行了。 
LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数。例如: 
select * from table WHERE … LIMIT 10; #返回前10行 
select * from table WHERE … LIMIT 0,10; #返回前10行 
select * from table WHERE … LIMIT 10,20; #返回第10-20行数据 


29.为什么不可以用Select * from table?    

1、mysql拿到一条命令,会去解析命令、优化查询,然后去存储引擎执行查找.SELECT * 语句取出表中的所有字段,会解析更多的 对象,字段,权限,属性相关,不论该字段的数据对调用的应用程序是否有用,这会对服务器资源造成浪费,导致优化和效率问题,对服务器的性能产生一定的影响。

2、如果表的结构在以后发生了改变,那么SELECT * 语句可能会取到不正确的数据甚至是出错。

3、执行SELECT * 语句时,select * 语句要对表中所有列进行权限检查,这部分也是开销

4、使用SELECT * 语句将不会使用到覆盖索引,不利于查询的性能优化.(索引覆盖:索引覆盖是一种速度极快,效率极高,业界推荐的一种查询方式.就是select的数据列只用从索引中就能够获得,不必从数据表中读取,也就是查询列要被所使用的索引覆盖)

5、在文档角度来看,SELECT * 语句没有说明将要取出哪些字段进行操作,不具备针对性,不推荐。

6、用 select * 语句插入一个表,以后表结构修改了,如增加或删除了一列,对代码影响很大,如果只是恰好只获取自己需要的那几列,表结构的修改对你的代码影响就会比较小,便于后期项目维护。


30.maven是什么,和Ant有什么区别?    

maven是一个项目管理工具,它包含了一个项目对象模型(POM:project object model),一组标准的集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
ant是一个java的build工具,也是apache的项目,不过各方面都被maven代替并超越。



返回列表 返回列表
评论

    分享到