Linux Tomcat服务 虚拟主机 多实例部署

news2024/11/22 18:58:52

 Tomcat 服务

        Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器。Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 java开发的JSP 动态页面程序的首选。一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。

  • Tomcat 可以作为Web应用服务器,处理静态的Web页面,如html页面,但性能一般。
  • Tomcat 还可以作为servlet/jsp容器,处理java语言开发的jsp动态页面程序,这也是tomcat的主要应用场景

Tomcat 由一系列的组件构成,其中核心的组件有三个

(1)Web 容器:完成 Web 服务器的功能。
(2)Servlet 容器:名字为 catalina,用于处理 Servlet 代码。
(3)JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码。

因此 Tomcat 是 Web 应用服务器,也是一个 Servlet/JSP 容器。Tomcat 作为 Servlet 容器,负责处理客户请求,把请求传送给 Servlet,并将 Servlet 的响应传送回给客户。

什么是 servlet?
Servlet 是Java Servlet 的简称,可以理解为是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性, 简单的理解:servlet 就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建。

什么是 JSP?
JSP 全称 Java Server Pages,是一种动态网页开发技术。它使用 JSP 标签在HTML网页中插入 Java 代码。标签通常以 <% 开头,以 %> 结束。
JSP 是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。
JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

Tomcat 功能组件结构

        Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。 其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。

        每个 Tomcat 服务器可以管理多个 Service。tomcat与NGINX,Apache不同,可以通过部署多个tomcat服务,达成一台服务器多个站点的目的。也可以和nginx,Apache的server虚拟站点一样,使用host虚拟站点。

  • connector连接器:暴露监听端口,接收客户端发来的请求和返回响应消息给客户端
  • container容器:负责处理用户的业务请求。由四个子容器engine、host、context、wrapper组成,且他们是父子关系。↓
    • engine:引擎,管理多个虚拟主机,一个container只有一个engine
    • host:代表一个虚拟主机 相当于nginx的server
    • context:管理web应用的路径 相当于不同的网页
    • wrapper:servlet封装器,负责处理业务逻辑

Tomcat 请求过程

1、用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;
2、Connector  把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;
3、Engine(Container)根据域名发送给对应的虚拟主机 Host根据用户的访问URL路径 发送给  Context根据URL路径的Web应用 发送给Wrapper(servlet)根据应用程序处理业务逻辑。 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。
4、执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。

 
 


---------------------Tomcat 服务部署-------------------------
 

在部署 Tomcat 之前必须安装好 jdk,因为 jdk 是 Tomcat 运行的必要环境。
jdk包通常会包含 JDK、JRE、JVM

  • JDK: java development kit               java开发工具       
  • JRE:java runtime environment        java编译、运行时环境
  • JVM:java virtuak machine               java虚拟机,可使java程序在不同平台上运行class文件

1.关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下

jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gz

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

 2.安装JDK

cd /opt
rpm -qpl jdk-8u201-linux-x64.rpm
rpm -ivh jdk-8u201-linux-x64.rpm
java -version

3.设置JDK环境变量

在/etc/profile的子目录编写脚本,达到自动加载效果

vim /etc/profile.d/java.sh

export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64      #不必要,方便下面两条必要的配置,预定义路径
export JRE_HOME=$JAVA_HOME/jre                     #不必要,方便下面两条必要的配置,预定义路径
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib    #必要
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH     #必要

重载配置 

source /etc/profile.d/java.sh

查看java版本 

java -version

CLASSPATH:告诉jvm要使用或执行的class放在什么路径上,便于JVM加载class文件。
tools.jar:是系统用来编译一个类的时候用到的,即执行javac的时候用到。
dt.jar:dt.jar是关于运行环境的类库,主要是swing包。

验证安装的JAVA是否生效

首先使用文本工具编写java源代码,比如 Hello.java ;
在命令行中,输入命令:javac Hello.java,对源代码进行编译,生成 class 字节码文件;
编译完成后,如果没有报错信息,输入命令:java Hello,运行 class 字节码文件,由 JVM 对字节码进行解释和运行,打印 “Hello World”。

vim Hello.java

//类名、接口名命令:英文大小写字母、数字字符、$和_,不能使用关键字和数字开头;
//一个单词命名时第一个单词的首字母要大写;多单词组成时,所有单词的首字母大写:XxxYyyZzz(大驼峰命名法)

public class Hello {
  public static void main(String[] args){
    System.out.println("Hello world!");
  }
}
javac Hello.java
java Hello

4.安装启动Tomcat  支持systemctl指令启动tomcat

cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat

后台启动

/usr/local/tomcat/bin/startup.sh
或
/usr/local/tomcat/bin/catalina.sh start

前台启动

/usr/local/tomcat/bin/catalina.sh run

 关闭服务

/usr/local/tomcat/bin/shutdown.sh

 启动情况

netstat -natp | grep 8080
或
jps #java自带查看进程命令

tcp 8080     负责处理http请求连接      8443   负责处理https请求连接
      8005     关闭tomcat服务使用
      8009     AJP协议端口,与apache连接使用,apache可通过AJP协议访问tomcat的8009端口

如何通过进程号查看文件?(面试题)

lsof -p [pid]

如何通过端口号查看进程?(面试题)

lsof -i :8080
netstat -natp | grep 8080

编写脚本支持systemctl指令启动tomcat

vim /usr/lib/systemd/system/tomcat.service

[Unit]
Description=tomcat server
Wants=network-online.target
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/java/jdk1.8.0_201-amd64"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]WantedBy=multi-user.target
systemctl daemon-reload
#重载配置

5.优化tomcat启动速度

第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改。

vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security

--117行--修改
securerandom.source=file:/dev/urandom

 ----------------------------------------------------------------------------------------------------------
●tomcat 启动慢的原因是随机数产生遭到阻塞,遭到阻塞的原因是 熵池大小 。
●/dev/random:阻塞型,读取它就会产生随机数据,但该数据取决于熵池噪声,当熵池空了,对/dev/random 的读操作也将会被阻塞。
●/dev/urandom:非阻塞的随机数产生器,它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
●Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。
----------------------------------------------------------------------------------------------------------

tomcat主要目录说明

----------------------------------------------------------------------------------------------------
●bin:存放启动和关闭 Tomcat 的脚本文件,如 catalina.sh、startup.sh、shutdown.sh 
●conf:存放 Tomcat 服务器的各种配置文件,如主配置文件 server.xml 和 应用默认的部署描述文件 web.xml 
●lib:存放 Tomcat 运行需要的库文件的 jar 包,一般不作任何改动
●logs:存放 Tomcat 执行时的日志
●temp:存放 Tomcat 运行时产生的文件
●webapps:存放 Tomcat 默认的 Web 应用项目资源的目录
●work:Tomcat 的工作目录,存放 Web 应用代码生成和编译文件
----------------------------------------------------------------------------------------------------------

---------------------Tomcat 虚拟主机配置-------------------------

很多时候公司会有多个项目需要运行,一般不会是在一台服务器上运行多个 Tomcat 服务,这样会消耗太多的系统资源。此时, 就需要使用到 Tomcat 虚拟主机。
例如现在新增两个域名 www.xue.com 和 www.benet.com, 希望通过这两个域名访问到不同的项目内容。

tomcat是java编写所以内存占用多,类似2核4g 4核8g。

虚拟主机在指定的资源内运行多个站点服务(资源少并发小使用),而多实例则提供更多的连接数。(资源多并发大使用)

1.在 webapps 目录中添加 各个站点的网页根目录,准备测试网页文件(创建 kgc 和 benet 项目目录和文件)

mkdir /usr/local/tomcat/webapps/xue
mkdir /usr/local/tomcat/webapps/benet
echo "This is xue page\!" > /usr/local/tomcat/webapps/xue/index.jsp
echo "This is benet page\!" > /usr/local/tomcat/webapps/benet/index.jsp

2.修改 Tomcat 主配置文件 server.xml

在Engine(容器)配置段下面添加多个 host 配置段,设置不同的虚拟主机配置参数
在host配置段下面添加context配置段,设置每个虚拟机主机的网页根目录配置参数

vim /usr/local/tomcat/conf/server.xml

--165行前--插入
<Host name="www.xue.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context docBase="/usr/local/tomcat/webapps/xue" path="" reloadable="true" />
</Host>

<Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />
</Host>

path选项代表根目录位置,不同的path选项影响如下↓ 

docBase="/usr/local/tomcat/webapps/xue" path=""
http://www.xue.com:8080/test/abc.html     →    /usr/local/tomcat/webapps/xue/test/abc.html 
 

docBase="/usr/local/tomcat/webapps/xue" path="/test"    #当网址访问/test目录,转到/usr/local/tomcat/webapps/xue
http://www.xue.com:8080/test/abc.html     →    /usr/local/tomcat/webapps/xue/abc.html

----------------------------------------------------------------------------------------------------------
Host 
name:主机名
appBase:Tomcat程序工作目录,即存放web应用程序的目录;相对路径为webapps,绝对路径为 /usr/local/tomcat/webapps
unpackWARs:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true
autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true
xmlValidation:是否验证xml文件执行有效性检验的标志
xmlNamespaceAware:是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验

Context
docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;
path:相对于Web服务器根路径而言的URI;如果为空"",则表示为此webapp的根路径 / ;
reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false
----------------------------------------------------------------------------------------------------------

重启服务 

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

3.客户端浏览器访问验证

echo "192.168.80.101 www.xue.com www.benet.com" >> /etc/hosts

浏览器访问 http://www.xue.com:8080/   页面显示This is xue page\!
浏览器访问 http://www.benet.com:8080/   页面显示This is benet page\! 

----------------------------------------------------------------------------------------------------------
HTTP 请求过程:
(1)Connector 连接器监听的端口是 8080。由于请求的端口和监听的端口一致,连接器接受了该请求。
(2)因为引擎的默认虚拟主机是 www.xue.com,并且虚拟主机的目录是webapps。所以请求找到了 tomcat/webapps 目录。
(3)访问的路径为根路径,URI 为空,即空是 Web 程序的应用名,也就是 context。此时请求找到 /usr/local/tomcat/webapps/xue 目录,解析 index.jsp 并返回。
----------------------------------------------------------------------------------------------------------

---------------------Tomcat多实例部署---------------------

虚拟主机在指定的资源内运行多个站点服务(资源少并发小使用),而多实例则提供更多的连接数。(资源多并发大使用)

1.安装好 jdk

2.安装 两个 tomcat服务 到不同目录

cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2

3.编写脚本,定义两个tomcat服务定义两个路径  设置环境变量

这里是将不同的路径写入两个服务器不同的CATALINA_HOME等变量

以便下面第五步启停脚本中直接调用(如果路径有更改,直接更改tomcat.sh即可,无需在start.sh更改)当然这一步不做,在第五步的启停脚本中直接写路径也行。

vim /etc/profile.d/tomcat.sh

#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1

#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2

 运行脚本刷新变量

source /etc/profile.d/tomcat.sh

4.修改 tomcat2 中的 server.xml 文件中的 三个 端口号  8080  8005  8009,要求各 tomcat 实例配置不能有重复的端口号

vim /usr/local/tomcat/tomcat2/conf/server.xml

<Server port="8006" shutdown="SHUTDOWN">        #22行,修改Server prot,默认为8005 -> 修改为8006
<Connector port="8081" protocol="HTTP/1.1"        #69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />    #116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010

----------------------------------------------------------------------------------------------------------
第一个连接器默认监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
第二个连接器默认监听8009端口,AJP端口,即容器使用,如Apache能通过AJP协议访问Tomcat的8009端口。
----------------------------------------------------------------------------------------------------------

tcp 8080     负责处理http请求连接      8443   负责处理https请求连接
      8005     关闭tomcat服务使用
      8009     AJP协议端口,与apache连接使用,apache可通过AJP协议访问tomcat的8009端口

5.修改各 tomcat 实例中的启动停止脚本 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量 export CATALINA_HOME  CATALINA_BASE  TOMCAT_HOME 都指向实例自己的工作目录

不同的Tomcat服务启动需要指定不同的环境变量路径,以区分开来。

这里引用第三步中预先写好的环境变量的路径的值。当然直接写相应的路径也可以,区分开即可。

更改Tomcat 实例1的启停配置中环境变量,指定自己所在的目录

vim /usr/local/tomcat/tomcat1/bin/startup.sh

# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
vim /usr/local/tomcat/tomcat1/bin/shutdown.sh

# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1

更改Tomcat 实例2的启停配置中环境变量,指定自己所在的目录

vim /usr/local/tomcat/tomcat2/bin/startup.sh

# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下内容
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
vim /usr/local/tomcat/tomcat2/bin/shutdown.sh

# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2

6.启动各 tomcat 中的 /bin/startup.sh 

/usr/local/tomcat/tomcat1/bin/startup.sh
/usr/local/tomcat/tomcat2/bin/startup.sh

netstat -natp | grep java

7.浏览器访问测试

http://192.168.80.101:8080
http://192.168.80.101:8081

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

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

相关文章

Linux教程——常见Linux发行版本有哪些?

新手往往会被 Linux 众多的发行版本搞得一头雾水&#xff0c;我们首先来解释一下这个问题。 从技术上来说&#xff0c;李纳斯•托瓦兹开发的 Linux 只是一个内核。内核指的是一个提供设备驱动、文件系统、进程管理、网络通信等功能的系统软件&#xff0c;内核并不是一套完整的…

DDD领域模型

一、分层介绍 controller层&#xff1a;处理页面或者api请求的输入输出&#xff0c;定义VO(REQ,RES)&#xff0c;没有业务逻辑&#xff0c;只做请求处理和下层逻辑接application层&#xff1a;处理跨领域domain的复杂逻辑&#xff0c;定义DTOdomain层&#xff1a;领域核心逻辑…

深入理解Qt多线程编程:QThread、QTimer与QAudioOutput的内在联系__QObject的主线程的事件循环

深入理解Qt多线程编程&#xff1a;QThread、QTimer与QAudioOutput的内在联系__QObject的主线程的事件循环 1. Qt多线程编程的基础1.1 QObject和线程&#xff08;QObject and Threads&#xff09;1.2 QThread的使用和理解&#xff08;Understanding and Using QThread&#xff0…

C#,码海拾贝(35)——求“实对称矩阵““特征值与特征向量“的“雅可比法“之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

编码器 | 基于 Transformers 的编码器-解码器模型

基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器模型的历史&#xff0c;更多背景知识&#xff0c;建议读者阅读由 Sebastion Ruder 撰写的这篇精彩 博文。此外&#xff0c;建议读者对 自注意力 (…

【AUTOSAR】Bootloader说明(一)---- 时序流程

电机控制器选用TI TMS28xx DSP&#xff0c;包括boot-loader与应用软件两个部分。其中boot-loader包括下列内容&#xff1a; RAM自检应用程序有效性检查UDS命令处理FLASH操作 下面分别说明DSP上电后整个软件运行流程及程序刷新过程。 DSP软件执行流程 DSP复位后&#xff0c;将…

【Mysql基础】-关于常用的函数简单案例

目录 一、系统函数 二、日期函数 三、字符串函数数 说明&#xff1a;以下所有的操作在8.0的mysql数据库操作系统上操作 一、系统函数 1 显示连接列表&#xff1a;show PROCESSLIST; 2 MD5加密&#xff1a;select MD5("root") 二、日期函数 1、 推算一周之后的…

QMI8658 - 姿态传感的零偏(常值零偏)标定

1. 零偏 理论上在静止状态下三轴输出为0,0,0&#xff0c;但实际上输出有一个小的偏置&#xff0c;这是零偏的静态分量&#xff08;也称固定零偏&#xff09;。 陀螺生产出来后就一直固定不变的零偏值。对于传统的高性能惯性器件来说&#xff0c;该误差在出厂标定时往往就被补偿…

《水经注地图服务》用户如何登录?

《水经注地图服务》&#xff08;WeServer&#xff09;是一款可快速发布全国乃至全球海量卫星影像的地图发布服务产品&#xff0c;该产品完全遵循OGC相关协议标准&#xff0c;是一个基于若干项目成功经验总结的产品。它可以轻松发布100TB级海量卫星影像&#xff0c;从而使“在内…

如何使用 Raycast 一键打开预设工作环境

工作中&#xff0c;你一定遇到过这样的场景&#xff1a;你正在认真写代码&#xff0c;线上突然出现报警。看到报警信息之后&#xff0c;你不得不打开浏览器&#xff0c;点开收藏夹&#xff0c;打开监控页面、告警页面、trace 页面、日志搜索平台……有时&#xff0c;还需要打开…

chatgpt赋能python:Python取值:了解基础知识和应用方法

Python取值&#xff1a;了解基础知识和应用方法 什么是Python取值&#xff1f; Python取值是指从一个对象中获取信息或者值。对象可以包括列表、字典、元组、变量等。Python提供了多种方法来取值&#xff0c;包括基础的索引和切片操作&#xff0c;以及高级的列表推导式、字典…

MySQL JDBC详解

文章目录 简介JDBC APIJDBC Driver ManagerJDBC 驱动 JDBC 开发步骤一&#xff0c;导入 JDBC 驱动包&#xff0c;并加载驱动类二&#xff0c;建立数据库连接三&#xff0c;发送 SQL 语句&#xff0c;并获取执行结果Statement 对象PreparedStatement 对象 四&#xff0c;处理返回…

ADAS方案的简单比较

ADAS方案的简单比较 1 概述2 厂商Tesla硬件布局网络基础结构&#xff1a;HydraNet多头网络 NVIDIA百度&#xff08;Apollo&#xff09;版本历史硬件布局软件框架各版本框架 WaymoVolvo-Uber 3 芯片4 其他from [最全自动驾驶技术架构和综述](https://blog.csdn.net/buptgshengod…

项目质量管理

质量与项目质量 质量的定义&#xff1a;一组固有特征满足要求的程序。 质量是反应实体主题明确和隐含需求的能力的特性总和 质量与等级的关系&#xff1a; 一个低等级&#xff08;功能有限&#xff09;&#xff0c;高质量&#xff08;无明显缺陷&#xff0c;用户手册易读&am…

《Datawhale南瓜书》出第二版啦!

Datawhale干货 作者&#xff1a;Datawhale开源项目团队 作为机器学习的入门经典教材&#xff0c;周志华老师的《机器学习》&#xff0c;自2016年1月底出版以来&#xff0c;首印5000册一周售罄&#xff0c;并在8个月内重印9次。先后登上了亚马逊&#xff0c;京东&#xff0c;当…

【运维知识进阶篇】iptables防火墙详解

这篇文章给大家介绍下iptables防火墙&#xff0c;防火墙大致分三种&#xff0c;分别是硬件、软件和云防火墙。硬件的话部署在企业网络的入口&#xff0c;有三层路由的H3C、华为、Cisco&#xff08;思科&#xff09;&#xff0c;还有深信服等等&#xff1b;软件的话一般是开源软…

【服务器】iPad远程服务器进行开发

文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7. ipad远…

人工智能 AI | ChatGPT 时代,程序员的生存之道

ChatGPT 近期炙手可热&#xff0c;仿佛没有什么问题是它不能解决的。出于对 ChatGPT 的好奇&#xff0c;我们决定探索下它对于前端开发人员来讲&#xff0c;是作为辅助工具多一些&#xff0c;还是主力工具更多一些&#xff1f; 2D 能力测试 我们就挑选一个著名的递归回溯问题—…

代码随想录算法训练营第三十九天|62.不同路径|63. 不同路径 II

LeetCode62.不同路径 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp[i][j]条不同的路径。 2&#xff0c…

cpu飚高的排查思路

cpu的衡量指标 使用率util&#xff1a;代表的是单位时间内CPU繁忙情况的统计。操作系统对cpu的管理就是利用周期的tick时钟中断&#xff0c;将cpu的使用划分时间片。每个时间片内去执行不同进程/线程里的代码。所以cpu的使用率统计其实也是以tick为单位的&#xff1a;统计周期…