Spring framework day 01:spring 整合数据源(连接池)

news2024/12/24 2:59:35

前言

在现代的企业应用开发中,数据库是不可或缺的一部分。而对于大部分的应用程序来说,与数据库的交互涉及到频繁的连接、查询和事务操作。为了提高应用程序的性能和可扩展性,使用连接池来管理数据库连接是一个不错的选择。而 Spring 框架提供了对数据源(连接池)的整合和管理的支持,使得我们能够更加方便地使用和配置数据库连接池。

本文将介绍如何在 Spring 中整合和配置数据源(连接池),以及一些常用的连接池选项和最佳实践。通过本文的指导,您将能够正确配置和使用连接池,提高应用程序的性能和可靠性。

一、开始学习

本文将介绍两种配置方式,一个是 xml 配置,一个是 Java 配置类配置。

1、xml 配置

在Spring框架中,我们可以使用XML配置文件来整合Druid数据源连接池。Druid是一个高性能、可扩展的数据库连接池,具有强大的监控和统计功能。那我们就来开始学习吧。

2、新建项目,结构如下

3、导入相关依赖
  <dependencies>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.15</version>
        </dependency>


        <!-- spring 的核心依赖 -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.23</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.5</version>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>

 <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>

      <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>


    </dependencies>
  1. com.alibaba:druid:1.2.15:Druid是一个高性能的数据库连接池,这个依赖提供了Druid的相关类和功能。

  2. org.springframework:spring-context:5.3.23:Spring框架的核心依赖,提供了Spring IoC和AOP等基础功能。

  3. org.springframework:spring-jdbc:5.3.23:在Spring框架中使用JDBC时所需的依赖。

  4. ch.qos.logback:logback-classic:1.4.5:logback是一个灵活的日志框架,logback-classic是logback最常用的实现之一,提供了SLF4J API和log4j API的实现。

  5. mysql:mysql-connector-java:8.0.33:MySQL数据库的Java驱动程序。

  6. org.projectlombok:lombok:1.18.30:Lombok是一个开源的Java库,通过注解来简化Java代码。

  7. junit:junit:4.13.2:JUnit是一个流行的Java单元测试框架,提供了断言、异常处理、参数化测试等功能。

这些依赖项组成了一个Java应用程序所需的基本组件,包括数据库连接、IoC和AOP容器、日志记录、Java Lombok库和单元测试框架等。每个依赖项都提供了不同的功能和实现,可以帮助我们更快、更简单地开发Java应用程序。

4、在 resources 包下新建一个 beans.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 整合 druid 数据源连接池,其中将 DruidDataSource 核心类纳入
         spring 容器中管理,并指定相关的初始化方法以及销毁方法
     -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 注入相关的连接属性 -->
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/psm"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
        <!-- 注入连接池的相关配置属性 -->
        <!-- 最大连接池数量 -->
        <property name="maxActive" value="200"/>
        <!-- 预先初始化 5 个连接放入连接池 -->
        <property name="initialSize" value="5"/>
        <!-- 最小空闲连接数 -->
        <property name="minIdle" value="5"/>
        <!-- 获取连接的最大等待时间,单位:毫秒 -->
        <property name="maxWait" value="2000"/>
        <!-- 连接保持空闲而不被驱逐出连接池的最小时间,单位:毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000"/>
        <!-- 检测连接的间隔时间,单位:毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <!-- 检测连接是否有效 -->
        <property name="testWhileIdle" value="true"/>
        <!-- 放回连接池时是否检查连接的有效性 -->
        <property name="testOnReturn" value="false"/>
        <!-- 定义一条伪 SQL,用于检查连接时是否可用 -->
        <property name="validationQuery" value="select 1"/>
        <!-- 是否缓存 PreparedStatements,MySQL 建议关闭 -->
        <property name="poolPreparedStatements" value="false"/>
    </bean>

</beans>

 这是一个使用Spring框架整合Druid数据源连接池的配置文件。以下是配置文件的主要内容:

  1. 使用<bean>标签定义了一个名为"dataSource"的Bean,并指定了它的类为com.alibaba.druid.pool.DruidDataSource。该Bean在初始化时会调用init-method属性指定的方法进行初始化,在销毁时调用destroy-method属性指定的方法进行资源释放。

  2. 使用<property>标签注入了相关的连接属性,包括驱动类名、数据库URL、用户名和密码。

  3. 使用<property>标签注入了连接池的配置属性,包括最大连接池数量、预先初始化连接数、最小空闲连接数、获取连接的最大等待时间等。

  4. 其他属性包括连接保持空闲时间、检测连接的间隔时间、是否检测连接的有效性等。

  5. 最后使用<property>标签设置了一个伪SQL语句,用于检查连接是否可用。

通过这个配置文件,我们可以将Druid数据源连接池纳入Spring容器管理,并通过IoC方式注入到其他需要使用数据库连接的组件中。这样可以更方便地管理和使用数据库连接,并提供了一些连接池的相关配置选项。

5、测试


@Slf4j
public class Main {

    public static void main(String[] args) throws SQLException {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        // 从容器中获取数据源(连接池)
        DruidDataSource ds = (DruidDataSource) context.getBean(DataSource.class);
        log.info("初始化连接数:" + ds.getInitialSize());
        log.info("最小空闲连接数:" + ds.getMinIdle());
        log.info("最大连接数:" + ds.getMaxActive());

        // 从数据源中获取链接
        Connection conn = ds.getConnection();
        log.info("连接对象:" + conn);
    }

}
  1. main函数中,通过ClassPathXmlApplicationContext类加载了名为"beans.xml"的Spring配置文件并创建了ApplicationContext对象。

  2. 通过getBean方法从容器中获取了名为"dataSource"的Bean,并将其强制转换成DruidDataSource类型。

  3. 通过DruidDataSource对象的一些公共方法获取了连接池的一些配置参数,包括初始化连接数、最小空闲连接数、最大连接数等,并将它们输出到控制台上。

  4. 通过DruidDataSource对象的getConnection方法获取了一个数据库连接,并将其输出到控制台上。

通过这个示例代码,我们可以看到如何使用Spring框架整合Druid数据源连接池,并通过IoC方式将其纳入到Spring容器中进行统一管理。同时也可以看到如何使用DruidDataSource对象获取连接池的一些配置信息以及获取数据库连接的方法。

运行结果

二、使用 Java 配置类来整合数据源(连接池)(使用 @Value注解)

1、在 resources 包下新建一个 druid.properties 资源文件
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/psm?useUnicode=true&characterEncoding=utf-8&useSSL=false&timeZone=Asia/Shanghai
name= root
password = 123456
maxActive = 200
initialSize = 5
minIdle = 5
maxWait = 2000
minEvictableIdleTimeMillis = 300000
timeBetweenEvictionRunsMillis = 60000
testWhileIdle = true
testOnReturn = false
validationQuery = select 1
poolPreparedStatements = false

 这些属性是用于配置Druid连接池的相关参数,具体含义如下:

  1. driver:数据库驱动类的全限定名,这里指定使用MySQL数据库的驱动。
  2. url:数据库连接的URL地址,指向本地MySQL数据库。设置了useUnicode=truecharacterEncoding=utf-8,表示使用UTF-8字符集编码。
  3. name:连接数据库所需的用户名,这里设置为"root"。注意:这里本来是 username ,为什么要改成 name 呢?因为写 username 的话会识别成本机的用户名,所以这里要改成 name.
  4. password:连接数据库所需的密码,这里设置为"123456"。
  5. maxActive:连接池中同时可从数据源获取的最大活跃连接数,这里设置为200,即同时最多容纳200个连接。
  6. initialSize:初始化时创建的连接数,这里设置为5。
  7. minIdle:连接池中保持的最小空闲连接数,这里设置为5。
  8. maxWait:当连接池没有可用连接时,等待获取连接的最大时间(单位:毫秒),这里设置为2000毫秒。
  9. minEvictableIdleTimeMillis:连接在池中最小空闲时间(单位:毫秒),这里设置为300000毫秒(即5分钟)。
  10. timeBetweenEvictionRunsMillis:间隔多久进行一次空闲连接的检测(单位:毫秒),这里设置为60000毫秒(即1分钟)。
  11. testWhileIdle:在连接空闲时,是否执行validationQuery检测连接是否有效,这里设置为true。
  12. testOnReturn:在归还连接到连接池时,是否执行validationQuery检测连接是否有效,这里设置为false。
  13. validationQuery:用于检测连接是否有效的SQL查询语句,这里设置为"select 1"。
  14. poolPreparedStatements:是否缓存PreparedStatement(预编译的SQL语句),这里设置为false。

通过配置这些属性,可以更好地管理和优化Druid连接池的使用。可以指定数据库连接的URL、用户名和密码,设置连接池的大小、最大活跃连接数、空闲连接数等参数,以及进行连接的有效性校验和空闲连接的检测等。

注意:这些属性不能写错,写错了就不会生效了,会报错。

2、在 config 包下新建一个 AppConfig 配置类 (使用 @Value注解)

@Configuration
@PropertySource("classpath:druid.properties")
public class AppConfig {

    @Value("${driver}")
    private String driverClassName;
    @Value("${url}")
    private String url;
    @Value("${name}")
    private String name;
    @Value("${password}")
    private String password;
    @Value("${maxActive}")
    private Integer maxActive;
    @Value("${initialSize}")
    private Integer initialSize;
    @Value("${minIdle}")
    private Integer minIdle;
    @Value("${maxWait}")
    private Integer maxWait;
    @Value("${minEvictableIdleTimeMillis}")
    private Integer minEvictableIdleTimeMillis;
    @Value("${timeBetweenEvictionRunsMillis}")
    private Integer timeBetweenEvictionRunsMillis;
    @Value("${testWhileIdle}")
    private Boolean testWhileIdle;
    @Value("${testOnReturn}")
    private Boolean testOnReturn;
    @Value("${validationQuery}")
    private String validationQuery;
    @Value("${poolPreparedStatements}")
    private Boolean poolPreparedStatements;


    @Bean(initMethod = "init", destroyMethod = "close")
    public DruidDataSource dateSource() throws Exception {
        // 创建数据源对象
        DruidDataSource ds = new DruidDataSource();
        // 设置连接属性
        ds.setDriverClassName(driverClassName);
        ds.setUrl(url);
        ds.setUsername(name);
        ds.setPassword(password);
        // 设置连接池属性
        ds.setMaxActive(maxActive);
        ds.setInitialSize(initialSize);
        ds.setMinIdle(minIdle);
        ds.setMaxWait(maxWait);
        ds.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        ds.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        ds.setTestWhileIdle(testWhileIdle);
        ds.setTestOnReturn(testOnReturn);
        ds.setValidationQuery(validationQuery);
        ds.setPoolPreparedStatements(poolPreparedStatements);

        return ds;
    }

}

这段代码是一个配置类,用于配置Druid数据源的相关属性。通过@Value注解,从配置文件中读取相应的属性值,并将其注入到对应的成员变量中。

在这段代码中,@Value("${name}")表示从配置文件中读取名为name的属性值,并将其赋值给name变量。其他属性同理。

然后通过@Bean注解,将DruidDataSource对象作为一个Bean注册到Spring容器中,并在initMethoddestroyMethod中指定该对象的初始化方法和销毁方法。

最后,在dateSource方法中,创建一个DruidDataSource对象,设置连接属性和连接池属性,然后返回该对象。

3、测试
@Slf4j
public class Main {

    public static void main(String[] args) throws SQLException {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        // 从容器中获取数据源(连接池)
        DruidDataSource ds = (DruidDataSource) context.getBean(DataSource.class);
        log.info("初始化连接数:" + ds.getInitialSize());
        log.info("最小空闲连接数:" + ds.getMinIdle());
        log.info("最大连接数:" + ds.getMaxActive());

        // 从数据源中获取链接
        Connection conn = ds.getConnection();
        log.info("连接对象:" + conn);
    }

}

运行结果

三、使用 Java 配置类的第二种方式 (推荐)

1、更改属性
username= root

 注意:druid.properties 文件,需要把 name 属性改为 username,因为使用输入流读取文件的时候,它会把 username 属性改为 name,不需要我们自己改了。如果是自己改成了 name的话会报错。  

 2、更改 AppConfig 配置类
@Configuration
public class AppConfig {


    @Bean(initMethod = "init", destroyMethod = "close")
    public DruidDataSource dateSource() throws Exception {

        // 创建 Properties 对象
        Properties prop = new Properties();
        // 获取一个输入流来读取 properties 文件
        InputStream input = AppConfig.class.getClassLoader().getResourceAsStream("druid.properties");

        // 将输入流加载到 properties 对象中
        prop.load(input);

        // 通过 DruidDataSourceFactory 来创建 DruidDataSource 实例
        DruidDataSource ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(prop);

        return ds;
    }

}

这段代码也是用于配置Druid数据源的相关属性,但是使用了不同的方式来实现。在这里,使用了Properties类来读取配置文件中的属性值,并将其转换为DruidDataSource对象。

具体来说,@Bean注解用于将创建的DruidDataSource对象注册到Spring容器中,而类中的dateSource方法用于创建DruidDataSource对象。在该方法中,首先创建一个Properties对象,然后通过getClassLoader().getResourceAsStream("druid.properties")方法获得一个输入流,用于读取配置文件中的属性值。最后,通过调用DruidDataSourceFactory.createDataSource(prop)方法,将Properties对象转换为DruidDataSource对象,完成数据源的创建。

注意:不要写错输入流读取的 properties 文件的名字,否则无法获取到 properties 的属性。

3、测试
@Slf4j
public class Main {

    public static void main(String[] args) throws SQLException {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        // 从容器中获取数据源(连接池)
        DruidDataSource ds = (DruidDataSource) context.getBean(DataSource.class);
        log.info("初始化连接数:" + ds.getInitialSize());
        log.info("最小空闲连接数:" + ds.getMinIdle());
        log.info("最大连接数:" + ds.getMaxActive());

        // 从数据源中获取链接
        Connection conn = ds.getConnection();
        log.info("连接对象:" + conn);
    }

}

运行结果

 

加上这个就是三种方式的整合了,大家根据自己的需求使用。

 

四、这个案例有什么有?

这个案例的用途是演示如何使用Spring框架整合Druid数据源连接池,并通过 xml 和配置文件的方式管理和获取数据库连接。具体用途包括:

  1. 连接池管理:通过将Druid数据源连接池纳入Spring容器管理,可以方便地配置连接池的相关属性,如最大连接数、最小空闲连接数等,以及自动初始化和销毁连接池。

  2. 简化数据库连接获取:使用Spring的IoC方式,可以通过注入Druid数据源连接池对象到需要数据库连接的组件中,避免手动管理数据库连接的创建和释放,简化了代码开发和维护。

  3. 配置灵活性:通过将连接池的配置属性提取到Spring配置文件中,在不修改代码的情况下可以根据需求调整连接池的配置,如增加最大连接数或调整最小空闲连接数等。

  4. 日志输出:通过使用log4j等日志库,可以方便地输出连接池初始化信息、连接对象等日志信息,便于排查数据库连接相关的问题。

总而言之,这个案例可以帮助开发人员更好地理解和使用Spring框架整合Druid数据源连接池,从而提升数据库连接的管理效率和代码的可维护性。

五、xml 配置和 Java 配置类的方式有什么区别?

在Spring中整合数据源(连接池)可以使用XML配置和Java配置类两种方式。它们有以下区别:

  1. 配置方式:XML配置使用XML文件来描述Bean的配置信息,而Java配置类则使用Java代码来定义Bean的配置信息。

  2. 语法特点:XML配置是基于标记语言的配置方式,需要遵循一定的标签和语法规则,例如使用<bean>标签定义Bean、使用属性和子元素设置Bean的属性值等。而Java配置类则是基于编程的方式,使用Java代码进行配置,可以利用编程语言的特性进行更灵活的配置。

  3. 可读性和易用性:XML配置相对于Java配置类来说,更容易阅读和理解,因为它具有良好的结构和注释功能。另外,XML配置可以被非开发人员修改和管理,而不需要重新编译代码。相比之下,Java配置类虽然代码可读性较强,但对于非开发人员来说可能不太友好。

  4. 复杂性:XML配置在面对复杂的配置场景时,可能会变得冗长和繁琐。而Java配置类可以通过编程的方式进行逻辑判断、条件配置等,更加适合处理复杂的配置需求。

  5. 版本兼容性:XML配置是一种通用的配置方式,可以适用于各种版本的Spring框架。而Java配置类则需要依赖特定版本的Spring框架,较老的Spring版本可能不支持Java配置。

综上所述,选择XML配置还是Java配置类取决于个人偏好和具体的项目需求以及团队约定。一般而言,对于简单的配置场景,XML配置方式更为常见和方便;而对于复杂的配置需求或者希望利用编程灵活性的情况下,使用Java配置类更合适。

六、gitee 案例

完整代码地址:qiuqiu/conformity-study (gitee.com)

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

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

相关文章

基于多线程+队列实现生产者和消费者

基于多线程队列实现生产者和消费者 需求分析设计思路代码展示 需求分析 需要设计一个系统&#xff0c;能够实时接收视频传来的车牌数据并注入到对应的车辆实体类中。这可能涉及到多线程编程&#xff0c;以处理并监督车牌数据的流入和处理。下面是一种可能的设计思想&#xff1…

如何一起修改多张图片大小?一键修改多张图片尺寸的技巧

如果我们需要在社交平台上分享图片信息&#xff0c;就要把调整图片大小到平台要求的尺寸&#xff0c;单张图片尺寸修改比较简单&#xff0c;要是多张的话&#xff0c;为了提高处理效率&#xff0c;我们就要用到专业工具了&#xff1b;今天分享一个在线图片编辑器&#xff0c;利…

ES6 Class和Class继承

1.class的基本语法 class可以理解为是一个语法糖&#xff0c;将js只能通过构造函数创建实例的方法进行了补充 构造函数&#xff1a; function Person ({ name, age18 }) {this.name namethis.age age } new Person({name: 张三}) Class类&#xff1a; class Person {con…

TCP 传输、重传及工作原理

IP和MAC层的内存受限&#xff0c;用于发送数据包。因此&#xff0c;它们都会限制消息的长度。 这一限制要求TCP在提供给IP层之前&#xff0c;将可变长度的字节打包成多个段。每个段的长度应该是合适的。 下面是一个简单的图示&#xff0c;展示了段是如何通过互联网发送的。 1*I…

淘宝店铺所有商品数据接口及店铺商品数据分析

获取淘宝店铺所有商品数据的接口是淘宝开放平台提供的接口&#xff0c;通过该接口可以获取店铺所有商品数据。 通过淘宝开放平台接口获取店铺所有商品数据的方法如下&#xff1a; 在开放平台注册成为开发者并创建一个应用&#xff0c;获取到所需的 App Key 和 App Secret 等信…

华为数通方向HCIP-DataCom H12-831题库(单选题:301-310)

第301题 关于配置防火墙安全区域的安全级别的描述,错误的是 A、同一系统中,两个安全区域不允许配置相同的安全级别 B、只能为自定义的安全区域设定安全级别 C、安全级别一旦设定不允许更改 D、新建的安全区域,系统默认其安全级别为1 答案:D 解析: 新创建的安全区域缺省未…

UE4/5:通过Blender制作BlendShape导入【UE4/5曲线、变形目标,blender形态键】

UE4/5里面&#xff0c;我们经常可以在一些骨骼模型上面看到相关的曲线&#xff0c;如Metahuman里面就是通过这个曲线来改变人物的脸部表情。 而这里笔者将教导如何去制作这种曲线。 这种曲线都是存在于骨骼模型上的&#xff0c;所以我们要么直接制作骨骼模型导入ue&#xff0…

【SOPHON】算能盒子SE-16的配套x86交叉编译环境搭建

目录 工具包简介配置盒子内部的开发环境配置盒子外部的开发环境安装tpu-mlir安装libsophon 环境 安装sophon-ffmpeg和sophon-opencv环境sophon-sail_x.y.z.tar.gz安装 盒子默认登录&#xff1a;admin/admin SophonSDK既兼容第三代BM1684芯片&#xff0c;也支持第四代BM1684X芯片…

MIT6.5830 Lab0-Go tutorial实验记录(四)

MIT6.5830 Lab0-Go tutorial实验记录&#xff08;四&#xff09; – WhiteNights Site Lab0的最后一步–对.csv文件进行查询。 实验步骤 更改handlers.go 那么首先修改下handlers中的方法&#xff0c;毕竟现在不是从sqlite中查询数据了。 // TODO: some code goes here // Ge…

rabbitmq发送json格式 utf8编码数据

参考文章&#xff1a;Spring-Cloud RabbitMQ 用法 - 发送json对象 - 简书 生产者&#xff1a; 消费者&#xff1a;

虚拟机来安装Linux的优势

笔者认为&#xff0c;通过虚拟机软件学习是初学者学习 Linux 的最佳方式。在与部分读者的交流中&#xff0c;笔者发现&#xff0c;很多初学者都认为&#xff0c;学习 Linux 就必须将自己的电脑装成 Linux 系统或者必须要有真正的服务器设备。而实际上&#xff0c;这是一些机构、…

Spring Boot如何优雅实现动态灵活可配置的高性能数据脱敏功能

1.背景 在当下互联网高速发展的时代下&#xff0c;涉及到用户的隐私数据安全越发重要&#xff0c;一旦泄露将造成不可估量的后果。所以现在的业务系统开发中都会对用户隐私数据加密之后存储落库&#xff0c;同时还要求后端返回数据给前台之前进行数据脱敏。所谓脱敏处理其实就…

华为数通方向HCIP-DataCom H12-831题库(多选题:1-20)

第01题 如图所示,路由器所有的接口开启OSPF,图中标识的ip地址为设备的Loopback0接口的IP地址,R1、R2,R3的Loopback0通告在区域1,R4的Loopback0通告在区域0、R5的Lopback0通告在区域2,下列哪些IP地址之间可以相互Ping通? A、10.0.3.3和10.0.5.5 B、10.0.4.4和10.0.2.2 …

electron学习笔记

electron&#xff1a;大前端背景下&#xff0c;用node.js做桌面端app的工具 1、安装&#xff1a;npm i electron 实际上是chromium Node.js 2、创建一个窗口 3、主进程&#xff08;操作硬件等&#xff0c;commonJS&#xff09;与渲染进程&#xff08;渲染页面&#xff0c;E…

Cdiscount、亚马逊新品不开单怎么办 ?测评自养号关键之处及搭建技巧揭秘

一、Listing如何优化? 一个产品要想有销量&#xff0c;Listing优化必须得做好&#xff0c;这是形成转化产生订单的基础。 有些卖家误以为“反复修改了N次”就叫做“优化”&#xff0c;这绝对是误解 想要做好Listing优化&#xff0c;需要知道优化的基本标准&#xff0c;同时…

光伏电站绝缘阻抗异常排查方法

安科瑞 崔丽洁 概述 01 光伏发电是依托电力电子技术,利用太阳光照将太阳能转化为电能的系统。光伏发电不需要使用化石燃料&#xff0c;减少了发电时产生的污染&#xff0c;并且减少了能源消耗。光伏发电依托政策扶持&#xff0c;快速在国内普及。光伏发电与传统火电发电原理不同…

Excel文件带有密码的只读模式,如何设置?

Excel带有密码的除了打开密码和工作表保护以外&#xff0c;其实还有一种可以设置密码的方法&#xff0c;今天给大家分享如何设置带有密码的只读模式。 打开excel文件&#xff0c;将文件进行【另存为】设置&#xff0c;然后停留在保存路径的界面中&#xff0c;我们点击下面的工…

每日汇评:黄金的进一步上行取决于美联储

金价在1950美元附近徘徊&#xff0c;此前从逾两个月高位小幅回落&#xff1b; 由于中东紧张局势支撑金价&#xff0c;美元欢欣鼓舞&#xff0c;美债收益率上扬&#xff1b; 在美联储主席鲍威尔发表讲话前&#xff0c;金价守住了关键的200日移动均线上方&#xff1b; 金价已进入…

【力扣每日一题】2023.10.19 同积元组

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目比较简洁,给我们一个元素各不相同的数组&#xff0c;要我们找出该数组里能够组成 a*bc*d 的组合数目。 比较直观的做法是我们直接暴…

2023年中国半导体过滤器产业链、市场规模及发展趋势分析[图]

半导体过滤器的作用主要是对空气中的微粒进行过滤&#xff0c;包括清除空气中的细菌、病毒、霉菌孢子、花粉、微粒等物质&#xff0c;半导体过滤器相比传统过滤器&#xff0c;具有更高的过滤效率和更长的使用寿命。其核心元件是由金属氧化物和碳化硅等半导体材料制成的过滤芯片…