发表于: 2018-01-02 21:36:14

1 505


一、今天完成的事情。

 

 1、将任务一的代码提交上svn并通过师兄验收




完成深度思考中的所有问题


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

Ant和Maven都是基于Java的构建(build)工具。Ant是软件构建工具,Maven的定位是软件项目管理和理解工具。





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


a、maven package:打包到本项目,一般是在项目target目录下。

如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错,因为找不到所依赖的b项目,说明a项目在本地仓库是没有找到它所依赖的b项目。


b、maven install:打包会安装到本地的maven仓库中,如果没有设置过maven本地仓库,一般在用户/.m2目录下。如果a项目依赖于b项目,那么install b项目时,会在本地仓库同时生成pom文件和jar文件


c、maven deploy:将打包的文件发布到远程参考,提供其他人员进行下载依赖。


d、清理项目生产的临时文件,一般是模块下的target目录





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


当 Surefire 插件到达 test 目标的时候,如果 maven.test.skip 设置为 true ,它就会跳过单元测试。 另一种配置 Maven 跳过单元测试的方法是给你项目的 pom.xml 添加这个配置。 你需要为你的 build 添加 plugin 元素。

 

<project>

  [...]

  <build>

    <plugins>

      <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-surefire-plugin</artifactId>

        <configuration>

          <skip>true</skip>

        </configuration>

      </plugin>

    </plugins>

  </build>

  [...]

</project>




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


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


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


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

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




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


1.有利于计算时间差

2.方便java与数据库之间的传输


 


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


a.在插入数据时无法确定主键的值,除非使用事务否则,通过其它方法获得,无法保证获得的值就是刚插入数据的主键,因为在插入数据库前无法获得主键导致后续代码编写困难.


b.自增值在使用事务回滚,以及在插入失败的情况下,其值不会回滚,当使用此值作为条目的连续编号时回发生编号不连续的问题.


c.在合并数据库表时,因为都是从1开始编号造成数据合并困难,特别对于一些可以离线的操作的系统,自动编号只是累赘..




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

 

     在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

      索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

     数据量超过30万之后索引就会对性能有较为明显的影响,在需要经常对一些字段的内容进行查询时,就应该对字段创建索引。





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


  唯一索引,一种索引,不允许具有索引值相同的行,从而禁止重复的索引或键值。系统在创建该索引时检查是否有重复的键值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。

   普通索引就是最基本的索引类型,没有唯一性之类的限制


 



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

  不需要,因为系统会做出判断,然后报出错误提示,更何况腾讯不存在相同的QQ号




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

      CreateAt是记录数据创建时间的,而UpdateAt是记录数据被修改时间的,createat应该在创建行时赋值,updateat应该在行内列被修改时赋值。而在保证数据记录准确性和产品应用的考量下,这两类应该提供给外界查询的接口却应该封闭外界对数据的变更权限。




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

  应该储存为Varchar,因为修真类型属于字符串类型




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

     应该针对需要内容的不同而设定针对内容长度的最大值。Text和LongText的区别在于长度,text是6.5万字节,longtext是2的三十二次方字节。




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


---方法1: 直接使用数据库提供的SQL语句

---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N

---适应场景: 适用于数据量较少的情况(元组百/千级)

---原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是从结果集的M位置处取出N条输出,其余抛弃.


---方法2: 建立主键或唯一索引, 利用索引(假设每页10条)

---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) LIMIT M

---适应场景: 适用于数据量多的情况(元组数上万)

---原因: 索引扫描,速度会很快. 有朋友提出: 因为数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的情况,只能方法3

---方法3: 基于索引再排序


---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M

---适应场景: 适用于数据量多的情况(元组数上万). 最好ORDER BY后的列对象是主键或唯一所以,使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)

---原因: 索引扫描,速度会很快. 但MySQL的排序操作,只有ASC没有DESC(DESC是假的,未来会做真正的DESC,期待...).


---方法4: 基于索引使用prepare(第一个问号表示pageNum,第二个?表示每页元组数)

---语句样式: MySQL中,可用如下方法: PREPARE stmt_name FROM SELECT * FROM 表名称 WHERE id_pk > (?* ?) ORDER BY id_pk ASC LIMIT M

---适应场景: 大数据量

---原因: 索引扫描,速度会很快. prepare语句又比一般的查询语句快一点。





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


select * from table 还是要先被解释成 select all column from table,当数据量大的时候,不利于查询效率,而且针对性不够高




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


贫血模型最早广泛应用是源自于EJB2,最强盛时期则是由Spring创造,把“行为”(也称为逻辑、过程)和“状态”(可理解为数据,对应到语言就是对象成员变量)分离到不同的对象之中,那个只有状态的对象就是所谓的“贫血对象”(常称为VO——Value Object),而那个只有行为的对象就是我们常见的N层结构中的Logic/Service/Manager层(对应到EJB2中的Stateless Session Bean)。(曾经Spring的作者Rod Johnson也承认,Spring不过是在沿袭EJB2时代的“事务脚本”,也就是面向过程编程)

充血模型其实很简单,就是面向对象设计的本质:“一个对象是拥有状态和行为的”,比如说一个人,他眼睛什么样鼻子什么样这就是状态,人可以去打游戏或是写程序,这就是行为。为什么要有一个“人Manager”这样的东西存在去帮人“打游戏”呢?

举个简单的J2EE的例子,设计一个与用户(User)相关的功能,传统的设计一般是:
类:User+UserManager
保存用户调用:userManager.save(User user);
充血的设计则可能会是:
类:User
保存用户调用:user.save();
——User有一个行为是:保存它自己

其实它们没有什么特别适用的方向,个人更倾向于总是使用充血模型,因为面向对象编程总是比面向过程编程要有更丰富的语义、更合理的组织、更强的可维护性——当然也更难掌握一些。因此实际工程场景中,是否使用,如何使用还依赖于设计者以及团队充血模型设计的理解和把握,因为现在绝大多数J2EE开发者都受贫血模型影响非常深。




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


Ioc—Inversion of Control,即“控制反转”

Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制

      在传统的程序设计过程中,调用者直接使用new关键字创建被调用者的实例,调用者和被调用者之间的耦合度很高,要由调用者亲自创建被调用者的实例对象,不利于软件的移植与维护。




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


1. 接口是个规范

2. 接口进行了抽象

3. 实现多态.





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

   因为防止程序在遇到错误后还继续运行,在不知道方法是否完善的时候使用,防止了异常过多程序崩溃,然后catch里写记录日志给用户进行整改。数据库是基于tcp的,网络不稳定的情况下很容易掉,网络中断,DB连接不上是有可能的。我也不知道多久会发生一次。。



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


一个项目各个log级别的定义应该是清楚明确的,是每个开发人员所遵循的;

即使是TRACE或者DEBUG级别的日志,也应该有一定的规范,要保证除了开发人员自己以外,

包括测试人员和运维人员都可以方便地通过日志定位问题;

对于日志级别的分类,有以下参考:


FATAL — 表示需要立即被处理的系统级错误。当该错误发生时,表示服务已经出现了

某种程度的不可用,系统管理员需要立即介入。这属于最严重的日志级别,因此该

日志级 别必须慎用,如果这种级别的日志经常出现,则该日志也失去了意义。

通常情况下,一个进程的生命周期中应该只记录一次FATAL级别的日志,即该进程遇到无

法恢复的错误而退出时。当然,如果某个系统的子系统遇到了不可恢复的错误,那该

子系统的调用方也可以记入FATAL级别日志,以便通过日志报警提醒系统管 理员修复;


ERROR — 该级别的错误也需要马上被处理,但是紧急程度要低于FATAL级别。

当ERROR错误发生时,已经影响了用户的正常访问。从该意义上来说,实际上

ERROR错误和FATAL错误对用户的影响是相当的。FATAL相当于服务已经挂了,

而ERROR相当于好死不如赖活着,然而活着却无法提供正常的服务,只能不

断地打印ERROR日志。特别需要注意的是,ERROR和FATAL都属于服务器自己的

异常,是需要马上得到人工介入并处理的。而对于用户自己 操作不当,

如请求参数错误等等,是绝对不应该记为ERROR日志的;


WARN — 该日志表示系统可能出现问题,也可能没有,这种情况如网络的波动等。

对于那些目前还不是错误,然而不及时处理也会变为错误的情况,也可以记为WARN日志,

例如一个存储系统的磁盘使用量超过阀值,或者系统中某个用户的存储配额快用完等等。

对于WARN级别的日志,虽然不需要系统管理员马上处理,也是需要 即使查看并处理的。

因此此种级别的日志也不应太多,能不打WARN级别的日志,就尽量不要打;


INFO — 该种日志记录系统的正常运行状态,例如某个子系统的初始化,某个请求的成功执行等等。

通过查看INFO级别的日志,可以很快地对系统中出现的 WARN,ERROR,FATAL错误进行定位。






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

      单步调试可以清晰看到参数的值和传递路径或方法的调用,可以让编写者很方便的理解程序中方法相互调用的顺序与流程。以便于找到错误的源头或者功能实现的可能性。应该是根据程序的路径来找到对应的源码的吧,这个没找到答案,但是看方法之间的跳跃都是这样子跳的。


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

 

     我们一般在本地写代码时,如果程序出现问题了,一般情况下,我们会在程序中打各种log,调试,找出问题,修改,测试,部署到服务器,再测试。但如果在真实项目中的呢,这样做虽然也可以,显然是不方便的。

   真实项目中,我们可以通过远程连接的方式,进行调试

   远程调试:服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时能够在本地知道远程服务端的此时的内部状态


任务一感想:一路感觉磕磕绊绊的完成了任务一,其实心里清楚自己底子都还没有打好,很多知识点处于空缺状态,能完成这些任务离不开师兄们的帮助和网络上详尽的教程,希望在之后的学习中能慢慢扎实起来,把该学的知识点一滴不漏的全部吸收。


二、明日计划完成的事情


 1、深化Spring IOC的相关知识,用来讲小课堂。


 2、有时间的话继续进行任务二的进度



三、遇到的问题

  暂无



四、收获

如上所述

task2开始时间:2017.01.03

预计demo时间:2017.01.18



http://task.ptteng.com/zentao/project-task-350.html



返回列表 返回列表
评论

    分享到