首页 文章 精选 留言 我的

精选列表

搜索[自我进化],共7154篇文章
优秀的个人博客,低调大师

从性能到设计全面进化 AORUS GeForce RTX 5080 INFINITY产品解析

对于高端显卡选购而言,性能早已不是唯一的考虑维度。随着侧透机箱、主题装机和桌面美学逐渐成为DIY玩家的重要需求,显卡本身也从单纯的性能硬件,成为整机视觉设计中的核心组成部分。作为技嘉40周年推出的AORUS INFINITY系列代表产品,AORUS GeForce RTX 5080 INFINITY 16G在旗舰性能基础上,引入全新的外观设计语言、灯效与装机细节,为高端游戏平台提供更完整的产品体验。 双引擎舱设计,打造INFINITY专属辨识度 AORUS GeForce RTX 5080 INFINITY最鲜明的变化首先来自外观。产品以航空发动机舱为灵感,采用双引擎舱式造型,圆润包覆的外壳与两侧风扇形成强烈视觉中心,与传统三风扇显卡常见的横向布局形成明显区别。 围绕风扇内外环,AORUS INFINITY加入RGB炫彩光轮,通过光线勾勒发动机舱轮廓,在运行时形成类似能量环的视觉效果。用户还可以通过GCC软件调整灯效,并与其他支持设备进行同步,使显卡成为整机灯效设计的一部分。 这种不同于以往产品的独特外观设计,也让AORUS INFINITY拥有独立于以往显卡产品的视觉语言。尤其对于追求主题装机和高端桌搭的玩家而言,这张显卡无疑会成为机箱中的点睛之笔。 RTX 5080与16GB GDDR7,面向高端游戏平台 性能方面,AORUS GeForce RTX 5080 INFINITY搭载NVIDIA GeForce RTX 5080 GPU,基于Blackwell架构,拥有10752个CUDA核心,并配备16GB GDDR7显存、256-bit显存位宽以及30Gbps显存速率。 产品核心频率达到2805MHz,高于RTX 5080参考规格的2617MHz,并支持DLSS 4.5以及最近推出的DLSS5、光线追踪、NVIDIA Reflex等RTX平台技术,可覆盖高画质游戏、光追和AI增强图形等应用场景。 对于高端玩家而言,16GB GDDR7显存也为高分辨率、光追以及复杂游戏场景提供了更充足的显存空间。 隐藏第三风扇,两风扇外观下构建三风扇散热能力 在保持双风扇视觉造型的同时,AORUS INFINITY实际上采用了更巧妙的散热结构。 风之力极速爆发散热系统在显卡中央隐藏了一颗超速增压风扇,并为其设置独立风扇曲线。当GPU进入较高负载时,中央风扇能够自动启动,提供额外气流,因此产品能够在维持简洁双风扇外观的同时,兼顾高负载状态下的散热需求。 显卡还采用双贯通导流风道设计,通过两侧开放式背板让气流直接穿过散热鳍片,减少热空气在显卡周围堆积。同时搭配鹰翼仿生风扇、GPU直触均热板、复合铜热管以及复合金属导热材质,共同构成完整的散热体系,在不牺牲静音表现的前提下,获得更出色的散热效果。 隐藏式供电设计,让高端整机更加整洁 在高端装机中,16Pin供电线往往会直接影响机箱内部的视觉效果。AORUS INFINITY针对这一问题采用隐藏式电源接口设计,并配合磁吸式盖板遮挡供电区域,让电源线能够更自然地隐藏在显卡后方。 显卡同时支持技嘉背插系列主板产品,在搭配对应机箱与平台时,可进一步减少线材外露,使整机内部保持更加完整和简洁的视觉效果。 此外,AORUS INFINITY采用强化金属背板提升显卡整体结构强度,并加入供电异常指示灯。当显卡供电出现异常时,可通过灯光提醒用户,兼顾高端产品的结构可靠性与实际使用便利性。 从高性能硬件走向整机设计的一部分 从AORUS GeForce RTX 5080 INFINITY可以看到,INFINITY系列的定位并不只是单纯追求更高的参数,而是尝试把性能、散热与工业设计整合到同一套产品语言中。 双引擎舱造型、RGB炫彩光轮灯效、隐藏式超速增压风扇、双贯通导流风道以及隐藏供电接口,让很多原本服务于功能的结构同时成为产品设计的一部分。对于追求高性能游戏平台,同时重视整机完成度和视觉辨识度的用户来说,AORUS GeForce RTX 5080 INFINITY也代表了AORUS在40周年节点对旗舰显卡设计的一次全新探索。

优秀的个人博客,低调大师

万物云原生下的服务进化 | 京东云技术团队

导读: 在万物云原生下的环境下,Java的市场份额也因耗资源、启动慢等缺点,导致在云原生环境里被放大而降低,通过这篇文章,读者可以更好地了解如何在云原生环境下通过升级相关版本和使用GraalVM打出原生镜像到方式,优化Java应用的性能和资源利用率,使Java应用更好地适应云原生环境。 1.引言(Introduction) 1.1、目的: 现在我们的项目能正常运行,为什么要耗费大量人力重构? 1.2、背景: 云原生时代下和java的爱恨情仇: 在云原生时代,随着技术的日新月异变化,我们寻找最佳技术解决方案的道路上总是充满坎坷。作为分布式应用的主流技术,Kubernetes(简称k8s)和Java在这个时代交织出一段爱恨情仇般的佳话。那云原生下这两个技术究竟是敌是友,需要我们进行深入分析。首先,我们站在云原生的角度来看,难以忽视的是k8s 的确被时代认可,尤其在微服务架构、容器化部署和资源管理等方面。其强大的自动化、弹性伸缩和容错能力成为了很多软件系统的最佳实践。而Java作为一门拥有28多年历史的编程语言,无论是在市场份额和生态圈都有无可撼动的地位。Java在分布式系统、中间件、业务逻辑处理等方面有着丰富的实践经验,为开发人员提供了良好的编程体验和广阔的生态支持。而在众多应用架构的背后的技术架构都离不开Kubernetes和Java。从这个角度看来,它们似乎是一对黄金搭档,但关系到具体实践过程时,细节往往能决定成败。我们来看看这两个技术在实际操作中产生的爱恨情仇。 1.2.1、 爱与恨:资源限制与管理 在云原生架构中,k8s为应用提供了资源限制与管理的能力,使得应用能够按需分配资源。然而,Java在处理资源方面存在一定的局限性。因为JVM在内存管理方面依赖于Xms和Xmx等参数进行配置,导致应用在Kubernetes中的资源管理相对复杂。在这期间我们发现java也不甘示弱 在JVM层面对资源管理等方面也进行了改进 比如增加了Containters标志,使得Java应用在k8s环境中的资源配置更为简化。 1.2.2、恩怨难分:服务发现与负载均衡 在微服务架构中,服务发现和负载均衡是关键。过去,Java生态中有很多解决方案,例如Eureka、Zookeeper等,这让java在服务发现和负载均衡方面有多种选择, 但在k8s环境中,天然具备服务发现和负载均衡的能力,如果需要转到云原生就需要对微服务进行调整以适配k8s环境。 1.2.3、 重逢:持续集成与持续部署(CI/CD) k8s在持续集成与持续部署方面具备很强的能力,与GitLab、Jenkins等CI/CD工具的结合可以为Java应用提供极致的开发、构建和部署体验。通过将k8s和Java生态中优秀的CI/CD工具整合在一起,架构师能够实现敏捷的开发、快速的迭代和高效的运维。 1.2.4、共生:爱恨交织 在k8s的世界里,Java应用程序的部署和管理已然变得越来越高效。但随着微服务、Serverless 架构的兴起,Java的致命缺陷开始暴露出来。首先是启动时间,Java应用程序在启动时需要加载众多类文件,带来了相对较长的启动时间。再者,Java应用程序的内存占用往往较高,这在云原生环境中意味着更高的运行成本。然后我们开始寻找替代方案,以求摆脱Java在云原生领域的束缚,进而拥抱更快、更轻量级的应用程序运行环境。 1.2.5、曙光:曾经失去的统统要拿回来 于是,GraalVM应运而生。GraalVM是一个高性能的Runtime,支持多种编程语言(这也是它通用的原因)。它提供了Java与云原生领域的桥梁,可以将Java代码编译成本地可执行文件,这意味着更快的启动速度和更低的内存使用。与之同时,GraalVM还提供了对Java的完整支持,便于将现有的Java应用程序迁移到云原生领域。此外,GraalVM还集成了许多强大的特性,如 (AOT)编译、即时编译(JIT)以及强大的GC回收机制。这些特性使得GraalVM成为了在云原生领域的新宠。 2、技术选型: 2.1、五要素: 2.1.1、充分利用现有代码库: 如果已经拥有一个功能完备且经过充分测试的Java应用程序,那么将其转换为native-image可以最大程度地复用现有代码库,减少重新编写应用程序所需的工作量和风险。此外我们部门项目都是Java,使用native-image能有效降低迁移成本。 2.1.2、开发者熟悉度: 如果队伍中已经具备较为丰富的Java开发经验,那么将Java应用转换为native-image会降低学习成本和培训成本,相较于使用全新的编程语言来重写应用,这会使得开发者更容易上手。 2.1.3、性能优化: 虽然Java应用在某些性能方面可能不如其他编程语言,但通过使用native-image,可以将Java应用转换为与C或C++等编译型语言类似的二进制文件,从而缩小性能差距。native-image为应用带来更快的启动速度和更低的内存占用,而这在k8s这种容器化的环境中尤为重要。 2.1.4、 跨平台能力: Java具有良好的跨平台兼容性,而借助GraalVM进行native-image编译,我们依然可以保留这一特性。这为应用部署提供较高的灵活性,降低了环境迁移和维护的复杂度。 2.1.5、 开发和生态系统: Java拥有庞大的开发社区和一个成熟、丰富的生态系统,提供了大量的库和框架来支持各种应用的开发。使用native-image可以更好地利用这些资源,简化应用的开发和维护过程。 2.1.6、最终方案: 采用jdk17+springboot3+native-iamge=原生轻量化服务 对于低频流量的业务系统,采用试点项目的方式保证可行性的落地,根据业务功能进行项目合并,而对于合并后的全新项目,直接升级(jdk 和spring框架) version 完成项目合并后保证java版本的项目跑起来,之后采用native-image的方式打包成原生镜像,让项目在 新特性/稳定性的版本基础上 晋升为真正的轻量化应用。 3、概念: 3.1、为什么要升级jdk? 3.1.1、新的语言特性: JDK 8 到 JDK 17 之间引入了许多新的语言特性和功能,如Lambda 表达式、Stream API、Optional 类、默认方法、接口私有方法等。这些特性可以使代码更简洁、可读性更好,并支持函数式编程风格,提高开发效率和代码质量。 3.1.2、性能优化和增强: JDK 17 中进行了多项性能优化和增强,包括垃圾回收器的改进、JIT 编译器的增强、并发类库的改进等。这些优化可以提高应用程序的性能和吞吐量,特别是在大规模和高并发的情况下。 3.1.3、模块化系统: JDK 9 引入了模块化系统(Java Platform Module System,JPMS),它提供了更好的代码组织和隔离,使得复杂的应用程序可以更容易地维护和扩展。模块化系统还可以帮助识别和解决潜在的依赖冲突问题,提高应用程序的稳定性和可靠性。 3.1.4、安全性增强: JDK 17 在安全性方面有多项改进,包括加强的加密算法(SHA-3、X25519、Ed25519 )、更新的安全协议(TLS 1.3)、安全性增强的 API 等。这些改进可以提升应用程序的安全性,防范潜在的安全漏洞和攻击。 3.1.5、工具和性能分析: JDK 17 提供了许多工具和性能分析的改进,例如 JShell(交互式编程工具)、Java Flight Recorder(JFR,低开销的性能分析工具)、JDK Mission Control(JMC,性能监控和故障诊断工具)等。这些工具可以帮助架构师和开发团队更好地分析和优化应用程序的性能和行为。 3.1.6、持续改进和稳定性: 从 JDK 8 到 JDK 17,Java 平台一直在持续改进和演进。JDK 17 是一个长期支持(LTS)版本,意味着它将获得长期的支持和维护,包括安全更新、错误修复和性能改进。作为架构师,选择升级到 JDK 17 可以获得更稳定和可靠的平台,并确保应用程序能够得到长期的支持。 3.2、为什么要升级springboot组件? 3.2.1、充分利用 JDK 17 的新功能和性能优化: JDK 17 引入了许多新的功能、改进和性能优化。这些包括新的语言特性、增强的性能和安全性、更好的垃圾回收器、模块化系统等。通过将 Spring Boot 升级到版本3,可以利用 JDK 17 的新功能,提高应用程序的性能、稳定性和安全性。 3.2.2、支持新的 Java 版本: Spring Boot 1.x 系列最初是为 JDK 6 和 JDK 7 开发的,而 Spring Boot 2.x 系列则对 JDK 8 有更好的支持。我们将 JDK8 升级到 JDK 17,将 Spring Boot 从版本1.x、2.x升级到版本3,可以确保应用程序能够充分利用 JDK 17 的新特性,并获得更好的兼容性和性能。 3.2.3、修复已知的问题和漏洞: 随着时间的推移,Spring Boot 的新版本会修复旧版本中存在的问题、漏洞和错误。通过升级到最新的 Spring Boot 版本,您可以获得这些修复,并提高应用程序的稳定性和安全性。 3.2.4、社区支持和文档更新: 随着时间的推移,Spring Boot 社区会随着新版本的发布而更新和改进文档、示例和社区支持。通过升级到最新版本,您可以获得最新的文档和社区支持,使您能够更好地使用和维护 Spring Boot 应用程序。 3.3、升级jdk/springboot可能导致的差异? 3.3.1、API 变动: JDK 在不同的版本中引入了新的 API,并对旧 API 进行了修改和弃用。在升级到 JDK 17 之前,需要仔细检查你的代码,查找并解决所有使用了已弃用的 API 的地方。还应该熟悉 JDK 9、JDK 11、JDK 14 和 JDK 17 之间的主要 API 变动,以便在升级过程中进行必要的修改 (servlet api没报错先忽略)。 3.3.2、模块化系统(Module System): 1.JDK 9 引入了模块化系统,将 JDK 中的功能划分为一组模块。如果你的应用程序依赖于 JDK 8 中不存在的模块,或者使用了模块化系统中的新特性(如模块路径),在升级到 JDK 17 时需要进行相应的调整。确保你的应用程序的模块声明和依赖关系与 JDK 17 兼容,并进行必要的迁移工作(jdk8升的忽略)。 3.3.3、移除的功能: JDK 8 到 JDK 17 期间,JDK 团队可能会移除一些不再支持的功能。在升级之前,查看 JDK 的发布说明和文档,了解哪些功能将被移除或弃用。检查你的代码是否使用了这些功能,以便及时进行修改和适应。 3.3.4、字节码和运行时差异: JDK 17 中引入了一些新的字节码指令和运行时优化,这可能会导致你的应用程序在升级后出现不同的行为。特别是在使用反射、字节码增强和动态代理等技术的情况下,需要仔细测试和验证升级后的应用程序是否仍然正常运行。 3.3.5、第三方库和工具兼容性: 升级 JDK 可能会对你的应用程序依赖的第三方库和工具产生影响。在进行升级之前,确保你所使用的所有库和工具与 JDK 17 兼容,并及时更新到最新版本。此外,还要留意一些特定的库或工具可能会有与 JDK 版本相关的限制或要求。 3.3.6、性能和稳定性: 升级 JDK 可能会带来性能改进和 bug 修复,但也可能引入新的性能问题或稳定性问题。在升级之后,通过全面的性能和稳定性测试,确保你的应用程序在新的 JDK 版。 3.3.7、移除的功能: 如果代码使用了 JDK 8 中被移除或弃用的功能。查找 JDK 17 的发布说明,找到替代的功能或方法,并进行相应的修改。比如sun.misc.Unsafe 其大部分方法已被标记为 @Deprecated 3.3.8、字节码和运行时差异: 在升级到 JDK 17 后,你的应用程序出现了意料之外的行为。 使用调试工具和日志记录,对代码进行详细调查,查找与字节码和运行时差异相关的问题,并进行相应的修复。例如,JDK 17 引入了 instanceof 指令的新变体 instanceof<type>,用于改进 instanceof 运算符的性能。如果你的代码在 JDK 8 中使用了自定义的字节码操作,需要检查是否需要相应地调整代码。 3.3.9、依赖项更新: 升级到 Spring Boot 3.x 可能需要更新你的应用程序的依赖项,如 Spring Framework、Hibernate 等。解决方法:查看 Spring Boot 的文档和依赖项管理,了解每个版本所需的依赖项版本,并更新你的项目配置文件 Maven 以使用相应的版本。确保所有依赖项与 Spring Boot 3.x 兼容。 3.3.10、配置文件变更: Spring Boot 3.x 可能引入了新的配置属性或更改了现有属性的名称或行为。解决方法:仔细检查你的应用程序的配置文件,特别是 application.properties 或 application.yml,根据 Spring Boot 的文档和迁移指南,更新和调整属性的名称和用法。 3.3.11、自动配置变动: Spring Boot 3.x 可能修改了某些自动配置类或默认行为,可能会影响你的应用程序的行为。 查看 Spring Boot 的升级文档和发布说明,了解哪些自动配置类发生了变化,并在必要时进行相应的修改和调整。 3.3.12、测试更新: Spring Boot 3.x 可能引入了新的测试框架或更改了现有的测试注解和行为。 查看 Spring Boot 的测试文档,了解测试框架的更新和变化,并相应地修改和调整你的测试代码 3.3.13、Spring Boot Starter 的命名变化: 在 Spring Boot 2.x 版本中,许多 Spring Boot Starter 的命名方式发生了变化。例如,原来的 spring-boot-starter-web 变为 spring-boot-starter-webflux,spring-boot-starter-data-jpa 变为 spring-boot-starter-data-jdbc 等。Spring Boot 2.x 中,默认的缓存自动配置使用 JCache(JSR-107)作为缓存提供者在 Spring Boot 3.x 中,缓存自动配置发生了变化。Spring Boot 3.x 引入了对 Caffeine 缓存提供者的默认支持 3.4、初探graalvm 3.4.1、GraalVM 社区版(Community Edition): 在社区版和企业版本中,如果不指定GC ,默认都使用的是 Serial GC,而在企业版中可以指定使用 G1 垃圾回收器。G1 垃圾回收器是一种现代化的低延迟垃圾回收器,适用于大部分应用场景。而在在企业版中,引入了名为 GraalVM Native Image 的功能,它使用了不同的垃圾回收器。GraalVM Native Image 是一个 AOT(Ahead of Time)编译器,可以将 Java 程序编译成本地机器码,从而提供更快的启动时间和更低的内存占用。对于 Native Image,GraalVM 企业版使用了垃圾回收器 Substrate VM,它是专门为 AOT 编译的应用程序设计的。 3.4.2、性能优化: GraalVM 企业版通常会提供更多的性能优化功能和选项。这包括对即时编译(Just-in-Time Compilation)的改进、代码优化和程序分析等方面的增强。企业版的目标是提供更高效、更高性能的运行环境。 3.4.3、工具和扩展: 企业版可能提供一些额外的工具、库和扩展,以满足企业级应用程序的需求。这些工具可能包括性能分析器、调试器、内存分析工具和性能监控等。 3.4.4、安全增强: GraalVM 企业版通常会提供一些安全增强功能,以提供更好的应用程序安全性和保护。这可能包括对代码审计、漏洞扫描和安全加固方面的支持。 3.4.5、跨语言集成: 企业版可能提供更好的跨语言集成支持。GraalVM 企业版具有更广泛的语言支持,包括 Java、JavaScript、Python、Ruby 等,使得在混合语言环境中开发和运行应用程序更加便捷。 3.4.6、商业支持和服务: 企业版提供商业支持和服务,包括错误修复、安全更新和技术支持。这可以确保您在使用 GraalVM 时获得及时的支持和帮助。 4、价值: 4.1、直观价值: 4.1.1、性能提升: 新版本的JDK和Spring Boot通常会引入性能改进和优化,包括内存管理、垃圾回收、线程处理等方面的优化。这可能会减少应用程序的内存占用和CPU负载,从而提高系统的响应速度和吞吐量。再集成native-image 编译生成的原生镜像的启动速度往往比JVM的启动速度快得多,这对于有很多短暂任务的应用场景(例如serverless或者函数计算)非常有利 4.1.2、内存管理和垃圾回收提升: JDK的每个版本都在内存管理和垃圾回收方面进行了改进。新的版本通常会引入更高效的垃圾回收算法和内存管理策略,使应用程序能够更有效地利用内存资源,并减少垃圾回收的停顿时间。这将有助于降低内存占用和减少GC相关的CPU开销,而采用原生镜像后,通常具有比基于JVM的应用更低的内存占用,这有利于降低运行时的资源消耗。 4.1.3、资源优化比提升: 新版本的Spring Boot可能会引入更好的资源管理和优化机制。这包括对数据库连接、线程池、缓存等资源的更有效的管理和利用,以减少不必要的资源消耗,提高系统的资源利用率,而使用 native-image 编译后的本地机器代码 更加显著减小应用程序的内存占用。因为 native-image 只包含应用程序所需的运行时组件和库,而不需要整个 JVM 的额外开销 镜像大小能减少80%,且编译后的本地机器代码不再依赖于 JVM, 减少应用程序对系统资源的消耗,使得应用程序可以在资源受限的环境中更高效地运行。 4.1.4、并发提升: 新版本的JDK和Spring Boot可能会提供更高效的并发处理机制和多线程编程模型。这将使应用程序能够更好地利用多核CPU,并提高并发性能。通过更好的线程池管理、异步编程模型等,可以减少不必要的线程开销,提高系统的并发能力。 4.1.5、节省成本: 通过优化资源消耗,尤其是内存和CPU,可以降低硬件需求和成本。较低的内存占用和CPU负载意味着可以在相同的硬件配置下运行更多的应用实例,从而节省硬件成本。此外,较低的资源消耗还可以减少运维成本和能源消耗。 4.2、长远价值: 4.2.1、长期支持和维护: JDK 17是一个长期支持版本(LTS),它将获得长期的官方支持和维护,包括安全更新、错误修复和性能优化。这意味着我们的应用程序可以在未来几年内持续受到支持,保持安全、稳定和可靠。 4.2.2、技术演进和发展: 通过升级到最新的JDK和Spring Boot版本,可以跟上技术的演进和发展。利用新的语言特性、框架改进和工具,提高开发效率和代码质量。同时,升级也为我们团队提供了学习和发展的机会,使他们能够跟上行业的最新趋势和技术标准,提高他们的技术能力和知识广度。 4.2.3、生态系统支持: 随着时间的推移,与JDK和Spring Boot相关的生态系统将持续发展和壮大。升级到最新版本可以使您能够获得更广泛、更成熟的生态系统支持。这包括更多的第三方库、工具、插件和社区资源,可以加速开发过程、解决问题和提供更丰富的功能集。 4.2.4、提高开发效率: 新版本通常会引入更多的开发工具和改进,旨在提高开发效率和开发人员的体验。例如,新的语言特性、API改进、自动化工具和开发工作流程的优化等,都有助于简化开发任务、减少样板代码,并提高团队的整体生产力。 4.2.5、公司团队动力和职业发展: 通过升级到最新版本,公司成员可以参与到技术升级的过程中,提出建议、贡献经验和共享知识。这有助于增强对公司的积极性和归属感,激发他们的职业发展动力,同时也为他们提供学习和成长的机会。 4.2.6、提高公司在互联网的竞争力: 升级到最新的技术版本可以使部门甚至公司保持在技术的前沿,并具备更强的竞争力。公司将能够应对新的技术挑战和项目需求,提供更高质量、更高性能的解决方案,从而在市场上保持竞争优势。 4.2.7、面向未来的准备: 升级到较新的版本可以帮助您为未来做好准备。您的应用程序可以充分利用新的技术和功能,以满足不断变化的业务需求和用户期望。同时,较新的版本通常会更好地适应新的硬件和部署环境,为您的应用程序提供更好的性能、可扩展性和可靠性。 总结: 总之,升级JDK和Spring Boot版本,以及使用native-image打出来的原生镜像可以帮助Java应用更好地适应云原生环境,提高应用的性能和可扩展性。这些措施可以帮助Java在云原生环境中更好地发展 作者:京东科技 徐拥 来源:京东云开发者社区

优秀的个人博客,低调大师

走进JavaWeb技术世界3:JDBC的进化与连接池技术

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文是微信公众号【Java技术江湖】的《走进JavaWeb技术世界》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中经常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个Java Web技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 JDBC数据库连接池 谈谈连接池、线程池技术原理 做互联网研发,最早接触使用jdbc技术,为了数据库连接能够复用,会用到c3p0、dbcp等数据库连接池。应该是研发人员最早接触的数据库连接池,再到httpclient http连接池,再到微服务netty连接池,redis客户端连接池,以及jdk中线程池技术。 这么多数据库、http、netty连接池,jdk线程池,本质上都是连接池技术,连接池技术核心是连接或者说创建的资源复用。 连接池技术核心:通过减少对于连接创建、关闭来提升性能。用于用户后续使用,好处是后续使用不用在创建连接以及线程,因为这些都需要相关很多文件、连接资源、操作系统内核资源支持来完成构建,会消耗大量资源,并且创建、关闭会消耗应用程序大量性能。 网络连接本身会消耗大量内核资源,在linux系统下,网络连接创建本身tcp/ip协议栈在内核里面,连接创建关闭会消耗大量文件句柄(linux中万物皆文件,一种厉害抽象手段)系统资源。当下更多是应用tcp技术完成网络传输,反复打开关闭,需要操作系统维护大量tcp协议栈状态。 连接池本质上是构建一个容器,容器来存储创建好的线程、http连接、数据库连接、netty连接等。对于使用方相当于黑盒,按照接口进行使用就可以了。各个连接池构建、使用管理详细过程大概分成以下三部分。 第一部分:首先初始化连接池,根据设置相应参数,连接池大小、核心线程数、核心连接数等参数,初始化创建数据库、http、netty连接以及jdk线程。 第二部分:连接池使用,前边初始化好的连接池、线程池,直接从连接池、线程中取出资源即可进行使用,使用完后要记得交还连接池、线程池,通过池容器来对资源进行管理。 第三部分:对于连接池维护,连接池、线程池来维护连接、线程状态,不可用连接、线程进行销毁,正在使用连接、线程进行状态标注,连接、线程不够后并且少于设置最大连接、线程数,要进行新连接、线程创建。 通过上边可以了解到各种连接池技术以及线程池原理或者说套路,理解原理才能不被纷繁复杂表象掩盖。 下面谈谈构建自己连接池,其实理解了连接池、线程原理,可以使用ArrayList来构建自己连接池、线程池。初始化时创建配置连接数、线程,存储在ArrayList容器中,使用时从ArrayList从取出连接、线程进行使用,执行完任务后,提交回ArrayList容器。前提条件是单线程,在多线程状态下要用线程安全容器。 前边根据原理介绍了一个简单连接池、线程池怎样构建,实际工业级别线程池还要考虑到连接状态,短连接重连,线程池维护管理高效,线程池稳定等多个因素。 需要用到连接池而又没有相关开源产品可用时,java连接池可以使用common-pool2来构建,比如google开源gRPC技术,本身是高性能跨平台技术,但目前作为微服务使用,没有连接池、负载均衡等相应配套,这时可以根据需要自己基于Java容器构建自己连接池。也可以利用common-pool2构建连接池来提升应用性能,以及保持高可用。common-pool2本身不仅仅可以构建连接池使用,还可以用来构建对象池。 连接池还有一个副作用就是实现了高可用,在微服务场景下一个连接不可用,那么再从netty连接池中取出一个进行使用,避免了连接不可用问题。 掌握原理从比较全面掌握各种池技术,避免数据库连接池,再到httpclient http连接池,再到微服务netty连接池,redis客户端连接池,以及jdk中线程池,对象池各种各样池技术,使我们眼花缭乱,花费过多时间,掌握原理机制以不变应万变。 推广一下这个方法,其他技术也是类似,深入掌握其原理,就可以明白其他类似技术相似原理,避免疲于应对各种新技术。但每一种架构设计与实现又与领域有着关系,也不可讲原理不顾实际情况扩展。理论与架构设计、源码学习相结合才是最好的,希望有帮助。 JDBC 数据库连接池 转自: 什么情况下使用连接池? 对于一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销。但是对于一个复杂的数据库应用,情况就完全不同了。频繁的建立、关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。 使用连接池的好处 连接复用。通过建立一个数据库连接池以及一套连接使用管理策略,使得一个数据库连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。 对于共享资源,有一个很著名的设计模式:资源池。该模式正是为了解决资源频繁分配、释放所造成的问题的。把该模式应用到数据库连接管理领域,就是建立一个数据库连接池,提供一套高效的连接分配、使用策略,最终目标是实现连接的高效、安全的复用。 连接池的实现 数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法。 外部使用者可通过 getConnection 方法获取连接,使用完毕后再通过 close 方法将连接返回,注意此时连接并没有关闭,而是由连接池管理器回收,并为下一次使用做好准备。 Java 中有一个 DataSource 接口, 数据库连接池就是 DataSource 的一个实现 常用数据库连接池 Apache DBCP 官网 C3P0 官网 Druid GitHub 一、JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: ①在主程序(如servlet、beans)中建立数据库连接。 ②进行sql操作 ③断开数据库连接。 这种模式开发,存在的问题: ①普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。 ②对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。 ③这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。 二、数据库连接池(connection pool) 数据库连接池简单介绍 为解决传统开发中的数据库连接问题,可以采用数据库连接池技术。 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。 数据库连接池工作原理: 数据库连接池技术的优点 资源重用: ①由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。 更快的系统反应速度: 数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间 新的资源分配手段: 对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源 统一的连接管理,避免数据库连接泄露: 在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露 三、两种开源的数据库连接池 JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现: ①DBCP 数据库连接池 ②C3P0 数据库连接池 DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource称为连接池 数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但上面的代码并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。 参考文章 https://blog.csdn.net/u010028461/article/details/78932109https://www.cnblogs.com/shaoxiaohuan/p/7755953.htmlhttps://www.cnblogs.com/albertrui/p/8421791.htmlhttps://blog.csdn.net/weixin_43124134/article/details/82586062https://www.jianshu.com/p/0737ac60c7df 微信公众号 个人公众号:黄小斜 黄小斜是跨考软件工程的 985 硕士,自学 Java 两年,拿到了 BAT 等近十家大厂 offer,从技术小白成长为阿里工程师。 作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得和程序人生,目前黄小斜的CSDN博客有百万+访问量,知乎粉丝2W+,全网已有10W+读者。 黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长! 原创电子书:关注公众号【黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》 程序员3T技术学习资源: 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 “资料” 即可免费无套路获取。 考研复习资料: 计算机考研大礼包,都是我自己考研复习时用的一些复习资料,包括公共课和专业的复习视频,这里也推荐给大家,关注公众号后,后台回复关键字 “考研” 即可免费获取。 技术公众号:Java技术江湖 如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! Java工程师必备学习资源: 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 “Java” 即可免费无套路获取。 ​

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册