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

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.mzph.cn/news/789793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(六)——图的存储及基本操作

6.2 图的存储及基本操作 6.2.1 邻接矩阵法 邻接矩阵存储无向图、有向图 #define MaxVertexNum 100 //顶点数目的最大值typedef struct{char Vex[MaxVertexNum]; //顶点表int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵&#xff0c;边表int vexnum,arcnum; //图的当前…

[C++]std::map用法

map用法详解 Map是STL的一个关联容器&#xff0c;它提供一对一的数据处理能力&#xff0c;由于这个特性&#xff0c;它完成有可能在我们处理一对一数据的时候&#xff0c;在编程上提供快速通道。这里说下map内部数据的组织&#xff0c;map内部自建一颗红黑树(一 种非严格意义上…

c模板编程c/c++20240401

c模板编程 #include<iostream> //#include<string> //#include<algorithm> template <typename T> T max(T a, T b) { return (a > b) ? a : b; } int main() { int i max(1, 2); // 返回 2 float f max(3.14f, 2.72f); // 返回 3…

华为ICT七力助推文化产业新质生产力发展

创新起主导作用的新质生产力由新劳动者、新劳动对象、新劳动工具、新基础设施等四大要素共同构成&#xff0c;符合新发展理念的先进生产力质态&#xff1b;具有高科技、高能效、高质量等三大突出特征。而通过壮大新产业、打造新模式、激发新动能&#xff0c;新质生产力能够摆脱…

阿里云数据库服务器价格表,2024年最新报价

阿里云数据库服务器价格表&#xff0c;优惠99元一年起&#xff0c;ECS云服务器2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;优惠价格99元一年&#xff1b;阿里云数据库MySQL版2核2G基础系列经济版99元1年、2核4GB 227.99元1年&#xff0c;云数据库PostgreSQL、SQL Serve…

使用LangChain连接MySQL并实现Chain多伦问答,基于智谱API

学习目标&#xff1a; 掌握LangChain基础用法 环境&#xff1a; JupyterLabPython 3.12.2 导入基础包 !pip install langchain -i https://mirrors.aliyun.com/pypi/simple/ !pip install zhipuai -i https://mirrors.aliyun.com/pypi/simple/ !pip install langchain_open…

探索 ZKFair 的Dargon Slayer蓝图,解锁新阶段的潜力

在当前区块链技术的发展中&#xff0c;Layer 2&#xff08;L2&#xff09;解决方案已成为提高区块链扩容性、降低交易成本和提升交易速度的关键技术&#xff0c;但它仍面临一些关键问题和挑战&#xff0c;例如用户体验的改进、跨链互操作性、安全性以及去中心化程度。在这些背景…

西圣、飞利浦、万魔开放式耳机好用吗?热门产品硬核测评对比

在无线耳机市场中&#xff0c;开放式耳机因其独特的佩戴方式和出色的听音体验逐渐受到消费者的青睐&#xff0c;西圣、飞利浦、万魔作为业内知名品牌&#xff0c;都推出了各自的开放式耳机产品&#xff0c;备受关注&#xff0c;那么这些热门品牌的开放式耳机究竟好用吗&#xf…

【JVM】如何定位、解决内存泄漏和溢出

目录 1.概述 2.堆溢出、内存泄定位及解决办法 2.1.示例代码 2.2.抓堆快照 2.3.分析堆快照 1.概述 常见的几种JVM内存溢出的场景如下&#xff1a; Java堆溢出&#xff1a; 错误信息: java.lang.OutOfMemoryError: Java heap space 原因&#xff1a;Java对象实例在运行时持…

Open3D(C++) 基于随机抽样与特征值法的点云平面稳健拟合方法

目录 一、算法原理1、论文概述2、参考文献二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的GPT爬虫。 一、算法原理 1、论文概述 针对点云数据含有异常值且传统拟合方法拟合结果不理想的情…

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

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

6.java openCV4.x 入门-Mat之局部区域读写及Range和Rect介绍

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天建议把本文当作笔记来看&#xff0c;据说专栏目录里面有相应视频&#x1f92b; &#x1f9ed;文…

小白水平理解面试经典题目1431. Kids With the Greatest Number of Candies【Array类】

1431. 拥有最多糖果的孩子 小白渣翻译 一群孩子手里拿 着不同数目的糖果。你打算额外给每个孩子一些糖果&#xff0c;然后再确定哪些孩子拥有最多的糖果。 给你一个数组 candies &#xff0c;其中 candies[i] 代表第 i 个孩子拥有的糖果数目。另给你一个整数 extraCandies &…

vue源码解析——vue如何将template转换为render函数

Vue 将模板&#xff08;template&#xff09;转换为渲染函数&#xff08;render function&#xff09;是 Vue 编译器的核心功能&#xff0c;它是 Vue 实现响应式和虚拟 DOM 的关键步骤。在 Vue 中&#xff0c;模板&#xff08;template&#xff09;是开发者编写的类似 HTML 的代…

python vtk获取模型角度

在Python中,使用VTK库获取3D模型的角度通常涉及到计算模型的几何参数,如物体的最小外接矩形或边界盒子。以下是一个简单的例子,展示如何使用VTK计算3D模型的边界盒子,从而获取模型的角度: import vtk# 创建一个VTK的PolyData对象,并添加模型数据 polyData = vtk.vtkPoly…

qT 地图显示飞机轨迹

为了在Qt中显示飞机轨迹&#xff0c;你可以使用Qt的地图模块&#xff0c;例如Qt Location。以下是一个简单的示例&#xff0c;展示如何使用Qt地图模块显示飞机的轨迹。 首先&#xff0c;确保你的Qt项目文件(.pro)中包含了以下行来启用Qt Location模块&#xff1a; !include($…

【大数据运维】Hbase shell 常见操作

文章目录 一. DDL1. 表的DDL1.1. 创建表1.2. 删除表 2. 列族的DDL2.1. 增加一个列簇2.2. 删除列族2.3. 修改列族版本&#xff08;ing&#xff09; 二. DML1. 插入与更新数据2. 删除数据3. 清空表 三. DQL1. scan&#xff1a;查一批数据1.1. 查询全部1.2. 过滤rowkey1.3. 过滤列…

HackTheBox-Machines--Wifinetic

文章目录 1 端口扫描2 测试思路3 21端口测试&权限获取4 权限提升方法一方法二&#xff1a; Wifinetic 测试过程 1 端口扫描 nmap -sC -sV 10.129.229.902 测试思路 目标开启了21、22、53端口&#xff0c;并且21端口FTP服务允许匿名登录&#xff0c;所以从21端口开始进行测试…

OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;OpenCV中八种不同的目标追踪算法 目标跟踪作为机器学习的一个重要分支&#xff0c;加之其在日常生活、军事行动中的广泛应用&#xff0c;受到…

STM32F4系列单片机的定时器讲解和计数器,PWM信号输出,PWM信号捕获的实现对电机进行控制和监测功能

1.定时器功能介绍&#xff1a; 在控制领域里面&#xff0c;我们可以用信号输出定时器&#xff0c;进行PWM的控制&#xff0c;从而达到控制电机的目的&#xff0c;通过输入捕获功能可以用来接收外部的数字信号&#xff0c;用于测量脉冲宽度、频率或周期等。在这里给大家介绍下&…