自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

靡不有初,鲜克有终

靡不有初,鲜克有终

  • 博客(369)
  • 资源 (2)
  • 收藏
  • 关注

原创 `Callable` 是 Java 中的一个接口,与 `Runnable` 接口类似,但它可以返回一个结果并且能抛出异常。

2. **使用 ExecutorService 执行 Callable 任务**:创建一个 `ExecutorService` 来提交 `Callable` 任务,并返回一个 `Future` 对象,该对象可以用来获取任务的结果。4. **使用 FutureTask**:`FutureTask` 是 `Future` 和 `Runnable` 的实现,它可以用来包装一个 `Callable` 对象。6. **检查任务状态**:可以通过 `Future.isDone()` 方法检查任务是否已完成。

2024-09-29 09:23:41 310

原创 缓存击穿和缓存穿透是两种常见的缓存问题,它们对系统的性能和稳定性有重大影响

*缓存击穿**是指一个非常热门的key在缓存中过期的瞬间,大量的请求同时到达,由于缓存中没有这个key,导致这些请求都直接访问数据库,从而对数据库造成压力。缓存击穿和缓存穿透的区别在于,缓存击穿是针对某个热点key过期时导致的大量请求直接访问数据库,而缓存穿透是每次查询都不存在该key的数据,导致每次请求都直接访问数据库。**缓存穿透**是指请求的数据在缓存和数据库中都不存在,这样的请求每次都会访问数据库,不会访问缓存。缓存击穿和缓存穿透是两种常见的缓存问题,它们对系统的性能和稳定性有重大影响。

2024-09-29 08:41:00 286

原创 数据分析平台是用于处理、分析和可视化数据的工具,它们可以帮助用户从大量数据中提取有价值的信息和洞察

5. **亿信ABI**:是一个一站式大数据分析平台,提供报表分析、大屏可视化、敏捷分析、报告分析、智能分析和数据填报等功能。它支持多种数据处理任务,如数据采集、存储、分析和可视化,适用于不同的业务场景。6. **开源工具**:如Apache Superset、Metabase、OpenRefine等,这些工具通常具有强大的社区支持,提供数据可视化、数据挖掘和数据管理等功能。选择合适的数据分析平台时,应考虑数据源的兼容性、分析工具的功能、用户界面的易用性、安全性、成本以及是否支持所需的数据量等因素。

2024-09-28 22:10:50 219

原创 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,广泛应用于图像处理、图像识别、图像合成等领域

6. **深度学习**:通过DNN模块,支持深度学习模型的加载和推断,可以用于图像分类、目标检测等。1. **图像处理**:包括图像的读取、显示、存储,以及图像的转换、滤波、几何变换等。- **机器学习**:使用OpenCV的机器学习模块进行数据分析和模式识别。5. **机器学习**:内置了多种机器学习算法,用于图像分类、聚类等任务。2. **图像识别**:提供了一系列特征检测和描述子算法,用于图像识别。3. **图像合成**:支持图像的合成、分割和融合。

2024-09-28 22:06:01 293

原创 IT技术(信息技术)是一个广泛的领域,涵盖了多种技术和学科。IT技术通常可以分为以下几个主要类别:

4. **数据库技术**:涉及数据存储、检索和管理的技术,如关系型数据库(SQL)、非关系型数据库(NoSQL)等。13. **信息安全**:保护信息和信息系统免受未经授权访问、使用、披露、破坏、修改或破坏的技术和过程。1. **计算机硬件**:包括计算机的物理组件,如处理器、内存、硬盘、显卡、主板、网络设备等。- **无线网络**:如Wi-Fi、蓝牙、移动通信技术(2G、3G、4G、5G)等。5. **云计算**:提供按需访问计算资源(如服务器、存储、数据库、网络、软件等)的服务。

2024-09-28 22:00:52 370

原创 MyBatis 的底层设计主要围绕几个核心概念

它的设计允许开发者自定义几乎所有的组件,以满足特定的需求。- 有三种类型:`SimpleExecutor`、`ReuseExecutor`、`BatchExecutor`,分别用于简单执行、执行结果复用和批量操作。2. **获取 SqlSession**:通过 `SqlSessionFactory` 获取 `SqlSession`。4. **获取映射器**:通过 `SqlSession` 获取映射器接口的代理对象。3. **执行命令**:通过 `SqlSession` 执行映射的 SQL 命令。

2024-09-28 21:56:14 299

原创 分布式链路追踪系统是一种用于监控和诊断分布式系统中请求处理的工具

2. **Span**:一个Trace由多个Span组成,每个Span表示请求在某个服务或组件中的处理过程。1. **Trace ID**:每个请求都有一个唯一的Trace ID,用于标识整个请求链路。3. **Annotation**:用于标记请求处理的关键时间点,如请求开始、结束等。1. **拦截请求**:在服务的入口点拦截请求,生成Trace ID和Span。5. **存储和分析**:追踪系统存储数据,并提供查询和分析功能。4. **上报数据**:将收集到的数据上报给追踪系统。

2024-09-28 21:20:39 163

原创 评估Guava `RateLimiter`的性能通常需要考虑以下几个方面:

Guava的`RateLimiter`是基于平滑突发限制的令牌桶算法实现的,它能够很好地控制速率,但可能在高负载下会有微小的偏差。一个稳定的限流器应该能够在各种情况下都保持其性能。- **测试工具**:使用专业的性能测试工具,如JMeter、Gatling等,可以更准确地模拟真实世界的请求。- 在实际的生产环境中部署`RateLimiter`,并监控其性能表现,这是评估其性能的最准确方式。- **预热**:在开始性能测试之前,应该让`RateLimiter`预热一段时间,以确保其内部状态稳定。

2024-09-28 21:01:20 265

原创 在Java生态中,Guava库提供了一个简单而强大的工具,名为`RateLimiter`,用于实现令牌桶算法的限流。

Guava的`RateLimiter`类提供了几种创建实例的方法,最常见的是使用每秒多少个请求(QPS,Queries Per Second)来定义速率。- **tryAcquire方法**:尝试获取令牌,如果获取成功则返回true,否则返回false。- **请求**:每次请求会消耗一定数量的令牌,如果桶中令牌不足,则请求可能会被阻塞或拒绝。- **获取令牌**:如果需要获取多个令牌,可以传递数量参数。- **桶**:有一个容量上限,代表可以存储的令牌数量。- **令牌**:以固定的时间间隔添加到桶中。

2024-09-28 20:57:17 353

原创 限流算法是用于控制资源使用量的一种技术,以避免系统过载。

在Spring Cloud Alibaba中,Sentinel是一个重要的组件,它提供了上述一些限流算法的实现,并且可以很容易地集成到Spring Cloud应用中。在微服务架构中,限流算法尤其重要,因为它们可以帮助保护服务免受过多请求的冲击,从而确保系统的稳定性和可靠性。在每个窗口内,只允许一定数量的请求通过。- 为了解决固定窗口算法的瞬时高峰问题,滑动窗口算法将时间划分为多个小窗口,并为每个小窗口设置请求计数。- 它比滑动窗口计数器算法更精确,因为它跟踪每个请求的具体时间,而不是将请求分到小窗口中。

2024-09-28 20:55:08 147

原创 Nacos 的服务注册表结构是为了高效地管理服务实例和服务消费者之间的映射关系

6. **实例 ID(Instance ID)**:唯一标识服务实例的 ID,通常是 IP 地址和端口号的组合。12. **租约到期时间(Lease Expires)**:服务实例的心跳租约到期时间,用于服务注册的续租。10. **注册时间(Register Time)**:服务实例注册到 Nacos 的时间。2. **服务地址(IP Address)**:提供服务的实例的 IP 地址。1. **服务名称(Service Name)**:唯一标识一个服务的名称。

2024-09-26 18:11:33 682

原创 Raft是一种分布式一致性算法,旨在解决分布式系统中的数据一致性问题。

选举过程是Raft算法的核心部分。如果Follower在一定时间内没有收到Leader的心跳,它会变为Candidate并开始选举过程。如果获得大多数节点的选票,Candidate会变为Leader,否则重新变为Follower。当Follower在一定时间内没有收到Leader的心跳时,它会变为Candidate并触发选举过程。如果选举成功,Candidate会变为Leader,否则会重新变为Follower。Raft算法保证,一旦日志被提交,所有节点的状态机都会执行相同的操作,确保数据的一致性。

2024-09-26 18:10:30 325

原创 Nacos配置更新的工作流程

6. **优化措施**:为了提高效率,Nacos客户端会对配置进行分片,每次最多处理3000个配置项,并且通过计算配置的MD5值来减少需要比较的数据量。3. **数据存储与事件发布**:如果配置有更新,服务端会将最新的配置数据存储到数据库,并发布一个`ConfigDataChangeEvent`事件,该事件负责将变更同步到Nacos集群中的其他机器。5. **客户端处理变更**:客户端接收到配置变更通知后,会获取更新后的配置,并应用到应用程序中,这个过程通常是自动的,无需重启服务。

2024-09-26 18:01:42 222

原创 在高并发场景下选择MySQL存储引擎时,主要考虑的因素包括事务支持、并发性能、数据一致性、数据存储需求以及特殊功能需求

例如,调整`innodb_buffer_pool_size`、`innodb_log_file_size`和`innodb_flush_log_at_trx_commit`等参数可以优化InnoDB的性能。同时,合理的索引设计、避免不必要的锁争用、使用批量插入和适当的事务大小也有助于提升并发性能。在实际应用中,可能需要根据具体的业务需求和性能目标,结合上述存储引擎的特点进行选择和优化。在高并发场景下选择MySQL存储引擎时,主要考虑的因素包括事务支持、并发性能、数据一致性、数据存储需求以及特殊功能需求。

2024-09-23 14:33:16 547

原创 InnoDB是MySQL中最常用且功能最丰富的存储引擎之一,它支持事务处理、行级锁定和外键约束等特性。与其他存储引擎相比,InnoDB具有以下主要区别:

**InnoDB**:支持完整的事务处理,包括事务的ACID特性(原子性、一致性、隔离性、持久性)。- **MyISAM**:在读取密集型的应用中,且不需要事务支持时,可能会有更好的性能。- **InnoDB**:使用聚簇索引,数据和索引存储在一起,可以提高查询效率。- **Memory**:将所有数据存储在内存中,访问速度快,但数据不是持久的。- **InnoDB**:支持行级锁定,可以提高并发性能,减少锁争用。- **MyISAM**:也支持B-tree索引,但不支持哈希索引。

2024-09-23 14:26:07 229

原创 InnoDB是MySQL数据库的默认存储引擎,它提供了事务处理、行级锁定和外键等特性。InnoDB通过以下机制来实现事务

Redo Log用于记录事务对数据页所做的修改,即使在数据库发生故障的情况下,Redo Log也能保证事务的持久性。这样即使数据库崩溃,也能通过Redo Log恢复已提交的事务。- 当事务提交时,InnoDB会将Log Buffer中的内容刷新到磁盘上的Redo Log文件中,并根据需要将Buffer Pool中的数据页刷新到磁盘中,以确保数据的持久性。- 如果事务在执行过程中遇到错误或者用户显式地回滚事务,InnoDB会利用Undo Log中的信息将数据恢复到事务开始前的状态,确保数据库的一致性。

2024-09-23 14:18:22 498

原创 在MySQL中,分区表是一种将表的数据分散存储在不同的物理区域的技术,这有助于提高查询性能和数据管理的效率。MySQL支持多种分区类型

在MySQL中,分区表是一种将表的数据分散存储在不同的物理区域的技术,这有助于提高查询性能和数据管理的效率。MySQL支持多种分区类型,如范围分区(RANGE)、列表分区(LIST)、散列分区(HASH)等。1. **确定分区类型**:根据你的需求选择合适的分区类型。2. **确定分区键**:选择一个或多个列作为分区键,通常这些列是用于查询条件的列。- 在创建分区表之前,确保你了解分区的优缺点,以及它对你的具体应用场景的影响。3. **定义分区**:根据分区类型定义具体的分区。

2024-09-23 14:06:34 481

原创 分区表(Partition Table)是计算机硬盘驱动器上一个重要的数据结构

操作分区表时需要谨慎,因为错误的操作可能会导致数据丢失。- **MBR(Master Boot Record)**:传统的分区表格式,最多支持4个主分区或3个主分区加1个扩展分区。- **GPT(GUID Partition Table)**:现代的分区表格式,支持更多的分区数量,没有硬盘容量限制,通常用于大于2TB的硬盘。3. **组织数据**:分区表允许用户将数据分散存储在硬盘的不同部分,这有助于提高数据的组织和访问效率。2. **启动系统**:分区表中的信息用于确定哪个分区包含操作系统的启动代码。

2024-09-23 13:58:20 244

原创 如何在 Vue 中优化组件的生命周期管理?

1. **合理使用生命周期钩子**:在适当的生命周期阶段执行必要的操作,例如在 `created` 或 `mounted` 钩子中进行数据初始化和异步请求,确保在组件渲染之前完成必要的数据准备。3. **使用 `setup()` 进行状态管理**:在 Vue 3 中,`setup()` 函数是推荐的状态管理方式,它提供了更好的响应式支持和更灵活的逻辑组织。5. **使用 `onBeforeUnmount` 钩子进行资源清理**:在组件即将被卸载前,执行清理操作,如取消事件监听器、清除定时器等。

2024-09-22 23:57:57 373

原创 Vue 的父组件和子组件生命周期钩子函数执行顺序

Vue 3 引入了 Composition API,其中 `setup` 函数是一个新的生命周期钩子,它在 `beforeCreate` 和 `created` 之前执行。此外,Vue 3 引入了 `onBeforeMount`、`onMounted`、`onBeforeUpdate`、`onUpdated`、`onBeforeUnmount` 和 `onUnmounted` 这样的生命周期钩子函数,它们可以在 `setup` 函数中使用,并且提供了与选项式 API 中相同的生命周期钩子函数的功能。

2024-09-22 23:55:44 222

原创 从入门到精通 Vue.js 的一些步骤

阅读官方文档:[Vue.js 官方文档](https://v3.vuejs.org/)是学习 Vue.js 的最佳起点。- **书籍**:《Vue.js in Action》、《Learning Vue.js 2》等。- **官方文档**:[Vue.js 官方文档](https://v3.vuejs.org/)- **参与社区**:加入 Vue.js 社区,与其他开发者交流和学习。- 学习如何在 Vue 项目中使用 TypeScript。- **阅读源码**:尝试阅读和理解 Vue.js 的源码。

2024-09-22 23:46:50 582

原创 在使用 antd-vue 的级联选择器(Cascader)时,如果遇到设置默认值(`defaultValue`)不生效的问题

6. **移除 `value` 属性**:如果你同时设置了 `value` 和 `defaultValue` 属性,可能会导致 `defaultValue` 不生效。1. **使用 `key` 属性**:为级联选择器组件添加一个 `key` 属性,并且将 `key` 的值设置为与 `defaultValue` 相同的值。3. **动态更新 `options`**:如果你的 `options` 数据是动态加载的,请确保在数据加载完成后再设置 `defaultValue`。

2024-09-22 23:40:52 284

原创 RPC(Remote Procedure Call)即远程过程调用

RPC(Remote Procedure Call)即远程过程调用,它允许一个程序(客户端)通过网络向另一个程序(服务器)请求服务,而无需了解底层网络技术。RPC 使得分布式系统中的服务调用变得像本地调用一样简单。

2024-09-22 23:12:53 301

原创 打破双亲委派的方法

2024-09-22 21:11:43 86

原创 Sentinel介绍

以上的问题在链路调用中会产生放大的效果。1. 当以上的这些配置配置好以后,我们就可以进行测试了,那我们的测试方式就是,首先保证Nacos和Sentinel都是启动状态,然后再来启动项目,按照我们的理解这个时候,就应该在Sentinel的dashboard上能体现出它监控的服务,但是此时并没有,原因是因为Sentinel本身采用的是懒加载机制,所以我们需要首先访问服务对应的接口,Sentinel才能工作。当请求到来的时候,如果当前请求距离上个通过的请求通过的时间间隔不小于预设值,则让当前请求通过。

2024-09-22 19:40:48 1269

原创 Nacos如何实现高可用

2024-09-22 18:49:27 89

原创 Spring事务失效的八大场景的分析

2024-09-22 18:17:24 197

原创 关于如何从10个1G的文件中找出出现次数最多的前十个单词

在实际应用中,选择哪种方法取决于具体的需求,如果需要精确的结果并且有足够的内存和计算资源,可以选择第一种方法。- 这种方法的优点是内存使用效率高,但可能需要两次遍历文件,并且得到的是近似结果,因为HyperLogLog提供的是基数的估算值。- 为了找出所有文件中出现次数最多的单词,可以使用一个优先队列(小顶堆),大小设置为10,以便存储当前发现的最多的10个单词。- 在遍历文件的过程中,如果遇到一个单词的出现次数超过了堆顶的单词,就替换堆顶的单词,并重新调整堆。

2024-09-22 13:43:32 387

原创 HyperLogLog 是 Redis 提供的一种数据结构,它用于统计集合中不重复元素的数量,特别适用于处理大规模数据集。

HyperLogLog 的核心优势在于其内存效率,无论集合中包含多少元素,每个 HyperLogLog 键只需要大约 12KB 的内存,并且可以处理接近 2^64 个不同元素的基数。在 Redis 2.8.9 版本及以上,HyperLogLog 功能是可用的,它通过内部的位图和哈希函数实现,可以高效地处理大数据量的去重统计需求。需要注意的是,由于 HyperLogLog 使用的是概率算法,其结果存在一定的误差范围,但在大多数实际应用中,这个误差是可以接受的。- 统计用户行为,如搜索词条的不同搜索次数。

2024-09-22 13:32:12 302

原创 redis数据类型

2024-09-22 11:54:10 175

原创 Dockerfile 是一个文本文件,它包含了一系列的指令和参数

6. **运行命令**:运行命令安装软件包或执行其他操作。11. **多阶段构建**:使用多阶段构建来减小镜像大小。7. **暴露端口**:声明容器运行时监听的端口。1. **基础镜像**:指定从哪个镜像开始构建。4. **工作目录**:设置容器内的工作目录。8. **启动命令**:容器启动时执行的命令。2. **维护者信息**:指定维护者信息。9. **健康检查**:设置健康检查命令。3. **环境变量**:设置环境变量。10. **标签**:为镜像设置标签。

2024-09-21 15:01:22 420

原创 Nacos 作为服务发现和配置管理工具,其底层原理是支撑其高效、稳定运行的关键

**服务注册**:服务提供者启动时,会向 Nacos 服务器注册自己的服务信息(如 IP 地址和端口号),这些信息被存储在 Nacos 服务器的内存中,形成服务注册表。- **服务发现**:服务消费者通过 Nacos 服务器查询服务提供者的地址列表,Nacos 根据请求的服务名返回对应的服务实例信息。- **责任分摊**:在 Nacos 集群中,不同的服务实例可能由不同的 Nacos 节点负责管理,以平衡负载。- **版本控制**:配置的每次变更都会生成新的版本,支持配置的历史版本回滚。

2024-09-16 12:39:20 379

原创 Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台

**服务发现**:服务消费者通过 Nacos 服务器查询服务提供者的地址,Nacos 服务器会返回可用的服务提供者列表。Nacos 的设计目标是提供简单、易用、高效、可靠的服务发现和配置管理能力,以支持微服务架构的快速发展和云原生应用的构建。- **服务注册**:服务提供者在启动时,会向 Nacos 服务器注册自己的服务信息,包括 IP 地址、端口号等。- Nacos 提供了服务健康检查机制,可以定期检查服务实例的健康状态,并在服务实例不健康时将其从服务列表中移除。

2024-09-16 12:33:35 330

原创 RocketMQ 和 Kafka 的区别

4. **消息存储**:RocketMQ 使用 CommitLog 和 ConsumeQueue 存储消息,Kafka 使用 Log 文件。死信队列用于处理无法正常消费的消息。2. **消息模型**:RocketMQ 支持严格的顺序消息和事务消息,Kafka 则主要支持简单的发布/订阅模型。5. **Consumer Group**:一组消费者,它们共同消费消息,通常用于实现负载均衡和故障转移。1. **设计哲学**:RocketMQ 更注重消息的可靠性和实时性,而 Kafka 更注重消息的吞吐量。

2024-09-16 12:06:02 386

原创 在 Elasticsearch 中段(Segment)的组成部分

因此,Elasticsearch 会定期进行**段合并(Segment Merging)**操作,将多个小的段合并成大的段,以优化搜索性能和存储效率。在 Elasticsearch 中,一个索引由多个**分片(Shard)**组成,而每个分片又由多个**段(Segment)**构成。2. **正排索引(Forward Index)**:与倒排索引相对应,正排索引存储了文档的内容和元数据,以及词项在文档中的位置。7. **词项位置(Term Positions)**:记录了词项在文档中的位置信息。

2024-09-16 11:03:11 466

原创 人脸识别过程中捕获的图像数据保存为 Base64 编码的字符串

处理完成后,可以将结果解码回原始图像数据,或者直接在应用中使用 Base64 编码的数据。2. **传输方便**:Base64 编码的字符串可以通过 HTTP 协议传输,并且可以嵌入到 JSON、XML 或 HTML 中,这在 Web 应用中非常有用。5. **存储**:将 Base64 编码的字符串存储在数据库中是常见的做法,但需要注意,由于编码后的数据体积增加,可能会占用更多的存储空间。1. **编码效率**:Base64 编码会增加数据的大小,通常编码后的数据会比原始的二进制数据大约增加33%。

2024-09-14 10:16:49 422

原创 在 React 中,如果您想要限制树形结构的编辑操作只能应用于根节点

在 React 中,如果您想要限制树形结构的编辑操作只能应用于根节点,您可以在组件的状态中维护一个标志来控制编辑权限,并在树的每个节点上根据这个标志来启用或禁用编辑功能。例如,您可能需要添加更多的逻辑来处理节点的编辑状态,或者在编辑时更新树的数据。- 在 `Tree` 组件中,我们维护了 `treeData` 状态来存储树的数据,以及 `allowEdit` 状态来控制编辑权限。- 当点击编辑按钮时,`editNode` 函数会被调用,并且编辑状态会被禁用,以防止其他节点被编辑。// 编辑节点的逻辑。

2024-09-13 15:38:08 415

原创 雪花算法时钟回拨问题怎么解决

6. **基于时钟序列的方案**:将原本的机器码拆分成时钟序列和机器码,发生时间回拨时,时钟序列增加,从而重新定义整个雪花ID,并通过DB或缓存等方式存储时钟序列以避免实例重启引起时间序列丢失。4. **时间戳备份与校验**:记录最近一次成功生成ID的时间戳,当检测到时钟回拨时,依然基于该时间戳生成ID,直到系统时钟重新超过这个时间点。3. **容忍一定范围内的时钟回拨**:设置一个时钟回拨容忍窗口,允许在一定时间范围内的时钟回拨,超出这个范围再拒绝生成ID或触发报警。

2024-09-10 22:56:23 305

原创 AQS唤醒节点时,为何从后往前找

2. **处理取消的节点**:如果一个节点的状态被设置为`CANCELLED`(表示线程不再等待同步状态),那么它不会被唤醒。从尾部向前遍历可以跳过这些已经取消的节点,找到有效的节点进行唤醒。3. **维护队列的顺序**:AQS维护的是一个FIFO(先进先出)的队列,从尾部向前遍历可以确保按照队列的顺序来唤醒线程,避免由于并发操作导致队列顺序混乱。4. **处理并发修改**:在并发环境下,队列的尾部可能会不断地变化,新的节点可能会被添加到尾部,而从尾部向前遍历可以确保在遍历过程中不会错过新加入的节点。

2024-09-10 22:40:50 130

原创 Tomcat的部署方法主要有以下几种:

2. **修改server.xml文件**:在Tomcat的`conf`目录下的`server.xml`文件中添加`<Context>`标签,指定应用的路径、部署路径等信息。3. **使用Tomcat的manager应用进行部署**:通过Tomcat管理界面的`/manager/html`路径登录后,可以上传WAR文件或者指定应用的路径进行部署。5. **使用WAR文件进行部署**:将应用打包成WAR文件后,通过Tomcat的命令行工具或者管理界面上传WAR文件进行部署。

2024-09-09 23:00:44 154

Java并发编程与高并发解决.zip

Java并发编程与高并发解决方案笔记-基础篇Java并发编程与高并发解决方案笔记-基础篇Java并发编程与高并发解决方案笔记-基础篇Java并发编程与高并发解决方案笔记Java并发编程与高并发解决方案笔记-基础篇-基础篇Java并发编程与高并发解Java并发编程与高并发解决方案笔记-基础篇决方案笔记-基础篇

2020-01-29

Python高级编程书籍

Python高级编程书籍 Python高级编程书籍 Python高级编程书籍 Python高级编程书籍 Python高级编程书籍 Python高级编程书籍 Python高级编程书籍 Python高级编程书籍

2017-11-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除