开发基础笔记

1、Springboot2.0以后默认的数据库连接池是哪个?

 

Springboot2.0以后默认的数据库连接池是哪个

Spring Boot 2.0 后默认的数据库连接池是 HikariCP。

HikariCP 是一个高性能的数据库连接池,它的性能远远超过其他传统的数据库连接池,如 C3P0、DBCP 和 Tomcat 的连接池。

如果你想使用其他的数据库连接池,可以在项目的依赖管理文件中(例如 Maven 的 pom.xml 或 Gradle 的 build.gradle),排除掉 Spring Boot 默认的 HikariCP 依赖,并添加你想要的数据库连接池依赖。

例如,如果你想使用阿里巴巴的 Druid 作为数据库连接池,你可以按照以下步骤操作:

  1. 在 pom.xml 中排除 HikariCP,并添加 Druid 依赖:

<dependencies>
<!-- 排除 Spring Boot 默认的 HikariCP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>

<!-- 添加 Druid 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>

2、

CallableStatement是PreparedStatement的父接口

不是

CallableStatement不是PreparedStatement的父接口。 实际上,CallableStatement继承自PreparedStatement,而PreparedStatement继承自Statement接口。这意味着CallableStatement与PreparedStatement之间存在一个子类与父类的关系,而不是父接口与子接口的关系。这种继承结构允许CallableStatement利用PreparedStatement的功能,同时添加了对数据库存储过程的支持,包括处理输入和输出参数的方法

3、PreparedStatement是CallableStatement的父接口

PreparedStatement是‌CallableStatement的父接口。‌12

这一关系体现了‌Java中‌JDBC(Java Database Connectivity)API中Statement对象的继承结构。具体来说,Statement是PreparedStatement的父接口,而PreparedStatement又是CallableStatement的父接口。这种继承关系可以形象地比喻为“孙子继承爷爷,儿子继承爸爸”,但这种比喻并不意味着爷爷是孙子的父亲。实际上,CallableStatement继承自PreparedStatement,而PreparedStatement继承自Statement,从而形成了这种层次结构。

在JDBC中,这些接口和类提供了与数据库进行交互的标准方法。Statement是最基本的接口,用于执行简单的SQL语句。PreparedStatement则提供了参数化查询的功能,用于执行带有参数的SQL语句,这有助于防止SQL注入攻击并提高性能。CallableStatement则是针对存储过程的特殊化接口,允许执行存储过程调用并处理输出参数和返回结果。

4、TCP并不能保证它所发送数据的可靠传输。‌尽管TCP是一个可靠的协议,‌它通过一系列机制来保证数据的可靠性,‌包括校验和、‌重传机制、‌序列号排序以及重复数据包的处理等1。‌然而,‌TCP的可靠性并不能被绝对保证,‌主要因为以下几个原因:‌

  1. 接收端应用程序的处理能力:‌TCP数据包在接收端需要从内核空间的接收缓冲区拷贝到用户空间供应用程序处理。‌如果接收端应用程序未能及时处理这些数据,‌即使TCP已经确认了数据包的接收,‌这些数据也可能因为应用程序的崩溃或其他原因而无法被正确处理2。‌

  2. 网络处理能力:‌如果发送TCP数据包的速度快于中间路由器的处理速度,‌路由器可能会开始丢包,‌导致较高的丢包率。‌如果TCP继续保持这个速度发送数据,‌网络的性能会极大降低1。‌

  3. 滑动窗口和拥塞控制:‌TCP使用滑动窗口机制来控制发送方的发送速度,‌以适应接收方的处理能力。‌同时,‌拥塞控制算法如慢启动和拥塞避免用于防止网络拥塞。‌如果接收方的硬件能力不如发送方,‌或者网络出现拥塞,‌TCP数据包的传输可能会受到影响1。‌

综上所述,‌虽然TCP提供了许多机制来保证数据的可靠性,‌但在实际应用中,‌由于各种因素的影响,‌TCP并不能绝对保证其发送数据的可靠性。‌

5、

UDP不能保证数据库的可靠性。‌

UDP(‌用户数据报协议)‌是一种无连接的传输层协议,‌它不提供数据的可靠性保证。‌UDP的主要特点是高传输效率和无连接性,‌适用于对实时性和传输效率要求较高,‌而对数据准确性要求相对较低的应用场景,‌如实时语音通话、‌视频会议和网络游戏等1。‌尽管UDP在某些情况下可以用于数据库传输,‌但其传输的可靠性主要由应用层负责,‌而不是由UDP协议本身提供保证。‌因此,‌如果数据库传输需要保证数据的完整性和准确性,‌通常更倾向于使用TCP(‌传输控制协议)‌,‌因为TCP提供了数据的可靠性、‌连接性以及顺序保证12。‌

总结来说,‌虽然UDP在某些应用中可能被用于数据库传输,‌但其本身并不提供数据库所需的可靠性保证。‌对于需要确保数据完整性和准确性的数据库应用,‌TCP是更合适的选择。‌

6、TCP数据传输效率并不高于UDP。‌

TCP(‌传输控制协议)‌和UDP(‌用户数据报协议)‌是互联网中两种主要的传输层协议,‌它们各自具有不同的特点和适用场景。‌TCP协议确保数据的完整性和顺序性,‌适用于对数据准确性要求较高的应用,‌如网页浏览、‌电子邮件发送、‌文件传输等。‌TCP能够提供数据的可靠性,‌但传输效率相对较低,‌因为它需要建立连接、‌确认接收和重传数据,‌以确保数据的正确传输1。‌

相比之下,‌UDP协议适用于实时性要求较高、‌对数据准确性要求相对较低的应用,‌如实时语音通话、‌视频会议、‌网络游戏等。‌UDP的传输效率高,‌因为它不建立持续的连接,‌也不保证数据的可靠传输和顺序性。‌UDP的这种无连接特性使其在传输小量数据或实时数据时更快,‌但无法保证数据的可靠性12。‌

在服务器接入协议中,‌短连接TCP的传输效率高于长连接TCP和UDP。‌这是因为短连接TCP通过建立和关闭连接的方式,‌能够有效避免数据丢失和重复发送等问题,‌保证数据的完整性和准确性。‌而长连接TCP存在连接复用和维持等开销,‌且在高并发情况下容易出现拥塞控制问题。‌UDP虽然没有连接建立和维护的开销,‌但由于其不保证数据的可靠传输和顺序性,‌容易出现数据丢失和乱序等问题,‌导致传输效率较低3。‌

综上所述,‌TCP和UDP各有其优势和适用场景。‌TCP在需要确保数据完整性和准确性的应用中表现出色,‌而UDP则在需要快速传输且对数据准确性要求不高的实时应用中更为合适。‌因此,‌不能一概而论地说TCP的数据传输效率高于UDP,‌而是应根据具体的应用需求和场景来选择合适的协议12。‌

7、ArrayList的访问速度比LinkedList快

这个说法是不准确的。ArrayList和LinkedList是Java集合框架中的两个重要的数据结构,它们有各自的优点和适用场景。

  1. ArrayList:底层是数组,适合随机访问。

  2. LinkedList:底层是双向链表,适合插入和删除操作。

在理论上,对于随机访问,ArrayList的访问速度更快。但在实际应用中,访问速度的快慢还取决于很多其他因素,比如数据大小、内存状态、JVM版本等。因此,我们不能简单地说ArrayList的访问速度比LinkedList快。

如果你需要频繁进行随机访问,使用ArrayList会更好。如果你的应用程序需要频繁进行插入和删除,使用LinkedList会更好。

在实际编程中,为了得到最佳性能,我们应该根据实际情况选择数据结构,并进行适当的时间复杂度分析来决定使用ArrayList还是LinkedList。

8、Maven常见的scope属性包括compile、‌provided、‌runtime、‌test、‌system和import。‌

  • compile:‌这是Maven的默认属性,‌意味着依赖包将参与项目的编译、‌测试和运行阶段。‌项目打包后将会包含该依赖。‌
  • provided:‌表示依赖仅参与项目编译和测试阶段。‌在执行打包操作(‌如mvn package)‌时,‌该依赖不会加入到生成的war或jar包中。‌例如,‌ServletAPI在Tomcat等容器内部已经提供,‌因此使用provided范围可以避免包冲突。‌
  • runtime:‌代表依赖不再参与项目编译阶段,‌但参与测试和运行阶段。‌这种情况在IDE中无法导入相应的类,‌如果存在依赖类,‌编译过程中将会报错。‌典型的例子是JDBC驱动包,‌如mysql。‌
  • test:‌仅参与测试阶段的工作。‌典型的例子为junit测试框架。‌
  • system:‌与provided范围一致,‌但需要使用systemPath属性指定本地路径。‌这个范围通常不推荐使用,‌因为应该尽量从公共或定制的Maven仓库中引用依赖。‌
  • import:‌这个范围比较特殊,‌不会参与以上阶段运行。‌它只能在dependencyManagement下使用,‌且type需要为pom。‌
  • 典型的例子为Spring-boot依赖。‌通过这种方式,‌可以解决单继承问题,‌也可以更好地将依赖分类。‌

9.Java常见的网关有Apache Kafka、‌Spring Cloud Gateway、‌Netflix Zuul、‌Nginx和Kong。‌

  • Apache Kafka:‌虽然主要被视为一个分布式流处理平台,‌用于处理高容量的实时数据流,‌但它也因其高吞吐量、‌可扩展性和容错性的特点,‌在某些情况下被用作网关1。‌
  • Spring Cloud Gateway:‌基于Spring Framework 5、‌Spring Boot 2和Project Reactor的反应式API网关,‌提供简单而强大的方式来路由请求、‌过滤请求和处理负载均衡1。‌
  • Netflix Zuul:‌一个基于JVM的动态路由和服务端负载均衡的网关,‌可以处理大量并发请求的系统12。‌
  • Nginx:‌高性能的开源反向代理服务器和负载均衡器,‌可以作为网关来处理请求,‌并将它们转发到后端的微服务实例1。‌
  • Kong:‌可扩展的开源API网关,‌用于构建高性能、‌可扩展的微服务架构,‌支持插件化的架构,‌可以灵活地扩展功能13。‌

这些网关都具有不同的特点和适用场景,‌可以根据具体的需求选择合适的网关来构建和管理微服务架构。‌

10、Java常见的注册中心包括Zookeeper、‌Eureka、‌Consul、‌Nacos和Etcd。‌

  • Zookeeper:‌Zookeeper是一个分布式协调服务,‌用于维护配置信息、‌命名、‌提供分布式同步等。‌它提供了简单易用的API接口,‌使得应用程序能够方便地进行服务注册与发现1。‌

  • Eureka:‌Eureka是Netflix开源的服务发现框架,‌用于定位运行在AWS云或其他云平台上的中间件组件,‌从而达到快速服务发现和故障恢复的目的2。‌

  • Consul:‌Consul是一个服务发现和配置管理的工具,‌它提供了键值存储、‌服务注册与发现等功能,‌适用于需要高可用性和可扩展性的分布式系统2。‌

  • Nacos:‌Nacos是一个更易于构建云原生应用的动态服务发现、‌配置管理和服务管理平台。‌它提供了开源的、‌易于使用的特性,‌如服务注册、‌配置管理等2。‌

  • Etcd:‌Etcd是一个高可用的键值存储系统,‌用于实现共享配置和服务发现。‌它提供了轻量级、‌结构简单的数据存储,‌适用于构建可靠的分布式系统2。‌

这些注册中心各有特点,‌适用于不同的应用场景和需求。‌选择合适的注册中心对于构建高效、‌可靠的分布式系统至关重要。

11、

@SpringBootApplication注解包含了以下三个注解:‌@SpringBootConfiguration、‌@EnableAutoConfiguration、‌@ComponentScan。‌

  • @SpringBootConfiguration:‌这个注解声明当前类是SpringBoot应用的配置类。‌Spring会自动扫描到添加了@Configuration的类,‌读取其中的配置信息。‌
  • @EnableAutoConfiguration:‌这个注解开启自动配置功能,‌SpringBoot基于所添加的依赖,‌自动完成web及SpringMVC的默认配置。‌
  • @ComponentScan:‌这个注解默认会扫描@SpringBootApplication所在包和子包,‌相当于如果扫描到有@Component、‌@Controller、‌@Service等这些注解的类,‌则把这些类注册为bean。‌

这些注解共同作用,‌使得@SpringBootApplication成为Spring Boot项目的核心注解,‌目的在于开启自动配置,‌简化项目的配置和部署过程。

12、

Hystrix的状态包括闭合(‌CLOSED)‌、‌开启(‌OPEN)‌和半开(‌HALF_OPEN)‌。‌

  • 闭合状态(‌CLOSED)‌:‌在此状态下,‌一切正常,‌请求可以正常访问服务。‌
  • 开启状态(‌OPEN)‌:‌当错误数达到一定阈值时,‌熔断器开启,‌后续请求不再调用本服务。‌这表示所有请求都会被降级处理,‌以防止问题扩散到其他服务。‌
  • 半开状态(‌HALF_OPEN)‌:‌在开启状态一段时间后,‌熔断器会尝试进入半开状态,‌此时会释放部分请求通过。‌如果这些请求成功,‌则熔断器闭合,‌否则继续保持开启状态。‌这种状态允许系统在出现问题时进行自我修复,‌同时防止整个系统的稳定性受到影响。‌

Hystrix的这种熔断器模式是一种自我保护机制,‌通过其三种状态的变化,‌有效地保护系统不被单个服务的失败所影响,‌从而保障整个系统的稳定性。

13、 传输层可以通过端口标识不同的应用。

14、Websocket不是单通道通讯传输协议。

15、gRpc是跨语言rpc框架。

16、 在TCP/IP中,解决计算机到计算机之间通信问题的层次不是传输层。

17、bootstrap.yaml文件先于application.yaml文件加载。

18、

在Maven中,<dependencyManagement>元素用于提供一个在多模块项目中集中声明依赖版本的方法。它本身不会引入实际的依赖,只是声明了可以被子模块重用的依赖管理。

如果你想要引入实际的依赖,你需要在<dependencies>元素中声明这些依赖。

以下是一个简单的例子:

<project>
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 其他依赖 -->
</dependencies>
...
</project>

19、 应用程序PING 发出的是ICMP请求报文。

20、JAVA进程的JVM参数配置如下 -Xms1G -Xmx2G -Xmn500M -XX:MaxPermSize=64M -XX:+UseConcMarkSweepGC -XX:SurvivorRatio=3, 请问eden区最终分配的大小是多少

根据配置参数,eden区的最终分配大小为500M。因为-Xmn参数指定了新生代的总大小为500M,而新生代包含eden区和两个survivor区,其中survivor区的大小是eden区的1/3,即eden区的大小为500M。

 21、Java方法通常存储在进程中的方法区。‌

Java运行时的数据区包括几个不同的部分,‌其中方法区(‌Method Area)‌是存储已被虚拟机加载的类信息、‌常量、‌静态变量、‌以及编译器编译后的代码等数据的区域。‌这些信息包括了定义Java类的方法,‌即方法的字节码表示形式。‌因此,‌当我们在讨论Java方法存储的位置时,‌指的是这些方法的字节码被存储在方法区中。‌

此外,‌Java虚拟机(‌JVM)‌的数据区还包括堆区(‌Heap)‌,‌它用于存放对象实例,‌几乎所有对象实例都在这里分配内存。‌虚拟机栈(‌VM Stack)‌描述的是Java方法执行的内存模型,‌每个方法在执行的同时会创建一个栈帧(‌Stack Frame)‌,‌用于存储局部变量表、‌操作数栈、‌动态连接、‌方法出口等信息。‌这些栈帧的创建和销毁跟踪了线程运行中一系列的方法调用过程。‌然而,‌这些描述的是方法执行时的内存模型,‌而不是方法本身存储的位置。‌方法区是存储已编译的类结构信息,‌包括方法定义的地方.

22、

在Java中,synchronized关键字可以用来对对象加互斥锁。当一个线程获取到了同步锁,其他尝试获取该同步锁的线程将会被阻塞,直到当前线程释放锁。

以下是一个使用synchronized关键字的简单示例:

public class SynchronizedExample {
private Object lock = new Object();

public void synchronizedMethod() {
synchronized (lock) {
// 临界区代码
}
}

public static void main(String[] args) {
SynchronizedExample example = new SynchronizedExample();

// 在多线程环境下运行
new Thread(example::synchronizedMethod).start();
new Thread(example::synchronizedMethod).start();
}
}

23、 OpenAPI提供认证的票据包括 1、2、3

Java OpenAPI提供的用于鉴权的票据通常指的是用于访问受保护资源的证书或令牌。以下是这些术语的简要解释:

  1.  TGTC (Ticket-Granting Ticket): 是一个用于认证用户并授权生成下级票据的票据。它通常由认证服务生成,并可以用于获取其他服务的票据。

  2.  MPT (Multi-Factor Password Token): 通常是一个一次性密码,用于两步验证过程。 

  3.  STGT (Service Ticket): 是一个短期票据,用于访问特定服务。它是由TGTC或其他服务票据颁发的。 

  4.  NT (Negotiate): 是一种用于客户端和服务器之间协商认证方法的协议,它可以使用Kerberos票据。 

这些票据通常在使用认证服务(如Kerberos、SAML、OAuth等)时被使用。在Java中,你可能会使用一些库,如Jasig的CAS客户端库或Spring Security的支持库来处理这些票据。

由于具体实现可能依赖于OpenAPI的具体实现和认证协议,我无法提供详细的代码示例。不过,你可以查看相关的OpenAPI Java库文档,了解如何创建和使用这些票据。

24、 IAM支持从哪些维度进行放暴力攻击有 账号锁定 IP锁定

posted @ 2024-07-17 09:46  皇问天  阅读(3)  评论(0编辑  收藏  举报