发表于: 2017-05-19 14:01:05

1 1186


今日计划

剩下的深度思考,任务一总结

今日完成


深度思考

1.Maven是什么,和Ant有什么区别?

 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工  作。Maven除了以程序构建能力为特色之外,还提供高级项目管理工具。由于Maven的缺省构建规则有较高的可重用性,所以常常用两三行Maven构建脚本就可以构建简单的项目。

Maven和An不同点。Maven和Ant针对构建问题的两个不同方面。Ant为Java技术开发项目提供跨平台构建任务。Maven本身描述项目的高级方面,它从Ant借用了绝大多数构建任务。

                                    Maven                                                   Ant

标准构建文件           project.xml和maven.xml                      build.xml

特性处理顺序            ${maven.home}/bin/driver.properties      通过 -D命令行选项定义的系统特性

                                   ${project.home}/project.properties               由任务装入的特性
                                   ${project.home}/build.properties                  第一个定义最先被处理
                                   ${user.home}/build.properties

                                   通过-D命令行选项定义的系统特性

                                   最后一个定义起作用

构建规则                    构建规则更为动态(类似于编程语言)   构建规则或多或少是静态的,除非使用script

                                    它们是基于jelly的可执行XML

扩展语言                     插件是用Jelly(XML)编写的。         插件是用Java语言编写的。

构建规则可扩展性      通过定义<preGoal>和<postGoal>      构建规则不易扩展;可通过使用<script>任务模 

                                     使构建goal可扩展                                  拟<preGoal>和<postGoal>所起的作用   

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

修改pom.xml的<plugins>,加入

<plugin>

       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>true</skip>
       </configuration>
 </plugin

或者cmd环境下

mvn compile install -DskipTests

mvn compile install -Dmaven.test.skip=true

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

能标识类和线程,能选择日志级别,知道时间间隔。输出日志文件,便于存储和管理。

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

编码方便,防止遇到时区问题

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

数据库迁移、导入、导出会遇到问题,多库引用数据会有重复。

7.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?

数据库索引,索引是对数据库表中一列或多列的值进行排序的一种结构。300万条数据建索引就会有性能差别了,数据过多,字段具有唯一性易识别,该建索引。

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

唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。

添加唯一性索引的数据列可以为空,单数只要存在数据值,就必须是唯一的。

9.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?

要判断这个qq号是否已经存在。

10.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?

前者插入数据是赋值,后者修改数据时赋值。只开放查看窗口,不开放修改窗口。

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

存储Varchar,字符串类型

12.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?

根据实际业务中字段存储内容长度来定,比如日期长度或者姓名长度都能确定一个上限值。

Text长度65535个字符,Long Text长度4294967295个字符

13.怎么进行分页数据的查询,如何判断是否有下一页?

查询第1条到第10条的数据的sql是:select * from table limit 0,10;   ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;

查询第10条到第20条的数据的sql是:select * from table limit 10,20;  ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;

查询第20条到第30条的数据的sql是:select * from table limit 20,30;  ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;

假如每页显示 20 条数据,那么查询数据库的时候,用limit #offset#, 21取出 21 条记录,页面展现20条。如果取到了 21 条,说明下一页还有数据。如果结果集数量不足 21,说明已经到了最后一页。

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

减少不必要的输出,提高执行效率,列出要查的列名

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

贫血模型时指领域对象里只有get和set方法(pojo),所有的业务逻辑都不包含在内而是放在Business Logic层

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

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

控制反转(Iversion of Control)。对修改关闭,对扩展开放,遵循开闭原则。

new一个对象要改bug必须要动源代码,spring要换只需要再写一个类,编译过后和其他的文件放在一起,然后修改配置文件就行,不用动源码。spring真正实现了解耦。

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

1、重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。

2、简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。

3、维护、拓展性:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类,可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦,如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。

4、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些


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

异常表示程序运行过程中可能出现的非正常状态,如果不对异常进行处理,程序就不能够正常运行。以业务逻辑功能为单位,在最上层加Try-Catch机制。主要是增加程序的健壮性,防止因抛出异常过多,导致程序崩溃。底层代码,在可能出错的地方加Try-Catch,用Catch侦测具体的异常,然后就具体的异常,采取相应的解决方案。底层代码,在需要异常追踪时加Try-Catch机制,在Catch块中抛出自定义异常,调试时可迅速定位到错误代码段。会出现,只会提示一次。

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

pomxml加载log4j版本,编写log4j.properties控制输出信息级别,输出格式,日志存储位置。需要打印出来优先等级,线程名称,信息

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

一步步跟踪程序执行的流程,根据变量的值,找到错误原因。设置断点,debug as java application,然后就会跳到源码打断点的位置。

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

可以eclipse连接远程web应用进行线上调试。根据错误码和日志锁定问题所在。

排查方案

处理还排除故障分为4个必须的步骤:

(1)紧急处理

(2)添加监控

 (3)使用JDK性能监控工具

 (4)分析源代码。从治标不治本,到治标又治本

紧急处理

     紧急处理,顾名思义,是检查和评度当前故障的影响范围,并尽快使服务先恢复起来。其中检查和评估当前故障的影响范围是非常重要的。以微博系统举例,一般用户的投诉率为千分之一,如果有超过10起用户投诉,就可能是大面积故障。如果只是负责线上跟踪的QA人员反馈的问题,而没有用户投诉,则可以有较多的时间去处理。

      对于紧急的大面积故障,首先想到的不应该是检查问题。而是需要立刻追查最近线上系统是否有更改,我们经验是95%的故障都是在新代码上线后的12小时内发生的。此时应立刻回滚新更改。另外5%的大部分是由于业务扩展导致的。互联网业有一个规律,线上系统每半年需要重构一次,否则无法对应业务量的增长。对于这种业务量增长造成的故障,通常可以通过重启服务来紧急处理。

       因此,紧急处理的首选是立刻回滚新更改。

添加监控

       紧急处理之后,服务已经恢复了,但是问题并没有找到。如果是新代码上线造成的故障,回滚之后,工程师会有各种手段,在测试环境追查问题。而针对系统容量不足造成的故障,需要特别添加监控作为追查问题的重要手段。因为互联网业务请求高峰和低谷差别非常明显,微博业务中的请求高峰往往出现在晚上10点左右,而且不是稳定的出现。要求工程师们每天悲催的坐在电脑前守到晚上10点,却不见得能发现问题,是非常低效的。监控一般用一个简单的脚本就可以搞定,比如http服务监控。


使用JDk性能监控工具

      刚刚添加的监控开始报警了。登上服务器,该做些什么呢?一般需要如下动作

      (1)首先查看日志,看看有没有Exception。另外日志中常常有对接口调用,缓存使用的监控告警信息。

       (2)看看目前gc的状况如何,使用jdk自带的工具就可以

        (3)jmap -histo vmid > jmap.log,该命令会打出所有对象,包括占用的byte数和实例个数。

   (4)检查目前cpu占用情况,top -H,然后按“1”,会看到当前进程中每个线程所占CPU的比例。注意观察前几名,然后jstack -l vmid > jstack.log打出线程堆栈,看看是什么线程占用了CPU。这里需要注意的是,top -H显示的线程id是十进制,而jstack打出的线程堆栈是16进制。看看那些最忙的thread是不是那些真正应该忙的thread,如果是一些黑马线程,则要考虑是否是代码有死循环或者是意外的问题。


分析源代码

          分析源代码是最有技术含量的事情,也是比较耗时而且不见得有效果的事情。所以我把源码分析放到解决线上问题的最后一步,因为必须要做到有的放矢。带着问题去分析代码,会比较容易。通过20%代码的修改,就可以解决80%的性能问题。比如上面这个线上问题,肯定是线程处理慢造成的问题。需要针对线程的调用,同步异步等进行分析。

以上是csdn博客上分享的一篇java线上服务故障的方法和实例分析,自己看得半懂不懂。之前有过几年游戏项目开发经验(我是策划),一般我们遇到故障的处理方式如下。

1.确定故障出现场景,在测试环境还原它

2.svn上根据上传记录回滚,确定导致故障出现的是谁什么时候上传的什么文件

3.找到上传出现问题的文件之后,找到对应的人员从修改部分着手解决问题(考验程序架构的时候到了)

4.内部版本修改,内部测试通过

5.发布补丁,公告补偿,停服重启(技术还没实现热更新)


遇到困难

收获

这里和任务总结一起写吧


任务一总结

1.熟悉修真院的学习模式,任务驱动,指引学习新的知识点。

2.遇到卡顿,按百度-师兄日志-问人的顺序解决问题,这里可以去知乎翻翻老大的专栏。

3.多用百度搜索关键字,一些自己遇到而任务未涉及的难点,线上可以搜到解决办法。比如Maven库的镜像解决jar下载缓慢,报错没法解决,搜关键字吧。

4.敲代码敲代码敲代码,因为很重要所以说三遍。概念不清楚,找实例敲一遍。相同问题不同代码实现方法,代码敲一遍。曾经群里有师弟问怎么学?我说先从学写HelloWorld开始,另一名师弟笑说我也会。其实环境搭建好之后第一套简单代码验证就是Hello World。然后就是各种架构的CRUD,多敲几次吧。

5.自己把握主动权,可以这么说,想要完成任务的一切资源网上都能搜到,再不然,也可以找到师兄问。实在解决不了,按时间顺序选几个和自己进度差别不大的师兄日志看看,找找思路。我就是找到北京的师兄,他进度比我快一周,所以我遇到的问题他肯定清楚。(笑)


最后梳理下知识点

mysql环境配置

简单的数据库操作,表格操作,CRUD

Navicat安装和配置,数据库操作,表操作

JAVA环境配置,JRE和JDK的区别

Eclipse环境配置

Maven环境配置,mvn指令操作

Eclipse+Maven,第一个Maven项目

Eclipse连接MYSQL

JDBC的使用,CRUD

Maven项目,DAO

单元测试Junit

Spring

Mybatis

Spring+Mybatis

log4j

Spring+Mybatis+log4j+Junit

云服务器的环境搭建

云服务器数据库远程连接和操作

项目本地打包,布置到线上

大规模数据库索引对效率的影响


发现没有,基本都是新IDE或者框架的配置和搭建,然后简单的操作,从而实现任务需求。所以卡住的时候可以回顾下之前你第一次整Mysql的时候对比下,现在哪一步出了问题。下载资源-安装/配置-简单的测试和基本操作-解决任务-根据报错或者反馈修改


明日计划

修改下云服务器上的项目,提交任务一,开始任务二


返回列表 返回列表
评论

    分享到