发表于: 2017-10-07 22:11:30

1 749


今天完成的事:

1.修改代码使其符合验收规范并提交任务1

DB设计规范和命令规范

使用id作为主键并自增

数据库表及字段名使用小写,并限定字符(a-z,0-9,_),尽量使用单个单词,若需要多个单词,使用下划线分割

用尽量少的存储空间来存储一个字段

某个字段是boolean类型使用is_前缀,比如is_boy

Java命名规范

包名:使用公司域名倒写的形式,比如google公司域名为google.com,则写成com.google,由于互联网上的域名称是不会重复的,所以程序员一般采用自己在互联网上的域名称作为自己程序包的唯一前缀。 

类名:类名每个单词首字母大写,如:DoMain

常量名:常量名均使用大写的形式,需完整指出含义,多个单词使用_来分割。

变量名:变量名有几种方式:Camel(驼峰命名法):首字母是小写的,接下来的单词都以大写字母开头,Pascal (帕斯卡命名法):首字母是大写的,接下来的单词都以大写字母开,匈牙利标记法:在以Pascal标记法的变量前附加小写序列说明该变量的类型


使用自定义域名并通过配置本地Host来配置DB连接文件

找到本地的Host文件,因为我是ubuntu所以是/etc/hosts,通过vim打开并编辑将远程服务器ip和自定义的域名添加进去保存,随后在datasource中编写url中将ip修改为在host文件中自定义的域名


访问数据的时候使用Try/Catch捕获异常,关闭DB之后测试测试异常代码可以正常执行

使用的是spring-mybaits框架,并为相关对数据库进行操作的方法设置了在事物中运行,Try/Catch后log4j打印相关日志后手动抛出异常以便让spring的事物管理器工作并回滚。


2.完成了深度思考

maven是什么,和Ant有何区别?

Maven是一个项目管理和综合工具,提供了开发人员构建一个完整的生命周期框架,可通过pom文件对项目进行构建,管理,jar包下载,极大的方便了开发人员和开发团队。

和Ant的区别是Ant提供的可重用的task粒度太小,无法复用,虽然灵活,但是需要纠缠很多细节的东西。而maven通过pom文件只需要告诉依赖文件在何处,如何进行bliud很快就能对项目进行compile或test或install或package

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

clean:清除项目目录中的生成结果

install:在本地Repository中安装jar

package:根据项目生成的jar

deploy:将最终版本的包拷贝到远程的repository(仓库),使得其他的开发者或者工程可以共享

怎么样能让Maven跳过JUnit?

将pom文件中<bliud>标签的<configuration>标签中加入<skipTests>true</skipTests>即可

或者在使用-DskikTests命令

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

首先Log4j让开发人员注重于去编写重要的日志信息,而不需要关心如何去格式化。若使用System.out.println若需要应用到实际业务环境中,必须得输出时间,以及在哪个类中出现的,还得对输出到本地或是数据库进行操作,很繁琐。而通过log4j无需关心这些细节,更注重去编写日志内容,这些细节是通过配置文件中的配置来自动生成的。


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

1.Data类型有固定的格式,不太方便表示世界各个地区的时间。(国外有夏令时和冬令时之分)

2.使用long也能清晰的表明具体时间


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

当删除其中的一些数据后自增id就不是有序了,必须删除了三行数据id为1,2,3,删除其中的2会变为1,2

若是删除其中3,插入一条数据会变为1,2,4


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

索引是为了能够快速地定位某行数据而设立的,建立索引后使用建立索引的字段进行where来过滤能够快速定位行,但是插入数据和更新数据以及删除数据性能会下降以及会占用一定的空间。

自己这边测试对2个字段建立索引,测试100万数据发现建立索引和不建立索引情况下,建立索引会多耗时3秒多时间。

频繁使用该字段来定位行,而且字段不能频繁更新,长期固定。


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

普通索引不检查数据的唯一性。比如,插入表中一行数据,该行数据需要更新到索引表,如果索引表中的字段值与其他值重复了,普通索引不会做出处理。

唯一索引恰恰相反,插入表中一行数据,随后会更新索引表。若是插入的索引字段值与其他值重复了,数据库不会插入这条数据,结果就是索引表不会更新这条数据,表不会插入这行数据。

需要索引字段中的值具有唯一性需要设置为唯一索引,主键就是一种唯一索引。


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

不需要,唯一索引插入的值不能重复,所以数据库会报错。

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

在插入一行数据时将当时时间赋值给createAt和UpdateAt,在更新这行数据任意一个字段时,则更新UpdateAt.应该开放调用接口,但需要做权限限制,只开放select权限。

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

若是采用int是否需要将该int的值转码为string类型向用户展示(因为内部人员可能理解int数字表明的类型,用户无法理解。若是对用户给出int对应的类型的说明,类型太多是否会影响用户体验)。若是需要展示,那么用转码的耗时成本来使用int来降低空间占用率是否是明智的。未经相关测试数据,无法给出明确答案。

个人认为,目前修真类型仅为4种,因此采用int是明智的,即使需要转码也不需要做太多的判断,耗时会非常低。也可以不用转码,直接在官方贴出说明,而直接将int值显示给用户。

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

varchar是可变长度类型,长度为实际长度+1。varchar可定义不同的长度来保存,如对于姓名,很少有超过4个字的,再考虑到一些特殊情况,可以定义长度为varchar(10)。

varchar是受存储限制的,必须指定长度。而text不受存储限制,不需要指定长度。在超过varchar最大长度的时候,就用text。longtext和text类似,只是容量更大。


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

select * from table 一般业务上很难用到,最大的原因就是非常耗时,一般的业务功能都能通过其他方式去实现。


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

那个只有状态的对象就是所谓的“贫血对象”(常称为VO——Value Object),而那个只有行为的对象就是我们常见的N层结构中的Logic/Service/Manager层那个只有状态的对象就是所谓的“贫血对象”。

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

就我自身使用mybatis的经验来讲,使用贫血模式利于数据的插入和映射成为对象。

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

IOC即控制反转,传统来new一个实例,需要传递各种参数来创建,不利于进行单元测试。而使用Ioc当使用应用上下文去获取一个Bean时,会自动将相关依赖属性注入后返回一个类的实例,开发人员只需要使用即可。

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

使用interface就指定了对于某一类事物基本的要做什么,所以实现了接口的方法都实现了该接口回答了如何做。但是我们一旦看见实现了这个接口的类就知道这个类最基本的是做什么的。而且能方便的实现多态。


明天计划的事:

开始了解任务2,如果任务1通过,就开始做任务2.

遇到的困难:

就是对于spring-mybatis批量插入100万数据,每次插入1万,分100次插入耗时46秒多,而每次10万分10次插入耗时60多秒,想不明白为什么会这样。

收获:

对数据库相关的概念有了一个更清晰的认识。


任务总结:

在任务1中对于开发环境配置在linux系统下还是挺方便的,没有遇到什么问题。在navicat,maven,idea,github工具的使用中也没有遇到太多的问题,在使用这些工具编写代码时时才真正理解到了这些工具是如何方便开发人员的。

在任务1中框架类学习了spring,mybatis,spring-mybatis,学习这些框架时是了解基本概念再找Demo来测试了解基本的流程的,这种学习方式我认为很有用。对这些框架的理解上没有太大的难度,使用基本的功能也没有难度。在使用当中遇到了一些问题会在下面给出,希望能够对师弟有所帮助。

maven:起初使用maven构建的项目,各种jar包是自己到官网下载后放到项目的lib目录下的,后来通过师兄了解到可以直接使用pom配置文件来添加依赖,可google查询相关关键字:maven 如何 添加依赖


mybatis:没有遇到什么特别的问题,Demo如下(注释很详细):

https://github.com/Himly1/task1/tree/master/mybatisDemo


spring:在使用spring的事物管理的时候,理解不了到底是如何进行的,这步很艰难,可以查看如下链接:

https://github.com/Himly1/task1/tree/master/mybatisDemo(45行以下是关于spring事物管理的讲解和代码)


spring-mybatis:在使用spring-mybatis的时候也没有遇到特别的问题,唯一的问题就是花了很长的时间去理解spring是如何将Dao接口代理的,后来发现是有个类会把指定目录下的所有Dao接口和映射文件联系起来并生成代理类自动注册Bean对象到spring的容器里,Bean的id是Dao接口名称的首字母小写其余不变,可查看如下链接:

https://github.com/Himly1/task1/tree/master/mybatisDemo (10行到44行)


Log4j:起初对于Log4j的配置文件很难理解,后来解决了,配置文件详解查看如下链接:

https://github.com/Himly1/task1/blob/master/Log4jDemo/src/main/resources/log4j.properties


在所有的学习的这些工具,框架中,遇到的一个困惑就是:

我使用spring-mybatis并使用批量插入也就是batch来对数据库进行压力测试,每次批量插入1万条,分100次插入,耗时大概46秒中这样子,加上了日志耗时上升到了60多秒。在将每次批量插入数量上升到10万条,分10次插入时,居然耗时80多秒。我很难理解,应该正常来说比每次插入1万条速度快啊。接着就是我将每次批量插入数量下降到1000,分1000次插入,耗时90多秒。


遇到的疑难问题:

使用spring-mybatis插入100万条数据,且整个插入过程是运行在事物当中且只有一个事物,耗时大概50多秒,我在网上看到其他说100万实际也就10几秒,试了很多方法去优化耗时始终无法降低下来。

我尝试过如下操作:

更换不同网络,将没插入1万条数据以及事物更改为插入完毕100万条数据才提交数据,更改每次插入数据的数量,尽管尝试了这么多,始终还是无法降低耗时,达到其他人的十几秒内插入100万条数据。


返回列表 返回列表
评论

    分享到