Skip to content

Commit 9325ff5

Browse files
Shadow-JavaAcgelababy
authored andcommitted
feat: mybatis
1 parent ce706fd commit 9325ff5

File tree

4 files changed

+75
-2
lines changed

4 files changed

+75
-2
lines changed

database/mysql/problem.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,13 @@
1-
你有十亿的数据,怎么搞
1+
索引:类似于书籍的目录,可以快速定位到特定数值的记录;在关系型数据库中,索引通常是基于一个或多个列的值记录,存储结构类似于hash表和B+树结构,并存储指向实际数据的指针或者引用,通过索引数据库系统可以**直接定位数据所在的块或者页**,而无需扫描整张表。
2+
要定义一个索引:
3+
1.表名:确定为那个表创建索引
4+
2.列名:选择一个或者多个列作为索引的键。通常选择经常被查询或连接的列,以及排序或者过滤的列
5+
3.索引类型:选择适合数据访问模式和查询需求的索引类型。常见的索引类型包括B树索引、hash索引、全文索引
6+
4.索引名称:为索引指定一个唯一的名称,以便在需要的时候使用
7+
举例:如mysql创建一个B树索引
8+
CREATE INDEX index_name on table (column1,column2....)
9+
创建索引并非是无代价的,会占用额外空间,并对数据的插入、更新和删除操作产生一定的性能开销。
10+
使用索引可以带来以下几个方面的检索优势:
11+
**快速定位**:索引提供了一种快速定位数据的方式。通过索引,数据库系统可以直接跳过大部分数据,只查找包含所需数据的磁盘块或页面,从而减少了磁盘访问次数。
12+
**减少磁盘IO**:通过减少磁盘访问次数,索引可以显著降低从磁盘读取数据的IO开销。相比于全表扫描,使用索引可以大幅提高查询性能。
13+
**加速排序和聚合操作**:索引可以提供有序的数据访问,从而加速排序和聚合操作(如SUM、AVG、MAX、MIN等)。通过有序索引,数据库系统可以更快地定位到指定范围内的数据。

languages/java/mutil-thread/thread.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,3 +206,43 @@ volatile的三重功效:64位写⼊的原⼦性、内存可⻅性和禁⽌重
206206
volatile 关键字只保证了对变量的读写操作的可见性和顺序性,并不保证原子性。如果需要保证原子性,可以考虑使用其他同步机制,如锁或原子类
207207

208208
[面试官:Java线程与底层操作系统线程是一 一对应的吗? 中篇[]_mob60475706bec5的技术博客_51CTO博客](https://blog.51cto.com/u_15127698/2842977)
209+
210+
## 1.什么是线程?
211+
线程是Java语言提供的多线程机制,用于实现并发执行的程序单元。Java线程是有JVM创建和管理的,通过Thread类来操作线程。底层通过操作系统的线程的支持来实现线程创建、切换和调度的。Java也提供了自己的线程调度器(Thread Scheduler)决定线程在那个时间点上执行,以及他们的优先级、时间片等调度策略。
212+
Jvm可能一些技术优化线程的创建和管理,如线程池和线程重用技术,与操作系统的线程可能是多对一。
213+
## 2.什么是线程池?
214+
线程池是一种并发编程技术,通过创建一组线程并管理他们的生命周期,以提供线程的重用和有效的调度。线程池技术可以优化线程的创建和销毁开销,提供系统性能和资源利用率。
215+
线程池包含以下条件:
216+
线程队列(Thread Queue):用于存储待执行的任务。当任务到达时会从线程池中获取任务。
217+
工作线程(Worker Thread):线程池中预先创建的线程。他们负责从线程池中获取一组任务。
218+
任务接口(Task Interface):定义了要执行任务的抽象类或接口。任务可以是各种形式的单元,例如Runnable或Callable
219+
线程池管理器(ThreadPool Manager):负责创建和管理线程,包括线程的创建、调度和销毁
220+
线程池的工作原理:
221+
**初始化线程池**:在启动应用程序时,线程池会预先创建一定数量的工作线程,并将它们保存在线程池中。
222+
**提交任务**:当有任务需要执行时,应用程序可以将任务提交给线程池。任务会被放入线程队列中等待执行。
223+
**任务调度**:线程池管理器会从线程队列中获取待执行的任务,并分配给空闲的工作线程执行。
224+
**执行任务**:工作线程执行任务,并在任务完成后返回线程池,准备执行下一个任务。
225+
**线程重用**:一旦任务执行完毕,工作线程并不会立即销毁,而是继续保持在线程池中,可以被复用来执行其他任务。初始化线程池:在启动应用程序时,线程池会预先创建一定数量的工作线程,并将它们保存在线程池中。
226+
Java中的Executor框架提供了丰富的线程池实现,包括ThreadPoolExecutor和ScheduledThreadPoolExecutor等,使得线程池的使用变得更加方便和灵活。
227+
228+
## 3.线程的创建和销毁需要准备什么?
229+
线程的创建和销毁过程会对系统产生一定的性能损耗,主要体现在以下几个方面:
230+
231+
**上下文切换开销**:线程的创建和销毁涉及到上下文切换的过程。当一个线程被创建时,需要分配和初始化线程的数据结构、栈空间等资源,并将控制权从父线程切换到新创建的子线程。同样,线程的销毁也需要进行上下文切换,将控制权返回给父线程。这些上下文切换操作会引入一定的开销,包括寄存器状态的保存和恢复、内核态与用户态之间的切换等。
232+
233+
**资源消耗**:每个线程都需要占用一定的系统资源,包括内存、**栈空间**、线程控制块等。线程的创建会增加系统的资源消耗,而线程的销毁则会释放这些资源。如果频繁地创建和销毁线程,会导致系统资源的频繁分配和回收,增加了系统的开销。
234+
235+
**线程同步与通信开销**:在多线程环境下,线程之间可能需要进行同步和通信,以确保数据的一致性和正确性。线程的创建和销毁可能会引入额外的同步和通信开销,例如等待新线程的创建完成、资源的初始化、线程间的通知和等待等操作。这些开销会增加系统的负担,并且在复杂的线程同步场景中可能导致性能下降。
236+
237+
**系统调度开销**:线程的创建和销毁会对系统的调度产生影响。当线程被创建时,系统需要为新线程分配CPU时间片,并进行调度。而线程的销毁会使系统重新调整现有线程的调度优先级和顺序。这些调度开销会增加系统的开销,特别是在线程频繁创建和销毁的情况下。
238+
239+
在线程创建时,需要准备一些上下文信息,以确保线程能够正确执行。这些上下文信息包括:
240+
线程函数/入口点:创建线程时需要指定线程函数或线程的入口点。线程函数是线程执行的起始点,线程将从该函数开始执行任务。
241+
栈空间:每个线程都需要有自己的栈空间,用于存储局部变量、函数调用信息以及其他线程执行所需的上下文数据。在线程创建时,需要分配一定大小的栈空间。
242+
线程参数:如果线程函数需要接受参数,那么在线程创建时需要将参数传递给线程函数。这些参数可以是数值、指针或其他数据类型,用于传递线程所需的初始化数据。
243+
线程标识:为了能够在程序中唯一标识和管理线程,创建线程时通常会分配一个唯一的线程标识,以便后续对线程进行操作和管理。
244+
线程状态信息:线程的状态信息用于记录线程的运行状态,例如就绪、运行、阻塞等。在线程创建时,需要对线程的状态进行初始化,通常将线程初始状态设置为就绪状态,以便系统进行调度。
245+
CPU寄存器状态:在创建线程时,需要保存当前线程创建时的CPU寄存器状态,以便在线程切换时能够正确地恢复线程的执行状态。
246+
调度优先级:线程的调度优先级决定了它在系统中获得CPU时间片的优先级。在线程创建时,可以设置线程的调度优先级,以控制线程的调度行为。
247+
248+
以上是一些常见的线程创建时需要准备的上下文信息,具体的上下文数据可能会因操作系统和编程语言的不同而有所差异。这些上下文信息的准备是为了确保线程能够正确地执行任务,并与其他线程协同工作。
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
## 为什么使用数据库连接池技术?
2+
在数据库连接的创建:建立网络连接、分配内存和CPU进行创建的资源准备
3+
数据库连接销毁过程:会释放连接占用的内存、关闭网络连接、释放文件描述符、回收连接池资源和提交未完成的事务、清理临时表或数据等
4+
所以性能有损耗,故使用连接池技术,利用连接池重用技术和管理一组连接的生命周期等
5+

tools/maven/senior.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,20 @@
11
https://blog.csdn.net/wuzhongqiang/article/details/103227170
22
git fork的使用 Syncing a fork
33

4-
是怎么将两个不同的remote进行同步的
4+
是怎么将两个不同的remote进行同步的
5+
6+
7+
setting.xml:settings.xml 是 Maven 的全局配置文件,位于 Maven 安装目录下的 conf 文件夹中,或者用户的 Maven 配置目录下。它包含了全局的配置信息,如镜像仓库、代理设置、身份验证信息等。settings.xml 的配置适用于整个 Maven 系统,对所有项目都起作用。
8+
pom.xml:pom.xml 是 Maven 项目的核心配置文件,位于每个 Maven 项目的根目录下。它定义了项目的结构、依赖项、插件、构建配置等。pom.xml 文件是针对每个具体项目的,每个项目都有自己的独立配置。
9+
在maven的依赖声明中 ,"org.springframework.boot:spring-boot-starter-jetty:jar:1.5.9.RELEASE:compile" 这个字符串包含了几个不同的值,用于指定依赖项的信息。下面是这个字符串中各个部分的含义:
10+
11+
groupId: 这是指定依赖项所属的组织或者团队的唯一标识符。在这个例子中,org.springframework.boot 是 Spring Boot 项目的组织标识。
12+
artifactId: 这是指定依赖项的唯一标识符,用于在其所属组织或者团队内部区分不同的项目。在这个例子中,spring-boot-starter-jetty 是 Spring Boot Jetty Starter 的项目标识。
13+
jar: 这是指定依赖项的类型,表示这个依赖项是一个 JAR 文件。其他常见的类型还包括 war、pom 等。
14+
1.5.9.RELEASE: 这是指定依赖项的版本号。在这个例子中,依赖项的版本号是 1.5.9.RELEASE。
15+
compile: 这是指定依赖项的作用范围(Scope)。作用范围决定了依赖项在不同阶段的使用方式。compile 表示该依赖项在编译阶段和运行时都需要被包含。
16+
17+
18+
modelVersion 是 Maven POM(Project Object Model,项目对象模型)的元素之一,它指定了当前 POM 的模型版本。POM 是 Maven 项目的核心配置文件,用于定义项目的结构、依赖项、插件、构建配置等。
19+
20+
modelVersion 元素指定了当前 POM 所使用的 POM 模型的版本号。它是 POM 文件的第一个元素,通常设置为固定值 "4.0.0",表示使用 Maven 4 版本的 POM 模型。这个值告诉 Maven 构建系统如何解析和处理 POM 文件中的其他元素和配置

0 commit comments

Comments
 (0)