滚雪球学Java(88):连接无限,资源有度:JavaSE数据库连接池深度解析,有两下子!

news2024/11/26 18:33:50

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

  众所周知,在Java企业级应用开发中,数据库连接是一种宝贵的资源。然而,这样就会产生许多问题,特别是频繁地创建和销毁数据库连接,这会直接严重影响应用的性能。为此,JavaSE数据库连接池技术应运而生,它通过复用连接来提高资源利用效率和系统性能。所以,今天,我们将就来重点深入摸索一下,带着你们一同深入探讨JavaSE中的数据库连接池,解析其实现原理和应用策略,希望能够帮助到同学们学习它。

摘要

  本文我将会详细的介绍Java SE中数据库连接池的概念、实现方式、优势和潜在问题等。通过基础概念、连接池优劣、案例演示和实际测试用例等,引导大家理解连接池的工作原理,并探讨在不同应用场景下的使用策略,选择何种连接池来处理不同的业务场景。

正文

  即将开启三连问,你们准备好了吗?

何为数据库连接池?

  第一问,问大家,何为数据库连接池?其实这个问题不难回答,看过我之前写的文章就应该能够触类盘通,比如说线程池,这里只是换了一个主体罢了。不过还是让我来讲解一下吧;数据库连接池,顾名思义,它就是一个存放数据库连接的“池子”。在软件开发中,尤其是涉及到数据库操作的应用程序,数据库连接就是一种关键且昂贵的资源,所以说如果每一次数据库操作,如果都需要重新建立连接,那么在高并发的场景下,这个开销就会变得非常巨大,就像每次用水都要重新挖一口井一样低效。总而言之,数据库连接池是一种创建和管理数据库连接的技术,它允许多个客户端共享一个固定数量的数据库连接,而不是为每个客户端请求都创建新的连接,从而大大节省了时间成本,提高了效率。

何为数据库连接?

  接着,开启第二问,何为数据库连接?这个问题我猜想应该难不倒大家。在数据库连接池的概念中,大家更应该需要理解什么是数据库连接。当你的应用程序需要与数据库进行交互时,它必须通过一个连接来发送SQL命令并接收结果。这个连接过程就像是你用钥匙打开一个宝库的大门,然后才能进行存取操作。顾名思义,这就是数据库连接的本质跟概念。

为什么需要连接池?

  最后一问,为什么需要连接池?这点我已经等于告诉大家答案了,为什么需要,肯定是有原因的。这样,大家跟我一起想象一下,如果每个用户访问网站时,网站都要重新开一次数据库的门,这将是多么耗时和浪费资源的事情。特别是在用户量巨大的情况下,频繁地开启和关闭数据库连接,这将会直接导致严重的性能瓶颈。因此,连接池的概念应运而生,它允许应用程序复用已经建立的连接,而不是每次都重新建立,所以说,这就是真正需要它的本质原因。

连接池工作原理?

  这里,我们除了需要连接它的基本概念之外,我们还需要明白,连接池是怎么工作的?这点大家往下看,总结如下:

  1. 初始化:在应用程序启动时,连接池会预先建立一定数量的数据库连接,这些连接被存放在池中,等待被使用。

  2. 连接请求:当应用程序需要与数据库交互时,它会向连接池请求一个连接。连接池会提供一个已经建立的连接,而不是创建一个新的连接。

  3. 连接使用:应用程序使用这个连接来执行数据库操作,比如查询或者更新数据。

  4. 连接释放:操作完成后,应用程序不是关闭连接,而是将连接归还给连接池,这样其他请求就可以使用这个连接了。

  5. 连接监控与维护:连接池还会监控连接的健康状况,确保提供的连接是可用的,并且进行必要的维护,比如重连或淘汰长时间未使用的连接。

优缺点分析

  接着,对于连接池,我也是需要跟大家兜个底,所有被开发创造出来的事物,都有其好的一面跟不好的一面,需要辩证对待,比如说:

优点:

  • 提高性能:减少了创建和销毁连接的开销,提高了数据库操作的响应速度。
  • 资源复用:避免了频繁地创建和关闭连接,使得连接作为一种资源得到了更好的复用。
  • 易于管理:集中管理连接的生命周期和配置,简化了应用程序的复杂性。

缺点:

  • 资源限制:连接池会占用一定的内存和数据库资源,如果配置不当,可能会影响应用程序和其他服务的性能。
  • 复杂性增加:需要对连接池进行适当的配置和监控,增加了系统的复杂性。

小结:

  总而言之,数据库连接池,它本身是一种高效的资源管理技术,通过预先建立并复用数据库连接,从而显著提高应用程序访问数据库的性能。就像我们使用公共交通工具一样,连接池减少了每个人单独出行所需的资源消耗,是一种既经济又环保的方式。然而,就像管理公共交通系统一样,连接池也需要合理的规划和管理,以确保它能够高效、稳定地服务于所有用户。

案例分享

  这里,我就开始带着大家从理论走向实践之道了。对于数据库连接池,它的实现通常依赖于特定的库,如Apache DBCP、HikariCP等。以下是一个使用HikariCP实现数据库连接池的基本代码示例:仅供参考

package com.secf.service.action.hpy.hys.day89;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @Date 2024年7月9日15:01:32
 */
public class ConnectionPoolExample {
    
    public static void main(String[] args) {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/your_database");
        config.setUsername("username");
        config.setPassword("password");
        // 其他配置...
        DataSource dataSource = new HikariDataSource(config);

        try (Connection conn = dataSource.getConnection()) {
            // 使用连接进行数据库操作
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

代码解析:

如上案例我主要是为了展示如何使用 HikariCP 连接池来连接 MySQL 数据库,现在我来解析一下这个案例代码,以辅助大家理解。

  1. 导入必要的类:代码导入了必要的数据库连接类,以便后续使用。
  2. HikariConfig 的配置:创建了一个 HikariConfig 实例,并设置了 MySQL 数据库的连接配置。Url 用于指定数据库的连接地址、端口和数据库名。 和 password 用于设置数据库连接的用户名和密码。您可以根据自己的数据库配置来填写这些信息。
  3. 创建数据源:使用配置好的 HikariConfig 实例来创建一个 HikariDataSource 数据源。
  4. 获取连接:使用 dataSource.getConnection() 方法从连接池中获取一个数据库连接。该连接被包裹在 try-catch 块中,以确保在使用完连接后正确地关闭它。
  5. 数据库操作:在 try 块内,您可以执行所需的 SQL 查询或其他数据库操作。
  6. 连接释放:在 catch 块内,如果发生 SQLException,会打印错误信息。确保在使用完连接后,正确地关闭连接,以归还连接池。

  HikariCP 是一个强大的数据库连接池实现,它可以帮助您高效、安全地管理数据库连接。在实际使用中,您需要根据自己的数据库配置和需求,适当调整 HikariConfig 中的参数。

应用场景案例分享

  比如你要实现一个在线电子商务平台,这个平台需要处理大量的订单数据。那么你使用数据库连接池,即可以显著提高订单处理的效率和系统的响应速度。那么除此之外,还有别的通用场景也是非常实用的,比如如下:

  1. 在线交易平台:处理高频交易和订单更新。
  2. 内容管理系统:管理大量动态内容的发布和检索。
  3. 用户认证服务:快速验证用户身份和权限。

  应用场景都非常之多,这肯定是需要大家在学通之后,能够学以致用,灵活应用。

优缺点分析

  每种方式被创建出来,都有其优劣性,当然针对目前的线程池而言也是无法避免做到十全十美,如果你在考虑架构选型,那么你必须要有一个大概的了解,针对其有何优劣,才能选出最优的方案,比如分析如下:

优点

  • 提高性能:减少连接创建和销毁的开销。
  • 资源复用:避免过多连接占用数据库资源。
  • 易于管理:集中管理连接的生命周期和配置。

缺点

  • 复杂性增加:需要额外配置和维护连接池。
  • 资源竞争:高并发时可能面临连接争用问题。

类代码方法介绍

这里,我主要是给大家普及一下,连接池的实现通常涉及道德几个关键组件,如下:

  • 连接池配置:定义连接池的大小、最大等待时间等参数。
  • 连接对象:管理单个数据库连接的生命周期。
  • 连接管理器:负责分配、回收和监控连接。

测试用例

  这里,我主打一个理论实践相结合的教学模式,当然, 我也是为了给大家演示一下,通过实现数据库连接池测试案例,用于验证连接池的功能性、稳定性和性能。以下是我写的一个简单的测试用例示例,使用HikariCP作为数据库连接池的实现。测试用例将验证连接池能否成功获取和释放连接,以及在高并发环境下的表现究竟如何。

测试代码

具体测试代码请看如下:

package com.secf.service.action.hpy.hys.day89;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @Date 2024年7月9日15:01:32
 */
public class ConnectionPoolTest {
    private static DataSource dataSource;

    public static void main(String[] args) {
        // 初始化连接池配置
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/review_db");
        config.setUsername("root");
        config.setPassword("123456");
        config.setMaximumPoolSize(10); // 设置最大连接数
        // 其他配置...

        // 创建数据源
        dataSource = new HikariDataSource(config);

        // 测试连接池获取连接
        testConnectionAcquisition();

        // 测试高并发环境下的连接池性能
        testConnectionPoolConcurrency();
    }

    private static void testConnectionAcquisition() {
        try (Connection conn = dataSource.getConnection()) {
            // 使用连接执行一些数据库操作,例如查询
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 1");
            while (rs.next()) {
                System.out.println("Connected to the database successfully.");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static void testConnectionPoolConcurrency() {
        // 创建多个线程来模拟高并发环境
        for (int i = 0; i < 20; i++) {
            new Thread(() -> {
                try (Connection conn = dataSource.getConnection()) {
                    // 执行数据库操作
                    System.out.println("Thread " + Thread.currentThread().getId() + " acquired a connection.");
                    // 模拟数据库操作延时
                    Thread.sleep(1000);
                } catch (SQLException | InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

测试用例说明

  1. 初始化连接池:首先配置并初始化HikariCP连接池,设置数据库的URL、用户名、密码以及连接池的最大连接数。

  2. 测试连接获取testConnectionAcquisition方法验证了从连接池中获取连接并执行简单查询的能力。

  3. 高并发测试testConnectionPoolConcurrency方法创建了多个线程,以模拟高并发情况下连接池的行为。每个线程尝试从连接池中获取连接,并保持该连接一段时间,以测试连接池在压力下的表现。

  4. 输出结果:在控制台输出相关信息,以便于观察测试执行情况。

注意事项:

  当然,如上案例也有几点需要注意,比如:

  • 确保数据库服务正在运行,并且连接信息(如URL、用户名和密码)是正确的。
  • 根据实际的数据库表结构和业务逻辑调整SQL语句。
  • 测试用例中的线程数量和Thread.sleep的延时可以根据需要调整,以模拟不同的并发场景。

  通过这个简单的测试用例,你可以验证数据库连接池的基本功能,并评估其在高并发环境下的性能表现。

测试案例结果

  根据如上的测试用例,我在本地进行测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加其他的测试数据或测试方法,以便于进行熟练学习以此加深知识点的理解。


  bug菌,为何你的运行结果报错?自己都报错了还出来教学?非也!这里我是刻意给大家演示下,如果不注意这两点,你们极有可能就会踩坑,所以我才通过创建这个案例来给大家演示一波,主打的就是一个真实。

结果报错解读:

  错误信息 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder" 指出类 StaticLoggerBinder 无法被加载,这通常意味着SLF4J无法在类路径(classpath)中找到绑定的实现。紧接着的 SLF4J: Defaulting to no-operation (NOP) logger implementation 表示SLF4J将使用一个不执行任何操作(NOP)的日志实现,也就是说,所有的日志调用都不会产生任何输出。

  第二个错误 Exception in thread "main" java.lang.RuntimeException: Failed to get driver instance for jdbcUrl=jdbc:mysql://localhost:3306/review_db 指出在尝试获取数据库驱动实例时失败。原因是 java.sql.SQLException: No suitable driver,这表明没有找到合适的JDBC驱动程序来连接指定的数据库URL。

  要解决这些问题,你可以按照以下步骤操作:

  1. 确保SLF4J绑定

  确保你的项目中包含了SLF4J的绑定实现。如果你使用的是Maven,你可以添加如下依赖之一到你的pom.xml文件中:

   <!-- 使用Logback作为日志实现 -->
   <dependency>
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
       <version>1.2.3</version>
   </dependency>

或者,如果你不想使用日志功能,可以添加SLF4J的NOP绑定来避免警告:

   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-nop</artifactId>
       <version>1.7.30</version>
   </dependency>
  1. 添加MySQL JDBC驱动

    确保你的项目中包含了MySQL的JDBC驱动。如果你使用的是Maven,可以添加如下依赖到你的pom.xml文件中:

   <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>8.0.23</version> <!-- 使用合适的版本号 -->
   </dependency>
  1. 检查数据库URL

  确保你的数据库URL是正确的,并且MySQL服务正在运行。如果你使用的是HikariCP,通常不需要显式地加载驱动,因为HikariCP会自动处理。

  1. 检查异常信息

  异常堆栈跟踪提供了更多信息,可以帮助你确定问题发生的位置。在这个例子中,问题发生在尝试创建DriverDataSource时。

  1. 检查SLF4J版本

  如果你使用的是Java 9或更高版本,确保你使用的是SLF4J 2.x版本,它使用ServiceLoader机制,而不是旧版本的静态绑定机制。

  按照这些步骤操作后,应该可以解决你遇到的问题。如果问题仍然存在,请检查上述每个步骤,确保没有遗漏或错误。

测试代码解析

  接着我将对上述代码进行详细的一个逐句解读,希望能够帮助到同学们,能以更快的速度对其知识点掌握学习,这也是我写此文的初衷,授人以鱼不如授人以渔,只有将其原理摸透,日后应对场景使用,才能得心应手,所以如果有基础的同学,可以略过如下代码分析步骤,然而没基础的同学,还是需要加强对代码的理解,方便你深入理解并掌握其常规使用。

  如上测试案例代码我目的是为了演示如何使用HikariCP连接池来管理数据库连接。HikariCP是目前最快的JDBC连接池,并且易于使用。以下我是对代码的详细解析,希望能够帮助到同学们。

包声明和文档注释
package com.secf.service.action.hpy.hys.day89;

  定义了类的包名,按照Java的包命名规范,通常使用域名反转或项目名。

导入语句
import com.zaxxer.hikari.*;
import javax.sql.DataSource;
import java.sql.*;

  导入了HikariCP库的类,DataSource接口,以及java.sql包中的其他类。

类定义和主方法
public class ConnectionPoolTest {
    public static void main(String[] args) {
        // ...
    }
}

  定义了一个名为ConnectionPoolTest的公共类,其中包含了程序的入口点main方法。

连接池配置
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/review_db");
config.setUsername("root");
config.setPassword("123456");
config.setMaximumPoolSize(10); // 设置最大连接数

  这里创建了HikariConfig对象,并设置了数据库的URL、用户名、密码和连接池的最大连接数。HikariCP允许通过配置类来设定多种参数。

创建数据源
dataSource = new HikariDataSource(config);

  使用配置好的HikariConfig对象创建了一个HikariDataSource实例,它实现了DataSource接口,是数据库连接池的顶层对象。

测试连接池获取连接
private static void testConnectionAcquisition() {
    try (Connection conn = dataSource.getConnection()) {
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT 1");
        while (rs.next()) {
            System.out.println("Connected to the database successfully.");
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

  此方法尝试从连接池中获取一个连接,并执行一个简单的SQL查询。使用try-with-resources语句确保Connection对象被自动关闭。

测试高并发环境下的连接池性能
private static void testConnectionPoolConcurrency() {
    for (int i = 0; i < 20; i++) {
        new Thread(() -> {
            try (Connection conn = dataSource.getConnection()) {
                System.out.println("Thread " + Thread.currentThread().getId() + " acquired a connection.");
                Thread.sleep(1000); // 模拟数据库操作延时
            } catch (SQLException | InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

  此方法创建了20个线程,每个线程都尝试从连接池中获取连接,模拟高并发环境下连接池的行为。Thread.sleep(1000)用于模拟执行数据库操作的延时。

异常处理

  代码中的catch块捕获并打印了SQLException异常的堆栈跟踪,这对于调试是非常有用的。

代码改进建议

  当然,对于如上的案例,我再给大家几点建议,并非我这样写就是最优雅地, 有些店大家还是需要留意的,比如说:

  • 资源泄露处理:尽管使用了try-with-resources语句,但在高并发测试中,线程的异常处理应该更加细致,以确保所有资源在发生异常时都能被正确关闭。
  • 线程管理:在高并发测试中,可能需要添加适当的同步机制或使用线程池来更好地管理线程的生命周期。
  • 日志记录:在实际应用中,应使用日志框架(如Logback或Log4j)来记录日志,而不是使用System.out.printlne.printStackTrace

小结

  上述我写的这个案例,它主要是提供了一个很好的HikariCP连接池使用示例,包括如何配置连接池、获取连接、执行数据库操作以及在高并发环境下测试连接池的性能。通过这些测试,可以验证连接池在处理大量并发数据库请求时的稳定性和效率,这也大大辅助了大家理解及使用线程池。

小结

  在本次探索中,我们深入了解了JavaSE数据库连接池的奥秘。数据库连接池,这个看似简单的概念,实则蕴含着提升应用性能的强大力量。通过建立一个预先配置好的连接“池子”,我们能够有效地管理数据库连接,避免了频繁创建和销毁连接所带来的性能损耗。

  文章中,我们不仅探讨了连接池的基本概念和工作原理,还通过实际的代码示例,展示了如何使用HikariCP这一高性能的连接池技术。我们学习了如何配置连接池,如何在应用程序中获取和释放连接,以及如何在高并发环境下测试连接池的性能。

  此外,我们还讨论了使用连接池的优点和潜在缺点。优点包括提高性能、资源复用和易于管理。而缺点则涉及到资源限制和系统复杂性的增加。通过这些分析,我们认识到了合理配置和管理连接池的重要性。

总结

  数据库连接池是Java企业级应用中的一个关键技术,它帮助我们优化了数据库连接的使用,提升了应用的响应速度和处理能力。通过本次学习,我们不仅掌握了连接池的使用方法,还理解了其背后的设计哲学和应用场景。

  文章中的实战案例和测试用例进一步加深了我们对连接池实际工作方式的理解。我们学会了如何通过简单的代码配置连接池,并通过多线程测试验证了连接池在面对大量并发请求时的稳定性和效率。

  最后,我们认识到,虽然连接池能够显著提升性能,但也需要我们细心地进行配置和监控,以避免可能的问题。通过不断学习和实践,我们能够更加熟练地运用这一技术,为我们的应用程序带来更加稳定和高效的数据库访问能力。

  在未来的编程旅途中,让我们继续保持好奇心和学习热情,不断探索和突破,一起加油,未来属于每一个努力的我们!

  … …

  ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。

「赠人玫瑰,手留余香」,咱们下期拜拜~~

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2063118.html

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

相关文章

“探索消费增值模式:绿色消费与积分回馈的双重盛宴“

大家好&#xff0c;我是吴军&#xff0c;来自一家知名的软件开发企业&#xff0c;担任产品经理的角色。今天&#xff0c;我想和大家探讨一个新兴的商业模式——消费增值模式&#xff0c;它在市场上正逐渐崭露头角。 近年来&#xff0c;随着环保和可持续发展日益受到消费者的关注…

HT3S-ECS-MTP网关支持与倍福C6015控制器PLC环网通讯

倍福控制器C6015通过HT3S-ECS-MTP网关进行ETHERCAT环网通讯 北京中科易联科技有限公司 1、概述 本文描述倍福C6015控制器与网关HT3S-ECS-MTP测试EtherCAT环网&#xff0c;并进行数据交换的组态过程及运行结果。使用到的软硬件列表如下&#xff1a; 1台倍福C6015控制器, 使用…

【Qt笔记】Qt界面显示时间

目录 一、前言 二、基本概念 三、代码实现 1. 获取本地时间&#xff0c;并将其转换成自己想要的格式 2.创建一个QLabel控件用于显示时间字符串 3.创建QTimer定时器更新时间 四、优化 1. 格式优化 1.1 初始化 1.2 获取星期 1.3 更改格式 1.4 定时器超时函数 1.5 …

泛微基于华为仓颉编程语言开发公文交换系统 推动办公软件全面国产化

2024年6月21日下午&#xff0c;华为终端BG软件部总裁龚体先生在华为开发者大会主题演讲《鸿蒙原生应用&#xff0c;全新出发&#xff01;》中向全球开发者介绍了华为自研仓颉编程语言&#xff0c;并发布了HarmonyOS NEXT仓颉语言开发者预览版。这是华为首次公开发布仓颉编程语言…

比实物资产更重要的软硬件资产管理系统你了解吗?

“运筹帷幄之中&#xff0c;决胜千里之外。” 此言非但道出了战略谋划的重要性&#xff0c;亦在今日之商业世界&#xff0c;隐喻了信息管理对于企业竞争力的深远影响。 在数字化浪潮席卷全球的今天&#xff0c;企业的资产已不仅仅局限于厂房、设备、库存等实物形态&#xff0…

Console口密码又忘了?这样操作不尴尬

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 在日常的网络管理和维护工作中&#xff0c;Console端口是技术人员访问网络设备&#xff08;如路由器、交换机…

简单步骤获取IP地址SSL 证书

在网络安全中&#xff0c;SSL证书在保护用户浏览器和Web服务器之间交换的敏感信息方面发挥着至关重要的作用。 但是&#xff0c;如果您不仅想保护域名&#xff0c;还想保护特定的IP地址&#xff0c;该怎么办&#xff1f;您可以为IP地址获取SSL证书吗&#xff1f; 简短的回答是…

IDEA 的全局搜索快捷键冲突

系统&#xff1a;MacOS 在IDEA中操作全局搜索&#xff1a;commandshiftF&#xff0c;会弹出来IDEA自己的搜搜框&#xff0c;还有一个访达的搜索框。 取消系统的默认搜索&#xff1a; 【系统设置-辅助功能-键盘-键盘设置-键盘快捷键】 【服务》搜索&#xff1a;取消勾选 聚焦…

掌握 Vue 3 的 <script setup>:高效开发的必备技巧

<script setup> 是 Vue 3 引入的一种新的 <script> 标记的用法&#xff0c;其本质是一个语法糖。它极大简化了单文件组件&#xff08;SFC&#xff09;的开发体验&#xff0c;目的是让代码更简洁、易读&#xff0c;同时减少模板和逻辑之间的重复。 1. 基本用法 &l…

Issue with OpenAI API key while using it in Windows

题意&#xff1a;“在 Windows 上使用 OpenAI API 密钥时遇到的问题” 问题背景&#xff1a; I have to fine-tune the OpenAI model on my custom dataset. I have created the dataset in jsonl format. I use the following commands on windows command line: “我需要在…

docker 安装 oracle11g

#创建oracle11g docker run -d --name myoracle11g -p 1522:1521 akaiot/oracle_11g #登录到oracle,要先docker ps 查看具体的docker id docker exec -it 22222222 bash su root 密码&#xff1a;helowin # 设置环境变量 vi /etc/profile export ORACLE_HOME/home/oracle/ap…

谷粒商城实战笔记-236~238-商城业务-购物车-环境搭建

文章目录 一&#xff0c;236-商城业务-购物车-环境搭建二&#xff0c;237-商城业务-购物车-数据模型分析三&#xff0c;238-商城业务-购物车-VO编写 一&#xff0c;236-商城业务-购物车-环境搭建 这一节的主要内容&#xff1a; ①创建购物车模块②上传静态资源到nginx③复制静…

二分+数学,CF 689C - Mike and Chocolate Thieves

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 689C - Mike and Chocolate Thieves 二、解题报告 1、思路分析 考虑一个…

钥匙失效、门卡死?看如何用电脑远程解救作业

不少人都在自己的电脑上安排了远程控制软件&#xff0c;以便在紧急情况下可以相互远程操作。原本这样的设置只是为了应对偶尔的加班需求&#xff0c;没想到今天它发挥了意想不到的作用。 就在刚才&#xff0c;一阵突如其来的狂风“咣”地一声将门牢牢锁死&#xff0c;钥匙也无法…

CeresPCL 最小二乘插值(曲线拟合)

一、简介 在多项式插值时,当数据点个数较多时,插值会导致多项式曲线阶数过高,带来不稳定因素。因此我们可以通过固定幂基函数的最高次数 m(m < n),来对我们要拟合的曲线进行降阶。之前的函数形式就可以变为: 既然是最小二乘问题,那么就仍然可以使用Ceres来进行求解。 …

禁止浏览器默认填充密码 vue

禁止浏览器默认填充密码会和我的样式冲突 所以禁止 第一种&#xff1a; 通过给表单元素添加 autocomplete"off" 属性&#xff0c; 可以防止浏览器自动填充表单中的账号和密码。可以在 input 标签或整个 form 标签上使用&#xff1a; <template><a-form&g…

基于Springboot2 + vue3酒店客房预订管理系统

笔者花大量时间设计整理出来的一套预订系统&#xff0c;【按照商业软件的标准此程序还有很多不足之处&#xff0c;需要大力改进】。本平台采用B/S结构&#xff0c;后端采用主流的JAVA Springboot框架进行开发&#xff0c;前端采用主流的Vue3 &#xff0c;vite,pinia等技术进行…

roaring 编译问题:undefined reference to `**‘

已经到了链接阶段了&#xff0c;这个显示roaring.hh中的一些函数没有定义。但是实际上已经输出了红色标出的这个信息。 并且这个库的组成是这样&#xff0c;在roaring.c中&#xff0c;都有函数的定义。 链接出问题&#xff0c;首先 make install 把库再编一下。 再看一下链接…

Java基础——自学习使用

一个程序有main方法 当自己调用main方法运行就是一个进程&#xff0c;要是依托别人的main方法运行&#xff0c;就是一个线程 通过双击刺激这个文件相关的主方法运行&#xff0c;然后将文件的地址当做参数传给主方法&#xff0c;就能打开文件了 数据类型&#xff1a;规定内存以…

由于找不到 mfc140u.dll,无法继续执行代码。重新安装程序可能会解决此问题。

安装应用程序时遇到以下问题&#xff1a;   由于找不到 mfc140u.dll&#xff0c;无法继续执行代码。重新安装程序可能会解决此问题。   mfc140u.dll 是一个属于 Microsoft Visual C Redistributable 的文件&#xff0c;‌它是许多基于 Windows 的应用程序运行时所必需的。…