Java软件开发工程师面试题(二)

MySQL

MySQL优化

1、优化SQL语句

1、避免使用*号查询,需要什么字段查取什么字段;
2、避免在where子句中使用!=或<>操作,否则会导致索引失效从而进行全表查询;
3、避免对字段进行null值判断,否则会导致索引失效从而进行全表查询;
4、左模糊查询也会导致全表扫描;
5、避免使用or来连接条件,如果一个字段有索引,一个字段没有索引,也会导致索引失效从而进行全表查询;

2、选取最适和的字段属性

比如邮编只有六位,我们不可能去使用char(255),甚至使用varchar也是不合理的,因为char(6)就已经可以完成任务了,所以不需要浪费更多的空间。

3、使用连接代替子查询

比如我们要将所有没有订单的用户查询出来,使用子查询的话我们需要两个步骤,但是使用连接的话我们只需要一步,所以MySQL不要再内存中创建临时表来完成这个逻辑上需要两个步骤的业务

4、使用联合来代替手动创建临时表

有的时候需要将多个查询结果合并到一个查询中,我们使用联合和方便的将查询结果合并在一起,使用时只需要使用union关键字将查询语句连接起来就行了,但是查询的字段要相同

5、事务

在我们的项目中,一个业务往往需要多条SQL语句来完成,在这种情况下,某条SQL语句出现了错误,整个语句块就会出现问题,但是前边执行的SQL语句已经将数据进行了更改,要避免这种情况的发生,我们应该使用事务。
事务的作用是:要么语句块中的所有SQL语句执行成功,要么全部执行失败,此时就可以保证数据库中数据的一致性和完整性。

事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。

6、使用外键

使用外键可以减少数据冗余,比如,一张表中有一个字段是关于用户的学籍,那么我们在表中需要每条数据都要描述,那么重复的数据会很多,而且占存会越来越多,。。。。。。

7、使用索引

索引简单来说就是数据库表中某一列的所有值,索引是基于数据库表中的某一列创建的。使用索引可以提升数据的检索速度,例如:一本书的目录

MySQL传播机制

PROPAGATION_REQUIRED:

**支持当前事务,如果当前没有事务,就新建一个事务。**也就是说业务方法需要在一个事务中运行,如果业务方法被调用时,调用业务方法的行为(方法)已经处在一个事务中,那么就加入到该事务,否则为自己创建一个新的事务(默认传播属性)。

PROPAGATION_SUPPORTS:

**支持当前事务,如果当前没有事务,就以非事务方式执行。**也就是说如果业务方法在某个事务范围内被调用,则该方法成为该事务的一部分。如果业务方法在事务范围外被调用,则该方法在没有事务的环境下执行。

PROPAGATION_MANDATORY:

**支持当前事务,如果当前没有事务,就抛出异常。**也就是说业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下被调用,容器就会抛出例外。

PROPAGATION_REQUIRESNEW:

**新建事务,如果当前存在事务,把当前事务挂起。**也就是说业务方法被调用时,不管是否已经存在事务,业务方法总会为自己发起一个新的事务。如果调用业务方法的行为(方法)已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到业务方法执行结束,新事务才算结束,原先的事务才会恢复执行。

PROPAGATION_NOT_SUPPORTED:

**以非事务方式执行,如果当前存在事务,就把当前事务挂起。**也就是说业务方法不需要事务。如果方法没有被关联到一个事务中,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。

PROPAGATION_NEVER:

**以非事务方式执行,如果当前存在事务,则抛出异常。**也就是说业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。

PROPAGATION_NESTED:

如果一个活动的事务存在,则运行在一个嵌套的事务中。 如果没有活动事务, 则按REQUIRED属性执行。它使用了一个单独的事务, 这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。

MySQL隔离级别

ISOLATION_DEFAULT

这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。每种数据库的默认隔离级别是不同的,例如SQL Server、Oracle默认Read Commited,MySQL默认Repeatable Read。另外四个与JDBC的隔离级别相对应,不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最高,Read Uncommited的隔离级别最低

ISOLATION_READ_UNCOMMITTED

读未提交数据,这是事务最低的隔离级别,在并发的事务中,它充许一个事务可以读到另一个事务未提交的更新数据。(会出现脏读,不可重复读和幻读

ISOLATION_READ_COMMITTED

读已提交数据,保证在并发的事务中,一个事务修改的数据提交后才能被另外一个事务读取到。(会出现不可重复读和幻读)

ISOLATION_REPEATABLE_READ

可重复读,这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。一般是采用“快照”的方式来实现的。

ISOLATION_SERIALIZABLE

**事务被处理为顺序执行。这是花费最高,但也是最可靠的事务隔离级别。**能有效的避免脏读、不可重复读、幻读。

为什么要使用Spring Boot?

Spring Boot一个基于Spring框架的扩展,它消除了Spring应用程序所需要的繁杂配置,更快,更高效。

1、快速入门,学习成本低:
2、简化编码:创建一个web项目,使用Spring的时候,需要在pom文件中添加多个依赖,而Spring Boot则只需要在pom文件中添加一个starter-web依赖即可;
3、简化部署:因为Spring Boot内嵌了Tomcat,只需要将项目打成jar包,使用java  -jar xxx.jar 意见是启动项目;
4、没有冗余代码的生成及xml配置
5、版本管理
6、热部署
7、约定大于配置
8、自动装配
	@SpringBootApplication:说明这个类是一个启动类,Spring Boot运行这个类的main方法来的启动Spring Boot项目。
	点击去这个注解,我们这个注解一一个组合注解,里边有很多注解,其中有个@SpringBootConfiguration注解和@EnableAutoConfiguration注解,
	第一个注解会发现有一个@Configuration注解,表明这个类是一个Spring的配置类,再点进去看会发现@Component注解,表明Spring的配置类也是Spring的一个组件。
	第二个注解是开启自动配置的功能,点进去会看到一个@AutoConfigurationPackage注解和@Import({AutoConfigurationImportSelector.class})注解。
		第一个注解是用来自动配置包,点进去看,有一个@Import(XX.class)注解,自动配置包主要是使用的此注解中类字节码来给Spring容器中导入一个组件的(扫描包路径);
		第二个注解,传入组件的选择器,这个类里边selectImports方法,将所有需要导入的组件以完全限定名的方式返回,这些组件就会被添加到容器中;有了自动配置类,他是通过this.getCandiadateConfigurations()这个方法中loadFactoryNames()这个方法来从META-INF/spring.factories中获取资源,然后通过properties加载资源。
	所以Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入容器中,自动配置类就生效,帮我们进行自动配置工作。所以完成自动装配。
9、yml配置文件与properties的区别:
	写法上:yml采用键值对(类似于json格式),冒号后跟空格,通过冒号进行赋值;而properties以.为分割,采用完全限定名=值的方式来赋值的;
	规范上:yml用缩进来表示层次,严谨度高;而properties层级太深;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章