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

前言

在现代的企业应用开发中,数据库是不可或缺的一部分。而对于大部分的应用程序来说,与数据库的交互涉及到频繁的连接、查询和事务操作。为了提高应用程序的性能和可扩展性,使用连接池来管理数据库连接是一个不错的选择。而 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.rhkb.cn/news/163197.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring事件ApplicationEvent源码浅读

文章目录 demo应用实现基于注解事件过滤异步事件监听 源码解读总结 ApplicationContext 中的事件处理是通过 ApplicationEvent 类和 ApplicationListener 接口提供的。如果将实现了 ApplicationListener 接口的 bean 部署到容器中&#xff0c;则每次将 ApplicationEvent 发布到…

为什么Redis集群的最大槽数是16384个?

对于客户端请求的key&#xff0c;根据公式HASH_SLOTCRC16(key) mod 16384&#xff0c;计算出映射到哪个分片上&#xff0c;然后Redis会去相应的节点进行操作&#xff01; 为什么有16384个槽&#xff1f; Redis集群并没有使用一致性hash而是引入了哈希槽的概念。Redis 集群有1…

线性代数-Python-01:向量的基本运算 -手写Vector -学习numpy的基本用法

文章目录 代码目录结构Vector.py_globals.pymain_vector.pymain_numpy_vector.py 一、创建属于自己的向量1.1 在控制台测试__repr__和__str__方法1.2 创建实例测试代码 二、向量的基本运算2.1 加法2.2 数量乘法2.3 向量运算的基本性质2.4 零向量2.5 向量的长度2.6 单位向量2.7 …

C++string类重要函数模拟实现

为了和C标准库区分&#xff0c;以下代码除主函数外均在namespace空间 目录 一.成员 二、带参构造函数 三、拷贝构造函数和赋值运算符重载 四、析构函数 五、重要成员函数实现 1. c_str函数 2. operator[]重载 3. size函数和capacity函数 4.reverse函数 5. push_back和…

【解决】运行vue项目,启动报错 in ./node_modules/@intlify/core-base/dist/core-base.cjs

我的处理方式: 一开始查了好多方法&#xff0c;删除node_modules&#xff0c;重新安装&#xff0c;切换node版本等&#xff0c;但是发现并没有用 之后来发现是安装依赖包的时候有些包安装失败导致的&#xff0c;只要有针对性的重新安装依赖就可以了 例如&#xff1a; in ./n…

Splashtop 与 Canopy 携手共同增强对物联网设备的远程管理

2023年10月17日 加利福尼亚州库比蒂诺 Splashtop 在安全远程访问解决方案领域处于领先地位&#xff0c;Canopy 则是用于复杂硬件部署的领先 RMM 平台&#xff0c;双方今天宣布达成战略合作伙伴关系&#xff0c;以进一步增强和简化对物联网设备的远程管理。通过此次合作&#x…

JSX的本质

一、本质 React.createElement即h函数&#xff0c;返回vnode第一个参数&#xff0c;可能是组件&#xff0c;也可能是html tag组件名&#xff0c;首字母必须大写&#xff08;React规定&#xff09; 二、babel试一试 &#xff08;babel集成了jsx的编译环境&#xff09; // JSX…

Linux生产者消费者模型

生产者消费者模型 生产者消费者模型生产者消费者模型的概念生产者消费者模型的特点生产者消费者模型优点 基于BlockingQueue的生产者消费者模型基于阻塞队列的生产者消费者模型模拟实现基于阻塞队列的生产消费模型 生产者消费者模型 生产者消费者模型的概念 生产者消费者模式就…

Spring framework Day 23:容器事件

前言 容器事件是 Spring Framework 中的一个重要概念&#xff0c;它提供了一种机制&#xff0c;使我们能够更好地了解和响应 Spring 容器中发生的各种事件。通过容器事件&#xff0c;我们可以在特定的时间点监听和处理容器中的各种状态变化、操作和事件触发&#xff0c;以实现…

Go 存储系列:LSM存储引擎 LevelDB

概念介绍 LSM-Tree 被是一种面向写多读少应用场景的数据结构 &#xff0c;被 Hbase、RocksDB 等强力 NoSQL 数据库采用作为底层文件组织方式。 简单的LSM-Tree 包含 2 层树状数据结构&#xff1a; Memtable 并完全驻留在内存中&#xff08;假设 T0&#xff09; SStables 存储…

Unity SRP 管线【第二讲:Draw Call】

参考&#xff1a; https://edu.uwa4d.com/lesson-detail/282/1309/0?isPreview0 文章目录 参考&#xff1a;一、Shader1.HLSL引入2.获取Unity提供的标准输入3.Unity提供的运算库SpaceTransform库的宏对应补充&#xff1a; 4.标准库Common.hlsl5.SpaceTransforms库引入Commo…

【笔记】Endnote20插入文献

方法一 1.首先选中要参考的文章 2.在word里选好格式 3.在word里点击插入已选文献 前提&#xff1a;已经将光标放在要插入的位置了 4.插入文献即可&#xff0c;效果如下 方法二&#xff08;方便些&#xff0c;但是word容易闪退&#xff09; 1.点击要插入的文献&#xff0c;…

Apache Log4j Server (CVE-2017-5645) 反序列化命令执行漏洞

文章目录 Apache Log4j Server 反序列化命令执行漏洞&#xff08;CVE-2017-5645&#xff09;1.1 漏洞描述1.2 漏洞复现1.2.1 环境启动1.2.2 漏洞验证1.2.3 漏洞利用 1.3 加固建议 Apache Log4j Server 反序列化命令执行漏洞&#xff08;CVE-2017-5645&#xff09; 1.1 漏洞描述…

蓝绿发布,灰度发布,滚动发布

写在前面 本文看下生产环境中有哪些常用的发布策略。 1:蓝绿发布 蓝绿发布要求将线上机器分成逻辑上的AB两&#xff08;蓝绿就是两种颜色&#xff09;组&#xff0c;升级时先将A组从负载均衡中摘除&#xff0c;由B组对外提供服务&#xff0c;如下图&#xff1a; 当A组升级…

嵌入式学习笔记(59)内存管理之结构体

数据结构&#xff1a;是一门研究数据在内存中如何分布的学问。 1.5.1.最简单的数据结构&#xff1a;数组 数组的特点&#xff1a;类型相同、意义相关 数组的优势&#xff1a;数组比较简单&#xff0c;访问使用下标&#xff0c;可以随机访问&#xff08;就是可以通过下标随机…

【迎战2023双十一】小白也能玩转!手把手教你实时获取多平台店铺数据,轻松实现数据大屏展示

要实时获取多平台店铺数据进行数据大屏展示&#xff0c;需要进行以下步骤&#xff1a; 确定数据采集方式&#xff1a;通过爬虫程序&#xff08;如Python的BeautifulSoup、Scrapy等爬虫框架&#xff09;或API接口来实现数据的获取&#xff0c;确定该方法所需的数据格式和调用方…

字节码增强技术-ASM

概述 在Java中一般是用javac命令编译源代码为字节码文件&#xff0c;一个.java文件从编译到运行的示例如图所示: 使用字节码的好处&#xff1a;一处编译&#xff0c;到处运行。java 就是典型的使用字节码作为中间语言&#xff0c;在一个地方编译了源码&#xff0c;拿着.class …

Error: GlobalConfigUtils setMetaData Fail Cause:java.lang.NullPointerException

文章目录 1、在开发中会出现这样的错误。2、其次&#xff0c;再看其他错误&#xff1a; 1、在开发中会出现这样的错误。 完整错误&#xff1a;Caused by: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Error: GlobalConfigUtils setMetaData Fail ! Cause…

pyflink 环境测试以及测试案例

1. py 的 环境以来采用Anaconda环境包 安装版本&#xff1a;https://www.anaconda.com/distribution/#download-section Python3.8.8版本&#xff1a;Anaconda3-2021.05-Linux-x86_64.sh 下载地址 https://repo.anaconda.com/archive/ 2. 安装 bash Anaconda3-2021.05-Linux-x…

送水订水商城小程序的作用是什么

无论瓶装水还是桶装水在市场中的需求度总是很高&#xff0c;相关送水公司或零售水企业也不少&#xff0c;消费者的购物方式一般是品牌直售或通过经销商&#xff0c;零售水则是超市/商场等场景。随着人们健康品质生活提升&#xff0c;家庭或办公等场所对桶装水或瓶装水的需求日益…