发表于: 2017-11-20 22:24:51
2 701
今天完成的事情:
分别在有索引和没有索引的情况下对数据表插入100万条数据。
之前在插入9W多条数据时,程序会报错,OutOfMemoryError,后来推测是因为日志一直向控制台输出记录导致堆空间满了从而引发异常,所以讲日志的记录级别暂时提升为了info。
有索引的情况,插入的时间
没有索引的情况,插入的时间
可以看出,插入100W条数据时,有索引花费的时间比没有索引花费的时间多,多了95秒。
1. maven是什么,和Ant有什么区别?
Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。Maven有一个生命周期,当运行mvn install的时候被调用。这条命令考诉maven执行一系列有序的步骤,直到到达指定的生命周期,遍历生命周期的一个影响就是,maven运行了许多默认的插件目标,这些目标完成了像编译和创建一个JAR文件这样的工作。Maven有一个中央仓库,在引入Jar包依赖的时候会非常方便。
Ant的话,没有使用过。百科上讲,ant是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具。这个软件有时间可以使用了解一下。
2. clean,install,package,deploy分别代表什么含义?
mvn clean:删除target目录下编译生成目录以及字节码文件;mvn install:将项目发包成jar并存储在本地仓库;mvn package:把jar打包到本项目的target下;
desploy:是maven的一个插件,用于将maven自动构建生成的版本发布到中央代理仓库,也能把第三方依赖库(jar包)或一个独立的Jar包直接发布到中央代理仓库,使得其他开发者可以共享。
3. 怎么样能让Maven跳过JUnit?
当Surefire插件到达test目标的时候,如果maven.test.skip设置为true,它就会跳过单元测试,mvn clean install -Dmaven.test.skip=true
另一种方法:可以在pom.xml添加这个配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
4. 为什么要用Log4j来替代System.out.println
Log4j可以帮助开发人员进行日志输出管理,可以通过配置文件设置信息的优先级、日志信息的输出目的地以及日志信息的输出格式。Log4j除了可以记录程序运行日志信息外还可以用来显示调试信息。由于System.out.println需要写在项目代码中,一旦决定不再显示了,还需要一行行注释掉这些代码,如果又需要改变变量值来调试,又需要去注释,十分不方便。
5. 为什么DB的设计中要使用Long来替换掉Date类型?
因为Date有固定的格式,不同的地区有不同的时间表示方法,使用long型方便数据的传输。将java.util.Date转化为java.sql.Date的时候,日期的时分秒会被去掉,数据的精度发生变化,而JDBC中定义接口的时候使用的是java.sql.Date。java.sql.Timestamp类,它保持了日期数据原有的精度,可以实现java.util.Date的无损转换,但是Timestamp这个类在一些预定义的SQL中常常会出问题。
将Date类型转换为long类型,有助于计算时间差,方便java与数据库之间的传输。
6. 自增ID有什么坏处?什么样的场景下不使用自增ID?
不存在连续性,比如:1,2,3删掉3后再添加记录时,id就会变成4,而不会补上3这个位置;数据重复了自增不会提示和处理
在做分布式数据库时,要求数据同步时,自增id就会出现严重的问题,因为无法使用该id来作为唯一标识。同时在数据库迁移时,也会出现各种问题。
什么情况下不适用自增id:自增id的作用是唯一地标识表中的某一条记录,如果有其他能唯一标识该行数据的列,就不用设置自增id。https://v.qq.com/x/page/u05032qt6rk.html
7. 什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的关键目的是为了加快检索速度而建立的。
多大的数据量下建索引会有性能的差异:和计算机硬件有关吧,并且一般数据量大的时候才会创建索引。
什么样的情况下对该字段建索引:外键字段、主键字段、在where子句中的字段。索引应建在选择性高的字段上。
https://www.nowcoder.com/questionTerminal/91e1c256e2764c5a8217533b584bead5?pos=271&orderByHotValue=1
8. 唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。
普通索引的唯一任务是加快对数据的访问速度,普通索引允许被索引的数据列包含重复的值。唯一索引表示被索引的数据列不能包含相同的值。如果确定某个数据列只能包含彼此各不相同的值,在为这个数据列创建索引的时候就应该将该索引定义为一个唯一索引。
9. 如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?
插入的时候不需要判断,数据库会自己处理,如果该QQ号已经存在可以通过程序捕获异常处理。
10. CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
CreateAt在该记录被创建的时候赋值,UpdateAt在记录被修改的时候赋值。不需要开放给外部调用的接口。
11. 修真类型应该是直接存储Varchar,还是应该存储int?
修真类型中存储的值是字符型的值,所以存储Varchar。
12. varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?
varchar类型在定义时规定存储字符的上限,最大为65535字节,因为是定义上限,所以varchar类型的长度只要大于等于要插入的记录的字符的最大值即可。
Varchar在保存的时候,不进行填充,当值保存和检索时尾部的空格仍保留。当插入数据的长度超过设定的长度时,会截断
Text最大长度是65535(2^16-1)个字符,Text与Varchar不同的是,Text不可以有默认值,存储或检索过程中,不存在大小写转换。Text指定的长度是不起作用的,意思是,当插入数据的时候,超过指定的长度还是可以正常插入。
LongText最大长度是(2^32-1)个字符。
13. 怎么进行分页数据的查询,如何判断是否有下一页?
先用select count(*) from 表明来查询数据的总条数,通过总条数判断有多少页数据,每点一次下一页会进入数据库中获取下一页面中的数据,使用sql语句select * from 表明 limit m,n 查询第m条到第n条数据。判断是否有下一页,页数=总数据条数/每页显示的数据。当能除尽的时候,页码<页数,有下一页,页码=页数,没有下一页。当不能除尽的时候,页码<页数+1,有下一页,页码=页数+1,没有下一页。
14. 为什么不可以用Select * from table
从数据库查询优化角度来说,select *需要选出全部的列写入一个中间结果集中,用于进一步查询或者输出,所以其数据量远远大于select colA,colB,colC,...的情况。一旦涉及网络传送,select *还会浪费网络资源,因为*可能下到不需要的东西,即使在本机执行,因为select *占用了无谓的内存空间所以导致性能较为低下。并且select *因为占用内存而导致并发执行时的资源竞争而影响性能。
15. 什么是贫血模型,什么是充血模型?为什么我们会强制要求使用贫血模型?
贫血模型是领域内的概念类或现实世界中对象的可视化表示,又称为概念模型或分析对象模型,它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。贫血模型是指使用的领域对象中只有setter和getter方法(POJO),所有的业务逻辑都不包含在领域对象中而是放在业务逻辑层。
充血模型将大多数业务逻辑和持久化放在领域对象中,业务逻辑只是完成对业务逻辑的封装、事务和权限等的处理。
对于java来说,更加适合采用贫血的模型,java比较适合于把一个复杂业务逻辑分离到n个小对象中去,每个小对象负责单一的职责,n个对象互相协作来表达一个复杂的业务逻辑,这n个对象之间的依赖和协作需要外部的容器例如IOC来显示管理。但对于每个具体的对象来说,他们是贫血的。
http://www.ituring.com.cn/article/125
http://www.jianshu.com/p/1b824b1bffd6,这里面有个小视频。
16. Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
IOC(Inverse Of Control),控制反转,对象的创建由Spring容器完成。使用IOC而不是用New是因为使用IOC可以解耦合。
17. 为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
使用接口是因为一个接口可以有不同的实现类,可以根据不同的需求编写不同的实现类来完成不同的业务,如果直接使用一个实体类,就相当于把程序直接写死了,使得程序没有扩展性。Interface和Impl好处就是可以针对不同的需求制定不同的实现,增强程序的扩展性。使用接口编程,每次修改时只需要修改实体类而不需要修改接口之间的调用,能够降低代码之间的耦合,维护起来更方便。
明天计划的事情:
把任务一的代码上传到GitHub上,完成剩下的题目。
评论