当前位置: 首页 > news >正文

Springboot项目集成Durid数据源和P6Spy以及dbType not support问题

        项目开发阶段,mybatis的SQL打印有占位符,调试起来还是有点麻烦,随想整合P6Spy打印可以直接执行的SQL,方便调试,用的Durid连接池。

Springboot项目集成Durid

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.18</version></dependency>

配置文件application.yml

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=trueusername: rootpassword: 123456# 指定数据源为 DruidDataSource,默认值为 HikariDataSourcetype: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 5min-idle: 5max-active: 15max-wait: 30000min-evictable-idle-time-millis: 30000time-between-eviction-runs-millis: 30000validation-query: SELECT 1 FROM DUALtest-while-idle: truetest-on-borrow: falsetest-on-return: falsepool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 5filters: stat,walluse-global-data-source-stat: truestat-view-servlet:enabled: trueurl-pattern: /druid/*login-username: adminlogin-password: 111111web-stat-filter:enabled: trueurl-pattern: /*exclusions: /druid/*, *.js, *.jpeg, *.jpg, *.png, *.gif, *.cssfilter:stat:merge-sql: trueslow-sql-millis: 3000log-slow-sql: true

配置P6Spy,有两种方式,一种是添加依赖jar包,一种是用p6spy-spring-boot-starter。

第一种:

添加依赖:可以添加到dev环境,生产环境不建议使用,有性能损耗。

<dependency><groupId>p6spy</groupId><artifactId>p6spy</artifactId><version>3.9.1</version>
</dependency>

或者只添加到开发环境

<profiles><profile><id>dev</id><activation><activeByDefault>true</activeByDefault></activation><properties><profiles.active>dev</profiles.active></properties><dependencies><dependency><groupId>p6spy</groupId><artifactId>p6spy</artifactId><version>3.9.1</version></dependency></dependencies></profile>
</profiles>

修改数据源配置,需要改2个地方,url和driver-class-name

修改前:

修改后:

spring:datasource:url: jdbc:p6spy:mysql://x.x.x.x:3306/my_test?allowPublicKeyRetrieval=true&useSSL=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=falseusername: rootpassword: 123456driver-class-name: com.p6spy.engine.spy.P6SpyDriver

 

添加spy.properties文件,默认会在项目根目录生成一个spy.log文件,把SQL打印到该文件中。

module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory# 自定义日志打印logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger#日志输出到控制台appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger# 使用日志系统记录 sql#appender=com.p6spy.engine.spy.appender.Slf4JLogger# 设置 p6spy driver 代理deregisterdrivers=true# 取消JDBC URL前缀useprefix=true# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.excludecategories=info,debug,result,batch,resultset# 日期格式dateformat=yyyy-MM-dd HH:mm:ss# 真实JDBC driver , 多个以 逗号 分割 默认为空#driverlist=org.h2.Driverdriverlist=oracle.jdbc.OracleDriver# 是否开启慢SQL记录outagedetection=true# 慢SQL记录标准 2 秒outagedetectioninterval=2

集成完成。

spy.properties参考:

mybatis-plus:

#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2

官网的例子:

################################################################## P6Spy Options File                                            ## See documentation for detailed instructions                   ## http://p6spy.github.io/p6spy/2.0/configandusage.html          #################################################################################################################################### MODULES                                                       ##                                                               ## Module list adapts the modular functionality of P6Spy.        ## Only modules listed are active.                               ## (default is com.p6spy.engine.logging.P6LogFactory and         ## com.p6spy.engine.spy.P6SpyFactory)                            ## Please note that the core module (P6SpyFactory) can't be      ## deactivated.                                                  ## Unlike the other properties, activation of the changes on     ## this one requires reload.                                     ###################################################################modulelist=com.p6spy.engine.spy.P6SpyFactory,com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory################################################################# CORE (P6SPY) PROPERTIES                                      ################################################################## A comma separated list of JDBC drivers to load and register.# (default is empty)## Note: This is normally only needed when using P6Spy in an# application server environment with a JNDI data source or when# using a JDBC driver that does not implement the JDBC 4.0 API# (specifically automatic registration).#driverlist=# for flushing per statement# (default is false)#autoflush=false# sets the date format using Java's SimpleDateFormat routine.# In case property is not set, milliseconds since 1.1.1970 (unix time) is used (default is empty)#dateformat=# prints a stack trace for every statement logged#stacktrace=false# if stacktrace=true, specifies the stack trace to print#stacktraceclass=# determines if property file should be reloaded# Please note: reload means forgetting all the previously set# settings (even those set during runtime - via JMX)# and starting with the clean table# (default is false)#reloadproperties=false# determines how often should be reloaded in seconds# (default is 60)#reloadpropertiesinterval=60# specifies the appender to use for logging# Please note: reload means forgetting all the previously set# settings (even those set during runtime - via JMX)# and starting with the clean table# (only the properties read from the configuration file)# (default is com.p6spy.engine.spy.appender.FileLogger)#appender=com.p6spy.engine.spy.appender.Slf4JLogger#appender=com.p6spy.engine.spy.appender.StdoutLogger#appender=com.p6spy.engine.spy.appender.FileLogger# name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log)# (used for com.p6spy.engine.spy.appender.FileLogger only)# (default is spy.log)#logfile=spy.log# append to the p6spy log file. if this is set to false the# log file is truncated every time. (file logger only)# (default is true)#append=true# class to use for formatting log messages (default is: com.p6spy.engine.spy.appender.SingleLineFormat)#logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat# Custom log message format used ONLY IF logMessageFormat is set to com.p6spy.engine.spy.appender.CustomLineFormat# default is %(currentTime)|%(executionTime)|%(category)|connection%(connectionId)|%(sqlSingleLine)# Available placeholders are:#   %(connectionId)            the id of the connection#   %(currentTime)             the current time expressing in milliseconds#   %(executionTime)           the time in milliseconds that the operation took to complete#   %(category)                the category of the operation#   %(effectiveSql)            the SQL statement as submitted to the driver#   %(effectiveSqlSingleLine)  the SQL statement as submitted to the driver, with all new lines removed#   %(sql)                     the SQL statement with all bind variables replaced with actual values#   %(sqlSingleLine)           the SQL statement with all bind variables replaced with actual values, with all new lines removed#customLogMessageFormat=%(currentTime)|%(executionTime)|%(category)|connection%(connectionId)|%(sqlSingleLine)# format that is used for logging of the java.util.Date implementations (has to be compatible with java.text.SimpleDateFormat)# (default is yyyy-MM-dd'T'HH:mm:ss.SSSZ)#databaseDialectDateFormat=yyyy-MM-dd'T'HH:mm:ss.SSSZ# format that is used for logging of the java.sql.Timestamp implementations (has to be compatible with java.text.SimpleDateFormat)# (default is yyyy-MM-dd'T'HH:mm:ss.SSSZ)#databaseDialectTimestampFormat=yyyy-MM-dd'T'HH:mm:ss.SSSZ# format that is used for logging booleans, possible values: boolean, numeric# (default is boolean)#databaseDialectBooleanFormat=boolean# Specifies the format for logging binary data. Not applicable if excludebinary is true.# (default is com.p6spy.engine.logging.format.HexEncodedBinaryFormat)#databaseDialectBinaryFormat=com.p6spy.engine.logging.format.PostgreSQLBinaryFormat#databaseDialectBinaryFormat=com.p6spy.engine.logging.format.MySQLBinaryFormat#databaseDialectBinaryFormat=com.p6spy.engine.logging.format.HexEncodedBinaryFormat# whether to expose options via JMX or not# (default is true)#jmx=true# if exposing options via jmx (see option: jmx), what should be the prefix used?# jmx naming pattern constructed is: com.p6spy(.<jmxPrefix>)?:name=<optionsClassName># please note, if there is already such a name in use it would be unregistered first (the last registered wins)# (default is none)#jmxPrefix=# if set to true, the execution time will be measured in nanoseconds as opposed to milliseconds# (default is false)#useNanoTime=false################################################################## DataSource replacement                                        ##                                                               ## Replace the real DataSource class in your application server  ## configuration with the name com.p6spy.engine.spy.P6DataSource ## (that provides also connection pooling and xa support).       ## then add the JNDI name and class name of the real             ## DataSource here                                               ##                                                               ## Values set in this item cannot be reloaded using the          ## reloadproperties variable. Once it is loaded, it remains      ## in memory until the application is restarted.                 ##                                                               ###################################################################realdatasource=/RealMySqlDS#realdatasourceclass=com.mysql.jdbc.jdbc2.optional.MysqlDataSource################################################################## DataSource properties                                         ##                                                               ## If you are using the DataSource support to intercept calls    ## to a DataSource that requires properties for proper setup,    ## define those properties here. Use name value pairs, separate  ## the name and value with a semicolon, and separate the         ## pairs with commas.                                            ##                                                               ## The example shown here is for mysql                           ##                                                               ###################################################################realdatasourceproperties=port;3306,serverName;myhost,databaseName;jbossdb,foo;bar################################################################## JNDI DataSource lookup                                        ##                                                               ## If you are using the DataSource support outside of an app     ## server, you will probably need to define the JNDI Context     ## environment.                                                  ##                                                               ## If the P6Spy code will be executing inside an app server then ## do not use these properties, and the DataSource lookup will   ## use the naming context defined by the app server.             ##                                                               ## The two standard elements of the naming environment are       ## jndicontextfactory and jndicontextproviderurl. If you need    ## additional elements, use the jndicontextcustom property.      ## You can define multiple properties in jndicontextcustom,      ## in name value pairs. Separate the name and value with a       ## semicolon, and separate the pairs with commas.                ##                                                               ## The example shown here is for a standalone program running on ## a machine that is also running JBoss, so the JNDI context     ## is configured for JBoss (3.0.4).                              ##                                                               ## (by default all these are empty)                              ###################################################################jndicontextfactory=org.jnp.interfaces.NamingContextFactory#jndicontextproviderurl=localhost:1099#jndicontextcustom=java.naming.factory.url.pkgs;org.jboss.naming:org.jnp.interfaces#jndicontextfactory=com.ibm.websphere.naming.WsnInitialContextFactory#jndicontextproviderurl=iiop://localhost:900################################################################# P6 LOGGING SPECIFIC PROPERTIES                               ################################################################## filter what is logged# please note this is a precondition for usage of: include/exclude/sqlexpression# (default is false)#filter=false# comma separated list of strings to include# please note that special characters escaping (used in java) has to be done for the provided regular expression# (default is empty)#include=# comma separated list of strings to exclude# (default is empty)#exclude=# sql expression to evaluate if using regex# please note that special characters escaping (used in java) has to be done for the provided regular expression# (default is empty)#sqlexpression=#list of categories to exclude: error, info, batch, debug, statement,#commit, rollback, result and resultset are valid values# (default is info,debug,result,resultset,batch)#excludecategories=info,debug,result,resultset,batch#whether the binary values (passed to DB or retrieved ones) should be logged with placeholder: [binary] or not.# (default is false)#excludebinary=false# Execution threshold applies to the standard logging of P6Spy.# While the standard logging logs out every statement# regardless of its execution time, this feature puts a time# condition on that logging. Only statements that have taken# longer than the time specified (in milliseconds) will be# logged. This way it is possible to see only statements that# have exceeded some high water mark.# This time is reloadable.## executionThreshold=integer time (milliseconds)# (default is 0)#executionThreshold=################################################################# P6 OUTAGE SPECIFIC PROPERTIES                                ################################################################## Outage Detection## This feature detects long-running statements that may be indicative of# a database outage problem. If this feature is turned on, it will log any# statement that surpasses the configurable time boundary during its execution.# When this feature is enabled, no other statements are logged except the long# running statements. The interval property is the boundary time set in seconds.# For example, if this is set to 2, then any statement requiring at least 2# seconds will be logged. Note that the same statement will continue to be logged# for as long as it executes. So if the interval is set to 2, and the query takes# 11 seconds, it will be logged 5 times (at the 2, 4, 6, 8, 10 second intervals).## outagedetection=true|false# outagedetectioninterval=integer time (seconds)## (default is false)#outagedetection=false# (default is 60)#outagedetectioninterval=30

第二种:

添加依赖:

<dependency><groupId>com.github.gavlyukovskiy</groupId><artifactId>p6spy-spring-boot-starter</artifactId><version>1.9.0</version>
</dependency>

修改数据源配置:同第一种方式,修改后

添加配置:这里和第一种方式不一样,可以添加个开关 enabled: true

decorator:datasource:p6spy:logging: filelog-file: spy.loglog-format: executionTime:%(executionTime) | sql:%(sqlSingleLine)

集成完成。

spy.log文件,日志格式可以通过配置文件修改,请另行参考网上的资料。

 

可能遇到的问题:dbType not support : null,这是没有识别出dbType,Durid数据源会存在该问题。

 解决方式:修改Durid配置中的filter,在stat和wall指定dbType和enabled

 

总结: 除了dbType not support这个问题外,我这还遇到了connection error的问题,最后发现其实和P6Spy无关。我这不是纯净的框架,数据源配置都是jar包的方式继承的父项目,改起来很费劲。P6Spy配置其实很简单,Durid连接池用MySQL的时候会有dbType不识别问题,其余的数据源都很好集成,如果遇到其余的稀奇古怪的问题,请先排查框架本身是否正常。

相关文章:

Springboot项目集成Durid数据源和P6Spy以及dbType not support问题

项目开发阶段&#xff0c;mybatis的SQL打印有占位符&#xff0c;调试起来还是有点麻烦&#xff0c;随想整合P6Spy打印可以直接执行的SQL&#xff0c;方便调试&#xff0c;用的Durid连接池。 Springboot项目集成Durid <dependency><groupId>com.alibaba</group…...

安卓如何卸载应用

卸载系统应用 首先需要打开手机的开发者选项&#xff0c;启动usb调试。 第二步需要在电脑上安装adb命令&#xff0c;喜欢的话还可以将它加入系统path。如果不知道怎么安装&#xff0c;可以从这里下载免安装版本。 第三步将手机与电脑用数据线连接&#xff0c;注意是数据线&a…...

【云原生|Kubernetes】14-DaemonSet资源控制器详解

【云原生|Kubernetes】14-DaemonSet资源控制器详解 文章目录 【云原生|Kubernetes】14-DaemonSet资源控制器详解简介典型用法DaemonSet语法规则Pod模板Pod 选择算符在选定的节点上运行 Pod DaemonSet的 Pods 是如何被调度的污点和容忍度DaemonSet更新和回滚DaemonSet更新策略执…...

基于 Guava Retry 在Spring封装一个重试功能

pom依赖 <dependency><groupId>com.github.rholder</groupId><artifactId>guava-retrying</artifactId><version>2.0.0</version> </dependency> <dependency><groupId>org.springframework.boot</groupId>…...

适用HarmonyOS 3.1版本及以上的应用及服务开发工具 DevEco Studio 3.1.1 Release 安装

文章目录 安装步骤1.下载安装包2.安装成功后&#xff0c;初次运行studio2.1 配置node与ohpm的环境2.2安装sdk2.3等待安装结束 3.创建项目3.1 点击Create Project3.2 选择一个空项目3.3 项目配置3.4 Finish、等待依赖下载完毕3.5 项目创建完成 tip 提示4.配置运行环境4.1 真机运…...

[信号与系统系列] 正弦振幅调制之差拍信号

当将具有不同频率的两个正弦曲线相乘时&#xff0c;可以创建一个有趣的音频效果&#xff0c;称为差拍音符。这种现象听起来像颤音&#xff0c;最好通过选择一个频率非常小的信号与和另一个频率大约1KHz的信号&#xff0c;把二者混合从而听到。一些乐器能够自然产生差拍音符。使…...

vb+SQL航空公司管理系统设计与实现

航空公司管理信息系统 一个正常营运的航空公司需要管理所拥有的飞机、航线的设置、客户的信息等,更重要的还要提供票务管理。面对各种不同种类的信息,需要合理的数据库结构来保存数据信息以及有效的程序结构支持各种数据操作的执行。 本设计讲述如何建立一个航空公司管理信…...

python爬取网页视频

Python是一种功能强大的编程语言&#xff0c;被广泛应用于网络爬虫、数据分析和人工智能等领域。在网络爬虫中&#xff0c;常常需要从网页中获取视频或者录制网页视频。下面将介绍如何使用Python来录制网页视频。 import time from selenium import webdriver # 创建驱动程序 d…...

数据挖掘具体步骤

数据挖掘具体步骤 1、理解业务与数据 2、准备数据 数据清洗&#xff1a; 缺失值处理&#xff1a; 异常值: 数据标准化&#xff1a; 特征选择&#xff1a; 数据采样处理&#xff1a; 3、数据建模 分类问题&#xff1a; 聚类问题&#xff1a; 回归问题 关联分析 集成学习 image B…...

react class与hooks区别

在React中&#xff0c;有两种主要的方式来管理组件的状态和生命周期&#xff1a;Class 组件和 Hooks。 Class 组件&#xff1a; Class 组件是 React 最早引入的方式&#xff0c;它是基于 ES6 class 的语法来创建的。Class 组件包含了生命周期方法&#xff0c;可以用来处理组件…...

Python爬虫思维:异常处理与日志记录

作为一名专业的爬虫代理供应商&#xff0c;我们经常会看见各种各样的爬虫异常情况。网络请求超时、页面结构变化、反爬虫机制拦截等问题时常出现在客户的工作中。 在这篇文章中&#xff0c;我将和大家分享一些关于异常处理与日志记录的思维方法。通过合理的异常处理和有效的日志…...

(十六)大数据实战——安装使用mysql版的hive服务

前言 hive默认使用的是内嵌据库derby&#xff0c;Derby 是一个嵌入式数据库&#xff0c;可以轻松地以库的形式集成到应用程序中。它不需要独立的服务器进程&#xff0c;所有的数据存储在应用程序所在的文件系统中。为了支持hive服务更方便的使用&#xff0c;我们使用mysql数据…...

【信号生成器】从 Excel 数据文件创建 Simulink 信号生成器块研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【UE4 RTS】01-Camera SetUp

UE版本&#xff1a;4.24.3 前言 本篇主要完成游戏模式、玩家控制器和玩家控制的Pawn的设置&#xff0c;下一篇介绍如何实现Pawn的移动 步骤 1. 首先创建一个俯视角游戏模板 2. 首先删除“TopDownCharacter”&#xff0c; 3. 新建一个文件夹命名为“RTS_Toturial” 在文件夹…...

Mirror网络库 | 说明

此篇为上文&#xff0c;下篇&#xff1a;Mirror网络库 | 实战 一、介绍 基于UNET&#xff0c;从2014年经过9年实战测试&#xff1b;服务器和客户端是一个项目&#xff1b;使用NetworkBehaviour而不是MonoBehaviour&#xff0c;还有NetworkServer和NetworkClient&#xff1b;Mi…...

分布式异步任务处理组件(九)

最近完成了网络通信模块的一些基本代码实现&#xff0c;这里记录一些关于类和接口设计的问题和思考&#xff1b;另外进度可能会受阻&#xff0c;之前不知道猴年马月投的简历现在开始邀约面试了&#xff0c;包括今天在内的三天都有一场面试--主要是今天中午的面试过后两分钟HR就…...

[excel]vlookup函数对相同的ip进行关联

一、需求&#xff08;由于ip不可泄漏所以简化如下&#xff09; 有两个sheet: 找到sheet1在sheet2中存在的ip&#xff0c;也就是找到有漏洞的ip 二、实现 vlookup函数有4个参数 第一个:当前表要匹配的列&#xff0c;选择第一个sheet当前行需要处理的ip即可 第二个:第二个shee…...

两个状态的马尔可夫链

手动推导如下公式。 证明&#xff1a; 首先将如下矩阵对角化&#xff1a; { 1 − a a b 1 − b } \begin {Bmatrix} 1-a & a \\ b & 1-b \end {Bmatrix} {1−ab​a1−b​} (1)求如下矩阵的特征值&#xff1a; { 1 − a a b 1 − b } { x 1 x 2 } λ { x 1 x 2 }…...

SpringBoot 依赖管理

Spring Boot 依赖管理 1. 父项目做依赖管理 无需关注版本号&#xff0c;自动版本仲裁机制 <!-- 依赖管理 --> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version&g…...

重试框架入门:Spring-RetryGuava-Retry

前言 在日常工作中&#xff0c;随着业务日渐庞大&#xff0c;不可避免的涉及到调用远程服务&#xff0c;但是远程服务的健壮性和网络稳定性都是不可控因素&#xff0c;因此&#xff0c;我们需要考虑合适的重试机制去处理这些问题&#xff0c;最基础的方式就是手动重试&#xf…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...