发表于: 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命令行选项定义的系统特性
通过-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的时候对比下,现在哪一步出了问题。下载资源-安装/配置-简单的测试和基本操作-解决任务-根据报错或者反馈修改
明日计划
修改下云服务器上的项目,提交任务一,开始任务二
评论