每日三个JAVA经典面试题(三十四)

news/2024/12/14 12:10:17/

1.Mybatis的一级、二级缓存

MyBatis提供了两种缓存机制来提高查询效率:一级缓存和二级缓存。

一级缓存(Session级别)

  • 作用范围:一级缓存是基于SqlSession的。这意味着,如果你在同一个SqlSession中执行两次相同的查询,MyBatis会从第一次查询时创建的缓存中返回结果,而不是再次访问数据库。
  • 生命周期:一级缓存的生命周期与SqlSession一致。当SqlSession被关闭或清除时,一级缓存也随之失效。

二级缓存(Mapper级别或全局级别)

  • 作用范围:二级缓存是基于Mapper的,也就是说,它是跨SqlSession的。如果不同的SqlSession执行相同的Mapper和SQL查询,它们可以共享二级缓存中的数据,前提是二级缓存已经被开启并正确配置。
  • 生命周期:二级缓存从SqlSession开始,直到应用会话结束或缓存被清除。这意味着,二级缓存可以在不同用户或请求间共享数据,从而减少数据库的访问次数,提高应用性能。

工作原理

  1. 一级缓存:当一个SqlSession进行了一次数据库查询后,结果会存储在这个会话的一级缓存中。如果同一个会话中有相同的查询请求,MyBatis将直接从一级缓存返回数据。
  2. 二级缓存:如果一个查询在一级缓存中没有找到匹配,MyBatis将查找二级缓存。如果结果存在,将直接从二级缓存返回。如果两级缓存都未命中,MyBatis将执行数据库查询,并将结果存入适当的缓存中。

注意事项

  • 默认情况下,一级缓存总是开启的,而二级缓存需要显式开启和配置。
  • 使用二级缓存时,需要考虑数据的一致性问题。因为数据是跨会话共享的,所以在并发环境下可能会出现数据过时的情况。
  • 对于频繁修改的数据,谨慎使用二级缓存,以避免脏读等问题。

通过合理使用和配置这两级缓存,可以在保持数据一致性的同时,显著提升应用的性能。

2.反射机制的应用场景有哪些?

反射机制,在Java中是一种强大的工具,允许程序在运行时访问、检测和修改其自身类的属性和方法。通过反射,可以实现在运行时动态创建对象、调用方法和访问属性,即使这些信息在编译时是未知的。这种机制不仅增加了程序的灵活性,也使得各种通用框架和API的实现成为可能。以下是一些典型的反射机制应用场景:

1. 开发IDE或工具

  • 反射用于开发集成开发环境(IDE)和其他开发工具中,比如在调试时动态地查看和修改对象的状态,或是在代码补全时提供方法和属性的列表。

2. 实现依赖注入(DI)

  • 许多现代框架(如Spring)使用反射来实现依赖注入。框架可以在运行时读取类的注解和属性,自动将依赖对象注入到其中,而无需手动编写工厂类或创建对象。

3. ORM(对象关系映射)

  • ORM框架如Hibernate利用反射将数据库表映射到Java对象。这允许开发者通过操作对象来间接操作数据库中的数据,而不是直接编写SQL语句。

4. 单元测试

  • 单元测试框架(如JUnit)使用反射来动态执行测试方法。开发者只需按照一定的规则编写测试方法,测试框架会自动发现并执行这些方法,而不需要手动列出每个测试调用。

5. 动态代理

  • 在实现动态代理时,反射机制允许在运行时动态创建一个实现了一组给定接口的新类。这对于实现各种代理模式(如远程方法调用、事务管理等)非常有用。

6. 插件或模块加载

  • 应用程序可以使用反射来动态加载外部的插件或模块,这些插件或模块在编译时可能是未知的。这增加了应用程序的扩展性和灵活性。

7. 配置文件解析

  • 反射常用于解析XML或JSON等配置文件,动态地创建配置文件中描述的对象和设置其属性值,而无需为每种可能的配置编写大量的解析代码。

8. GUI构建

  • 图形用户界面(GUI)构建工具可以使用反射来检查组件类的属性,动态地创建用户界面元素,允许开发者通过配置而非硬编码的方式来设计界面。

小结

反射机制使Java程序具有更高的灵活性和动态性,是许多高级特性和框架实现的基础。但是,也需要注意,不当的使用反射可能会带来性能问题和安全风险,因此在使用时应该权衡其利弊。

3.Java获取反射的三种方法

在Java中,获取类的Class对象是进行反射操作的第一步。有三种主要方式可以获取到一个类的Class对象,每种方式适用于不同的场景:

1. 使用Class.forName()静态方法

这种方法通过类的完全限定名(包括包名)来加载类,并返回类的Class对象。这是一种动态加载类的方式,常用于配置文件中指定类名的场景,使得你可以在不改变程序代码的情况下更换实现类。

Class<?> cls = Class.forName("java.lang.String");

这个方法抛出ClassNotFoundException异常,因此需要进行异常处理。

2. 使用.class语法

如果在编译时已经知道具体的类,可以直接使用.class语法来获取Class对象。这种方式不涉及类的动态加载,因此性能较好,但它不如Class.forName()灵活。

Class<?> cls = String.class;

这种方法不会抛出ClassNotFoundException异常。

3. 使用类实例的.getClass()方法

如果你已经有了一个类的实例,可以通过调用该实例的.getClass()方法来获取Class对象。这种方式适用于当你有对象实例时,想要动态获取其类型信息的场景。

String str = new String();
Class<?> cls = str.getClass();

这种方式也不会抛出ClassNotFoundException异常。

总结

  • Class.forName():适用于动态加载类,需要处理ClassNotFoundException
  • .class语法:适用于编译时已知类的情况,性能较好,但不够灵活。
  • .getClass()方法:适用于已有对象实例,想要获取其Class对象的场景。

选择哪种方式取决于你的具体需求和场景。在使用反射时,应当注意性能和安全性问题,合理选择获取Class对象的方法。


http://www.ppmy.cn/news/1405432.html

相关文章

数据可视化之折线图plot

import matplotlib.pyplot as plt plt.rcParams[font.family] [SimHei]# 查看matplotlibde文件地址# import matplotlib # print(matplotlib.matplotlib_fname()) # plt.rcParams[font.sans-serif] [SimHei] # 准备数据time [20200401,20200402,20200403,20200404,20200405…

nginx与tomcat的区别?

关于nginx和tomcat的概念 网上有很多关于nginx和tomcat是什么东西的定义&#xff0c;我总结了一下: tomcat是Web服务器、HTTP服务器、应用服务器、Servlet容器、web容器。 Nginx是Web服务器、HTTP服务器、正向/反向代理服务器&#xff0c;。 这里有两个概念是交叉的&#xff…

Springboot自动获取接口实现

ServiceLoader加载接口实现步骤 1.编写接口 public interface CommunicationAdapterFactory {void setKernel(LocalKernel kernel);boolean providesAdapterFor(Vehicle vehicle);BasicCommunicationAdapter getAdapterFor(Vehicle vehicle); }2.编写实现 // 实现类 1 publi…

ElasticSearch的常用数据类型

常见的数据类型 Text类型&#xff08;文本数据类型&#xff09; 用于索引全文值的字段&#xff0c;例如电子邮件的正文或产品的描述。这些字段是analyzed&#xff0c;也就是说&#xff0c;它们通过分析器传递&#xff0c;以便 在被索引之前将字符串转换为单个术语的列表。通过…

【算法】字典序超详细解析(让你有一种相见恨晚的感觉!)

目录 一、前言 二、什么是字典序 &#xff1f; ✨字典序概念 ✨深度理解字典序 ✨字典序排序的重要性和应用场景 三、常考面试题 ✨ 下一个排列 ✨ 字典数排序 ✨ 字典序最小回文串 四、共勉 一、前言 经常刷算法题的朋友&#xff0c;肯定会经常看到题目中提到 字典序 这样…

on-my-zsh 命令自动补全插件 zsh-autosuggestions 安装和配置

首先 Oh My Zsh 是什么? Oh My Zsh 是一款社区驱动的命令行工具&#xff0c;正如它的主页上说的&#xff0c;Oh My Zsh 是一种生活方式。它基于 zsh 命令行&#xff0c;提供了主题配置&#xff0c;插件机制&#xff0c;已经内置的便捷操作。给我们一种全新的方式使用命令行。…

JWFD流程图转换为矩阵数据库的过程说明

在最开始设计流程图的时候&#xff0c;请务必先把开始节点和结束节点画到流程图上面&#xff0c;就是设计器面板的最开始两个按钮&#xff0c;先画开始点和结束点&#xff0c;再画中间的流程&#xff0c;然后保存&#xff0c;这样提交到矩阵数据库就不会出任何问题&#xff0c;…

视频监控/云存储/磁盘阵列/AI智能分析平台EasyCVR集成时调用接口报跨域错误是什么原因?

EasyCVR视频融合平台基于云边端架构&#xff0c;可支持海量视频汇聚管理&#xff0c;能提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、智能分析等视频服务。平台兼容性强&#xff0c;支持多协议、多类型设备接入&#xff0c;包括&#xff1a;国标G…