来来来, SAP BTP下使用CAP来生成PostgreSQL应用(一): Node.js篇

前言

SAP云应用程序编程模型(CAP)是一个语言、库和工具框架,用于构建企业级服务和应用程序。它引导开发人员沿着一条经过验证的最佳实践的“黄金之路”前进,并为反复出现的任务提供大量开箱即用的解决方案。

我们这就来看看SAP BTP的CAP到底提供了哪些便利。也以PostgreSQL作为数据库的后端为例 ,看看如何简单的应用CAP相关技术和技术栈。CAP不仅可以快速生成云上的应用,也可以生成本地可以运行的应用。

CAP框架的特点是混合了经过验证并被广泛采用的开源和SAP技术,如下图所示。

图片

image-20240310084908551

在开源技术基础上,CAP主要添加了:

  • Core Data Services (CDS):我们用于领域模型和服务定义的通用建模语言。

  • Service SDKs and runtimes :主为要node.js和Java.  提供实现和使用服务的库,以及自动服务众多请求的通用的程序实现。

基于CDS的运行架构图如下所示:

图片

image-20240310085301264

整个CAP里头,支持Node.js和Java两种技术栈。我们本篇就先简要介绍一下Node.js下的使用。友情提示:Node.js在SAP BTP云平台下的生态当中,占据着十分重要的地位。基本上除了Java以外,使用Node.js是最多的,其次还有GO相关技术栈。

环境搭建

安装Node.js:

从https://nodejs.org/en 下载最新的LTS长期稳定版,如:https://nodejs.org/dist/v20.11.1/node-v20.11.1-x64.msi

安装CAP的cds-sdk

npm add -g @sap/cds-dk
cds #> run the installed CLI

安装GIT

步骤: 略
git version

安装sqlite

只在WINDOWS平台上安装。 从:https://sqlite.org/download.html 下载即可。
从Precompiled Binaries for Windows 那一部分找。
下载完,将sqlite-tools-win-x64-3450100.zip解压,里边的sqlite3.exe就是要用到的sqlite3应用程序。

将sqlite3.exe添加到%PATH%环境变量里头。验证:

E:\work\3rdparty\postgres\postgres>sqlite3
SQLite version 3.45.1 2024-01-30 16:01:20 (UTF-16 console I/O)
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

sqlite3是cds环境默认的数据库后端。主要用于开发测试使用。

安装mvn, java JDK (略)

这一部分是为Java技术栈提供的。只用Node.js时,可以不用装

安装MS vscode

直接从https://code.visualstudio.com/ 下载安装即可。

推荐安装以下扩展插件:

  • SAP CDS Language Support

  • ESLint

  • REST Client

  • SQLite Viewer

  • Rainbow CSV

安装配备PostgreSQL数据库

这个我们有足够的理由略。公众号以及官方文档里有大量的介绍。本文假定你已经提前准备好了PostgreSQL的运行环境。

实例

下面, 我们就来一个简单的示例来介绍一下使用CAP/cds来进行相关开发,最终能访问到PostgreSQL数据库。

1、初始化工程

cds init bookshop

E:\work\3rdparty\postgres\cap\bookshop>tree .
卷 Work 的文件夹 PATH 列表
卷序列号为 000000D0 3938:438F
E:\WORK\3RDPARTY\POSTGRES\CAP\BOOKSHOP
├─.vscode
├─app
├─db
└─srv

它会自动在下边生成app、db、srv三个子目录。我们可以用code bookshop直接打开这个工程。看到上边完整的目录结构。

package.json则定义了Node.js的运行包的依赖及启动定义。

2、定义一些schema

文件db/schema.cds, 内容如下:

using { Currency, managed, sap } from '@sap/cds/common';
namespace sap.capire.bookshop; 

entity Books : managed { 
  key ID : Integer;
  title  : localized String(111);
  descr  : localized String(1111);
  author : Association to Authors;
  genre  : Association to Genres;
  stock  : Integer;
  price  : Decimal(9,2);
  currency : Currency;
}

entity Authors : managed { 
  key ID : Integer;
  name   : String(111);
  books  : Association to many Books on books.author = $self;
}

/** Hierarchically organized Code List for Genres */
entity Genres : sap.common.CodeList { 
  key ID   : Integer;
  parent   : Association to Genres;
  children : Composition of many Genres on children.parent = $self;
}

这时,我们如果运行cds watch, 可以看到,它把上边定义的schema, 部署到sqlite的内存模式的数据库里头去了。这是默认行为。

E:\work\3rdparty\postgres\cap\bookshop>cds watch

cds serve all --with-mocks --in-memory?
live reload enabled for browsers

        ___________________________

[cds] - loaded model from 2 file(s):

  db\schema.cds
  C:\Users\Think\AppData\Roaming\npm\node_modules\@sap\cds-dk\node_modules\@sap\cds\common.cds

[cds] - connect using bindings from: { registry: '~/.cds-services.json' }
[cds] - connect to db > sqlite { database: ':memory:' }
/> successfully deployed to in-memory database.


[cds] - server listening on { url: 'http://localhost:4004' }
[cds] - launched at 2024/3/10 17:58:59, version: 7.7.0, in: 6.550s
[cds] - [ terminate with ^C ]


    No service definitions found in loaded models.
    Waiting for some to arrive...

而当你打开浏览器访问:http://localhost:4004 它也能为你打开一个初具雏形的页面。我们需要在后边进行适当补充。

同时,可以使用如下命令,将schema定义转化成json, yml, sql等多种形式:

cds db/schema.cds -2 json
cds db/schema.cds -2 yml
cds db/schema.cds -2 sql

--看看它转化成的SQL语句的样子:(节选)
CREATE TABLE sap_capire_bookshop_Books (
  createdAt TIMESTAMP_TEXT,
  createdBy NVARCHAR(255),
  modifiedAt TIMESTAMP_TEXT,
  modifiedBy NVARCHAR(255),
  ID INTEGER NOT NULL,
  title NVARCHAR(111),
  descr NVARCHAR(1111),
  author_ID INTEGER,
  genre_ID INTEGER,
  stock INTEGER,
  price DECIMAL(9, 2),
  currency_code NVARCHAR(3),
  PRIMARY KEY(ID)
);

CREATE TABLE sap_capire_bookshop_Authors (
  createdAt TIMESTAMP_TEXT,
  createdBy NVARCHAR(255),
  modifiedAt TIMESTAMP_TEXT,
  modifiedBy NVARCHAR(255),
  ID INTEGER NOT NULL,
  name NVARCHAR(111),
  PRIMARY KEY(ID)
);

CREATE TABLE sap_capire_bookshop_Genres (
  name NVARCHAR(255),
  descr NVARCHAR(1000),
  ID INTEGER NOT NULL,
  parent_ID INTEGER,
  PRIMARY KEY(ID)
);

CREATE TABLE sap_common_Currencies (
  name NVARCHAR(255),
  descr NVARCHAR(1000),
  code NVARCHAR(3) NOT NULL,
  symbol NVARCHAR(5),
  minorUnit SMALLINT,
  PRIMARY KEY(code)
);
.......

这里考虑到PostgreSQL中表名或其它对象名的63个字符长度的限制,我们还真不能把包名得太长,一不小心就会超长了。

3、定义相关服务(service)

定义完schema之后,我们就可以定义一下服务(service)了。

文件 svc/admin-service.cds

using { sap.capire.bookshop as my } from '../db/schema';
service AdminService @(requires:'authenticated-user') { 
  entity Books as projection on my.Books;
  entity Authors as projection on my.Authors;
}

文件 srv/cat-service.cds
using { sap.capire.bookshop as my } from '../db/schema';
service CatalogService @(path:'/browse') { 

  @readonly entity Books as select from my.Books {*,
    author.name as author
  } excluding { createdBy, modifiedBy };

  @requires: 'authenticated-user'
  action submitOrder (book: Books:ID, quantity: Integer);
}

这里解释一下这两个service的逻辑:

admin-service: 它需要进行user的认证,认证通过以后,就可以基于Books和Authors两个schema描述的entity进行正常的访问了。

cat-service: 它直接可以进行浏览数据 ,能以只读方式访问Books, 顺带访问Author(根据作者名字). 但是会排除createdBy, modifiedBy两个字段。同时,如果提供了用户认证,则可以按照Book的ID和数量来提交订单(action:submitOrder)。

这里感觉整个过程,基本上没怎么写代码,全部给你生成了相应的逻辑。

这次我们再看看效果:

cds watch
......
[cds] - serving AdminService { path: '/odata/v4/admin' }
[cds] - serving CatalogService { path: '/browse' }

[cds] - server listening on { url: 'http://localhost:4004' }
[cds] - launched at 2024/3/10 20:03:40, version: 7.7.0, in: 991.416ms
[cds] - [ terminate with ^C ]

这里我们看到了/odata/v4/admin的rest路径了。使用浏览器访问,看到如下效果:

图片

image-20240310200645298

访问:http://localhost:4004/odata/v4/admin/$metadata 时,可以使用alice这个缺省用户,不用输入密码即可得到admin权限。

4、配置访问使用数据库

默认方式使用的就是sqlite内存方式启动的数据库。我们一步步演化推进:

添加如下两个csv格式的数据文件:

db/data/sap.capire.bookshop-Books.csv
ID,title,author_ID,stock
201,Wuthering Heights,101,12
207,Jane Eyre,107,11
251,The Raven,150,333
252,Eleonora,150,555
271,Catweazle,170,22

db/data/sap.capire.bookshop-Authors.csv
ID,name
101,Emily Brontë
107,Charlotte Brontë
150,Edgar Allen Poe
170,Richard Carpenter

我们修改一下package.json, 指定一下数据库,添加内容如下:

"cds": { "requires": {
   "db": {
      "kind": "sqlite",
      "credentials": { "url": "db.sqlite" } 
   }
}}

这个时候,我们只要运行cds deploy就可以将数据deploy到sqlite数据库当中。文件名为db.sqlite.

E:\work\3rdparty\postgres\cap\bookshop>cds deploy
  > init from db\data\sap.capire.bookshop-Books.csv
  > init from db\data\sap.capire.bookshop-Authors.csv
/> successfully deployed to db.sqlite

E:\work\3rdparty\postgres\cap\bookshop>sqlite3 db.sqlite
SQLite version 3.45.1 2024-01-30 16:01:20 (UTF-16 console I/O)
Enter ".help" for usage hints.
sqlite> .tables
AdminService_Authors
AdminService_Books
AdminService_Books_texts
AdminService_Currencies
AdminService_Currencies_texts
AdminService_Genres
AdminService_Genres_texts
CatalogService_Books
CatalogService_Books_texts
CatalogService_Currencies
CatalogService_Currencies_texts
CatalogService_Genres
............
sap_capire_bookshop_Authors
sap_capire_bookshop_Books
sap_capire_bookshop_Books_texts
sap_capire_bookshop_Genres
sap_capire_bookshop_Genres_texts
sap_common_Currencies
sap_common_Currencies_texts

sqlite> select * from sap_capire_bookshop_Books;
2024-03-10T13:37:12.624Z|anonymous|2024-03-10T13:37:12.624Z|anonymous|201|Wuthering Heights||101||12||
2024-03-10T13:37:12.624Z|anonymous|2024-03-10T13:37:12.624Z|anonymous|207|Jane Eyre||107||11||
2024-03-10T13:37:12.624Z|anonymous|2024-03-10T13:37:12.624Z|anonymous|251|The Raven||150||333||
2024-03-10T13:37:12.624Z|anonymous|2024-03-10T13:37:12.624Z|anonymous|252|Eleonora||150||555||
2024-03-10T13:37:12.624Z|anonymous|2024-03-10T13:37:12.624Z|anonymous|271|Catweazle||170||22||

你会发现它建了很多表。上边两个数据文件的数据也都添加进去了。

如果我们访问:http://localhost:4004/odata/v4/admin/Books 都能看到对应的数据了。

{
    "@odata.context": "$metadata#Books",
    "value": [{
        "createdAt": "2024-03-10T13:44:54.391Z",
        "createdBy": "anonymous",
        "modifiedAt": "2024-03-10T13:44:54.391Z",
        "modifiedBy": "anonymous",
        "ID": 201,
        "title": "Wuthering Heights",
        "descr": null,
        "author_ID": 101,
        "genre_ID": null,
        "stock": 12,
        "price": null,
        "currency_code": null
    },
    ...
}

截至目前为止,我们看到的还是连接到sqlite数据库。大多数功能都是直接提供给你的。

我们看看,切换到PostgreSQL数据库是啥样的?该如何做?

对于Node.js而言,有如下依赖关系:

DatabasePackageRemarks
SAP HANA Cloud@sap/cds-hanarecommended for production
SQLite@cap-js/sqliterecommended for development
PostgreSQL@cap-js/postgresmaintained by community + CAP team

可以使用 npm add @cap-js/postgres 来添加对PostgreSQL的依赖。

我这里是提前准备好的一个VM上的PostgreSQL环境,CentOS7.9,  PG14.x,  用户名mydb, 密码test123,它的数据库名也为mydb。提前准备好。

E:\work\3rdparty\postgres\postgres>psql -h 192.168.0.20 -U mydb -p 5555
用户 mydb 的口令:
psql (14.4, 服务器 14.11)
输入 "help" 来获取帮助信息.

mydb=> \d
没有找到任何关系.
mydb=>

如果要设成PostgreSQL的数据库连接环境,在工程根目录下边建一个文件.env。内容如下:

cds.requires.db.[pg].kind = postgres
cds.requires.db.[pg].credentials.host = 192.168.0.20
cds.requires.db.[pg].credentials.port = 5555
cds.requires.db.[pg].credentials.user = mydb
cds.requires.db.[pg].credentials.password = test123
cds.requires.db.[pg].credentials.database = mydb

这是一种配置方式,另一种方式是使用直接在package.json中修改添加相关的数据库类型及连接信息:

  "cds": {
    "requires": {
      "db": {
        "[sqlite]": { "kind": "sqlite", "impl": "@cap-js/sqlite", "credentials": { "url": "db.sqlite" } },
        "[pg]": {"kind": "postgres", "impl": "@cap-js/postgres", 
          "credentials": {
             "host": "192.168.0.20", 
             "port": 5555,
             "user": "mydb",
             "password": "test123",
             "database": "mydb"
          }
        }
      }
    }
  },

上边[pg]部分定义的就是与PostgreSQL相关的内容。

我们可以使用下边的命令诊断一下:(注 --profile 用于指定是哪种profile)

E:\work\3rdparty\postgres\cap\bookshop>cds env requires.db --profile pg
{
  impl: '@cap-js/postgres',
  dialect: 'postgres',
  vcap: { label: 'postgresql-db' },
  schema_evolution: 'auto',
  kind: 'postgres',
  credentials: {
    host: '192.168.0.20',
    port: 5555,
    user: 'mydb',
    password: 'test123',
    database: 'mydb'
  }
}

5、验证访问PostgreSQL

我们再次启动这个应用:

cds watch --profile pg
.......
[cds] - connect using bindings from: { registry: '~/.cds-services.json' }
[cds] - connect to db > postgres {
  host: '192.168.0.200',
  port: 5555,
  user: 'mydb',
  password: '...',
  database: 'mydb'
}
[cds] - using auth strategy {
  kind: 'mocked',
  impl: 'node_modules\\@sap\\cds\\lib\\auth\\basic-auth'
}

[cds] - serving AdminService { path: '/odata/v4/admin' }
[cds] - serving CatalogService { path: '/browse' }

[cds] - server listening on { url: 'http://localhost:4004' }
[cds] - launched at 2024/3/13 05:07:19, version: 7.7.1, in: 16.285s
[cds] - [ terminate with ^C ]

同时,数据库部分,需要对SCHEMA以及数据表中的数据进行初始化:

E:\work\3rdparty\postgres\cap\bookshop>cds deploy --profile pg
  > init from db\data\sap.capire.bookshop-Books.csv
  > init from db\data\sap.capire.bookshop-Authors.csv
/> successfully deployed to 192.168.0.20:5555

我们再次访问PG里头的数据库:mydb:

mydb=# \d
                       List of relations
 Schema |                 Name                  | Type  | Owner
--------+---------------------------------------+-------+-------
 public | adminservice_authors                  | view  | mydb
 public | adminservice_books                    | view  | mydb
 public | adminservice_books_texts              | view  | mydb
 public | adminservice_currencies               | view  | mydb
 public | adminservice_currencies_texts         | view  | mydb
 public | adminservice_genres                   | view  | mydb
 public | adminservice_genres_texts             | view  | mydb
 public | catalogservice_books                  | view  | mydb
 public | catalogservice_books_texts            | view  | mydb
 public | catalogservice_currencies             | view  | mydb
 public | catalogservice_currencies_texts       | view  | mydb
 public | catalogservice_genres                 | view  | mydb
 public | catalogservice_genres_texts           | view  | mydb
 public | cds_model                             | table | mydb
 public | localized_adminservice_authors        | view  | mydb
 public | localized_adminservice_books          | view  | mydb
 public | localized_adminservice_currencies     | view  | mydb
 public | localized_adminservice_genres         | view  | mydb
 public | localized_catalogservice_books        | view  | mydb
 public | localized_catalogservice_currencies   | view  | mydb
 public | localized_catalogservice_genres       | view  | mydb
 public | localized_sap_capire_bookshop_authors | view  | mydb
 public | localized_sap_capire_bookshop_books   | view  | mydb
 public | localized_sap_capire_bookshop_genres  | view  | mydb
 public | localized_sap_common_currencies       | view  | mydb
 public | sap_capire_bookshop_authors           | table | mydb
 public | sap_capire_bookshop_books             | table | mydb
 public | sap_capire_bookshop_books_texts       | table | mydb
 public | sap_capire_bookshop_genres            | table | mydb
 public | sap_capire_bookshop_genres_texts      | table | mydb
 public | sap_common_currencies                 | table | mydb
 public | sap_common_currencies_texts           | table | mydb

我们会发现创建了8张表以及近24个视图。自动创建的东西看来不少。

如果我们去访问网页:http://localhost:4004/browse/Books

确实能得到标准的OData数据(json格式输出):

{"@odata.context":"$metadata#Books","value":[{"ID":201,"descr":null,"price":null,"stock":12,"title":"Wuthering Heights","author":"Emily Brontë","genre_ID":null,"createdAt":"2024-03-12T21:10:32.074Z","modifiedAt":"2024-03-12T21:10:32.074Z","currency_code":null},{"ID":207,"descr":null,"price":null,"stock":11,"title":"Jane Eyre","author":"Charlotte Brontë","genre_ID":null,"createdAt":"2024-03-12T21:10:32.074Z","modifiedAt":"2024-03-12T21:10:32.074Z","currency_code":null},{"ID":251,"descr":null,"price":null,"stock":333,"title":"The Raven","author":"Edgar Allen Poe","genre_ID":null,"createdAt":"2024-03-12T21:10:32.074Z","modifiedAt":"2024-03-12T21:10:32.074Z","currency_code":null},{"ID":252,"descr":null,"price":null,"stock":555,"title":"Eleonora","author":"Edgar Allen Poe","genre_ID":null,"createdAt":"2024-03-12T21:10:32.074Z","modifiedAt":"2024-03-12T21:10:32.074Z","currency_code":null},{"ID":271,"descr":null,"price":null,"stock":22,"title":"Catweazle","author":"Richard Carpenter","genre_ID":null,"createdAt":"2024-03-12T21:10:32.074Z","modifiedAt":"2024-03-12T21:10:32.074Z","currency_code":null}]}

而这也是SAP产品规范中很重要的一环。它的大部分产品的输出结果就是按照OData规范,输出成Json格式的。

至此,这个简单的实验结束 。

总结 :

本文只是简要的介绍了一下CAP框架下,使用cds (core data service)生成框架,快速搭建一个Node.js应用,访问和管理存储到PostgreSQL中的企业数据。CAP在Node.js技术栈下,目前支持三种数据库(sqlite, PostgreSQL, HANA),目前,不支持SAP Sybase ASE。

只要环境搭建好,使用访问还是非常方便的。而且整个应用会全部使用Node.js。因为本文侧重于访问数据库这一块。如果你要想全面了解CAP开发框架,那么,关于安全、UI、云平台部署等方面,也需要进行相关的了解,可以仔细阅读参考部分的网址。里边各节都有相关介绍。

参考

https://cap.cloud.sap/docs/:  SAP (The Cloud Application Programming Model) 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有来团队后台项目-解析5

一、 husky 安装 pnpm install -D husky生成husky 配置文件 如果文件中有.git文件,那么直接执行 npx husky-init如果没有,那么先执行git init 结果: PS F:\company_project\demo\youlahoutaijiexi\vite-project> git init Initializ…

【DDR】DDR4学习记录

这里以美光DDR4芯片 MT40A512M16HA-075E datasheet 为例,说明DDR4存储器的原理及仿真。   根据开发板手册ug1302,在vcu128(xcvu37p)开发板上,共具有5块DDR4芯片,在数据信号上4块DDR4具有16位数据线&#…

【HomeAssistant新版文件管理器】

【HomeAssistant新版文件管理器】 1. 前言2. 地址3. 安装4. 使用方法5. 总结欢迎大家阅读2345VOR的博客【Home Assistant 之QQ邮箱推送提醒】🥳🥳🥳2345VOR鹏鹏主页: 已获得CSDN《嵌入式领域优质创作者》称号🎉🎉、阿里云《arduino专家博主》👻👻👻,座右铭:…

蓝桥杯--日期统计

目录 一、题目 二、解决代码 三、代码分析 ​四、另一种思路 五、关于set文章推荐 一、题目 二、解决代码 #include <bits/stdc.h> using namespace std; int main() {int arr[100] { 5,6,8,6,9,1,6,1,2,4,9,1,9,8,2,3,6,4,7,7,5,9,5,0,3,8,7,5,8,1,5,8,6,1,8,3,0,…

第五节:使用SMB开发WebSocket通信

一、概述 本节主要讲解在SMB中如何进行websocket快速开发&#xff0c;实现客户端连接、关闭、消息通讯等功能。 示例下载&#xff1a;https://download.csdn.net/download/lllllllllluoyi/88949743 二、创建WebSocket服务器 1、在csdnProject工程中新建一个消息流。 添加W…

命名空间多线程计时(C++基础)

命名空间 不要在头文件内使用using namespace&#xff0c;一定要确保实在一个足够小的作用域下使用&#xff0c;在哪个范围内&#xff0c;比如函数、if语句等&#xff0c;但一定不要在头文件中使用&#xff01;&#xff01;&#xff01; 上述示例中&#xff0c;会调用orange中…

windows系统图标变白设置

我们在使用系统的时候&#xff0c;通常会在桌面创建图标&#xff0c;有时候桌面图标过多&#xff0c;整理图标放在新建文件夹的时候&#xff0c;图标变白&#xff0c;通常情况下都是缓存问题&#xff0c;这里也是删除缓存解决演示系统&#xff1a;windows11 1显示图标缓存目录 …

用Python进行机器学习:Scikit-learn的入门与实践【第126篇—Scikit-learn的入门】

用Python进行机器学习&#xff1a;Scikit-learn的入门与实践 随着机器学习在各个领域的广泛应用&#xff0c;Python成为了一个备受欢迎的机器学习工具之一。在众多机器学习库中&#xff0c;Scikit-learn因其简单易用、功能强大而备受青睐。本文将介绍Scikit-learn的基本概念&am…

数据持久化(Json)

平常写代码的时候就应该习惯性的加【SerializeField】System.Serializable 如果是公有变量可以不加 泛型就要用<> JSon语法 之后Lua热更新的学习也会使用Sublime Text Excel转Json https://www.bejson.com/json/col2json 记得检查一下&#xff0c;得到的Json格式是否…

SpringBoot3快速入门

目录 一、快速创建项目 二、手动创建一个工程 一、快速创建项目 1、使用官网提供的spring组件创建一个springboot3工程&#xff0c;springboot3要使用JDK17以上的版本 选择配置点击finish&#xff0c;刷新maven 创建一个controller层&#xff0c;写一个demo&#xff0c;点击运…

Edu 12 --- Simple Subset -- 题解 (一个比较巧妙的思维算法题)

Simple Subset&#xff1a; 题解&#xff1a; 思路解析&#xff1a; 题目要求任意两个数的和为质数&#xff0c;那我们最坏情况就是任意选择一个数&#xff0c;此时子集为最大。 如果子集中有两个奇数或者偶数&#xff0c;他们两个之和一定会被2整除&#xff0c;那么我们只能…

JVM垃圾收集器-serial.parNew,parallelScavnge,serialOld,parallelOld,CMS,G1

垃圾收集器 分代模型 适用于新生代&#xff1a; serial parNew parallel Scaavenge 适用于老年代&#xff1a; CMS serial Old(msc) paraller Old 分区模型 适用于超大容量&#xff1a; G1 分代模型 serial /serial Old收集器 1.单线程收集器 2.收集时会暂停其他线程&…

从零搭建Vue项目

目录 环境准备 NodeJS安装 ​编辑 2. 选择安装目录 3. 验证NodeJS环境变量 4. 配置npm的全局安装路径 5. 切换npm的淘宝镜像 6. 安装Vue-cli Vue项目创建 1. 打开UI界面 2. 打开项目管理器 3. 创建项目 vue项目目录结构介绍 运行vue项目 Vue项目开发流程 Vue组…

k8s CKA upgrade - Kubeadm 版本升级实测

升级版本最好是逐步去升级&#xff0c;不要跨越多个大版本&#xff0c;可能会出错 大体流程&#xff1a; 1.先确定升级版本 2.升级kubeadm 3.驱逐节点 4.升级kubelet和kubectl 5.重启kubelet服务 6.恢复节点&#xff0c;使其上线 1.查看现版本&#xff1a;升级版本 kubectl ge…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的夜间车辆检测系统(深度学习代码+UI界面+训练数据集)

摘要&#xff1a;开发夜间车辆检测系统对于自动驾驶技术具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个夜间车辆检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模型间…

oracle临时表空间不释放

项目报错 nested exception is java.sql.SQLException: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP 原因是临时表空间满了&#xff0c;临时表空间一直增长&#xff0c;未释放导致临时表空间使用率100%。 查询临时表空间使用率 --临时表空间利用率…

【MySQL 系列】MySQL 语句篇_DDL 语句

DDL&#xff08; Data Definition Language&#xff0c;数据定义语言&#xff09;用在定义或改变表的结构数据类型、表之间的链接和约束等初始化工作上。常用的语句关键字包括 CREATE、 DROP、 ALTER 等。 文章目录 1、MySQL 中的 DQL 语句2、MySQL 中库表的 DQL 语句详解2.1、…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的常见手势识别系统(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;开发手势识别系统对于增强人机交互和智能家居控制领域的体验非常关键。本博客详尽阐述了通过深度学习技术构建手势识别系统的过程&#xff0c;并附上了全套实施代码。系统采用了先进的YOLOv8算法&#xff0c;并通过与YOLOv7、YOLOv6、YOLOv5的性能对比&#xf…

代码学习记录17

随想录日记part17 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.12 主要内容&#xff1a;今天的主要内容是二叉树的第六部分&#xff0c;主要涉及二叉搜索树的最小绝对差 &#xff1b;二叉搜索树中的众数&#xff1b;二叉树的最近公共祖先。 530.二叉搜索树…

关于c++的protected关键字

关于c的protected关键字 分类引言例子1&#xff09;错误的demo2&#xff09;改正的demo protected在c中的含义与作用 分类 c基础知识 引言 做了很业务&#xff0c;c基础知识却忘了很多&#xff0c;今天看了一个例子&#xff0c;唤醒了我关于c三大特性之一----封装&#xff0…