[{"content":"这里是 Atovk 的个人技术笔记站。写作主要围绕自己实际折腾过、查证过或反复用到的内容：Linux 与容器、Java 工程实践、MySQL、Redis、Elasticsearch、Kudu、分布式系统、云服务、homelab 网络，以及一些读书记录。\n我希望这里的文章少一点空泛结论，多一点可复查的过程：问题背景、环境约束、命令或配置、踩坑点，以及下次还能继续用上的判断依据。\n你也可以从 归档 按时间浏览，或用 标签 和 搜索 找具体主题。\n找到我 GitHub · @atovk RSS 订阅 按分类浏览 ","permalink":"https://ohoo.dev/about/","summary":"\u003cp\u003e这里是 Atovk 的个人技术笔记站。写作主要围绕自己实际折腾过、查证过或反复用到的内容：Linux 与容器、Java 工程实践、MySQL、Redis、Elasticsearch、Kudu、分布式系统、云服务、homelab 网络，以及一些读书记录。\u003c/p\u003e","title":"关于"},{"content":"项目概述 本指南详细介绍了基于Proxmox VE (PVE)虚拟化平台的家庭实验室网络架构设计与实施方案，致力于构建一个简单、安全、可靠的网络环境。通过合理的网络分段、安全策略和容器化部署，实现高效的资源管理和服务隔离。\n网络环境架构设计 整体网络拓扑 graph TB A[光猫] --\u003e B[Netgate 安全网关] B --\u003e C[管理网段 192.168.10.0/24] B --\u003e D[DMZ区域 192.168.11.0/24] C --\u003e E[PVE 主机 192.168.10.33] E --\u003e F[基础服务VM192.168.12.0/24] E --\u003e G[应用服务VM192.168.13.0/24] E --\u003e H[AI服务VM192.168.14.0/24] D --\u003e I[对外服务Web/API]网络分段策略 1 2 3 4 5 6 7 # 建议统一网络命名规范 networks: mgmt: 192.168.10.0/24 # 管理网络 dmz: 192.168.11.0/24 # DMZ区域 base: 192.168.12.0/24 # 基础服务 app: 192.168.13.0/24 # 应用服务 ai: 192.168.14.0/24 # AI服务 1. 管理网段 (192.168.10.0/24) 用途: PVE主机管理、路由器管理、网络设备 安全级别: 高 访问控制: 仅管理员网络访问 设备: PVE主机: 192.168.10.33 网关: 192.168.10.2 DNS: 114.114.114.114, 8.8.8.8 2. DMZ区域 (192.168.11.0/24) 用途: 对外提供服务的资源 安全级别: 中 访问控制: 有限的外网访问 服务: Web服务、API网关、反向代理 3. 基础服务网段 (192.168.12.0/24) 用途: 数据库、DDNS、监控等基础设施 安全级别: 高 访问控制: 仅内网访问 服务: 数据库集群 DDNS服务 监控系统 日志收集 4. 应用服务网段 (192.168.13.0/24) 用途: 日常应用服务 安全级别: 中 访问控制: 内网 + 受控外网访问 服务: 笔记系统 日历应用 文件存储 媒体服务 5. AI服务网段 (192.168.14.0/24) 用途: AI模型、机器学习环境 安全级别: 中 访问控制: 内网访问 服务: Jupyter Lab Ollama AI模型 GPU计算资源 安全策略设计 防火墙规则 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # Netgate防火墙规则示例 rules: # 管理网段保护 - from: any to: 192.168.10.0/24 ports: [22, 8006] action: allow condition: source_in_admin_network # 服务间通信 - from: 192.168.13.0/24 to: 192.168.12.0/24 ports: [3306, 5432, 6379] action: allow # DMZ访问控制 - from: internet to: 192.168.11.0/24 ports: [80, 443] action: allow # 默认拒绝 - from: any to: any action: deny 网络隔离措施 VLAN隔离: 不同服务网段使用独立VLAN 微分段: 容器间网络隔离 访问控制列表: 精确控制服务间通信 流量监控: 实时监控异常网络行为 高可用性设计 1. 网络冗余 双网卡绑定(Bond)提供链路冗余 多路径网络确保服务连续性 2. 服务冗余 关键服务多实例部署 负载均衡分散请求压力 自动故障转移机制 3. 数据备份 定期数据备份到外部存储 配置文件版本控制 灾难恢复预案 网络监控与管理 监控指标 网络带宽使用率 连接数统计 延迟监测 安全事件告警 管理工具 PVE Web界面统一管理 Prometheus + Grafana监控 ELK日志分析 自动化部署脚本 网络配置建议 PVE网络桥接配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # 创建网络桥接 auto vmbr0 iface vmbr0 inet static address 192.168.10.33/24 gateway 192.168.10.2 bridge-ports ens18 bridge-stp off bridge-fd 0 # 服务专用网桥 auto vmbr1 iface vmbr1 inet static address 192.168.12.1/24 bridge-ports none bridge-stp off bridge-fd 0 auto vmbr2 iface vmbr2 inet static address 192.168.13.1/24 bridge-ports none bridge-stp off bridge-fd 0 auto vmbr3 iface vmbr3 inet static address 192.168.14.1/24 bridge-ports none bridge-stp off bridge-fd 0 安全加固建议 网络访问控制\n启用SSH密钥认证，禁用密码登录 配置fail2ban防止暴力破解 定期更新安全补丁 服务隔离\n使用Docker网络隔离容器 最小权限原则分配资源 定期安全审计 数据保护\n启用磁盘加密 配置定期备份策略 实施访问日志记录 性能优化建议 网络优化\n启用网卡中断负载均衡 调整TCP缓冲区大小 配置网络队列优化 存储优化\n使用SSD存储系统盘 配置适当的I/O调度器 启用存储缓存策略 操作系统准备 软件更新 1 2 3 4 sudo apt-get update \u0026amp;\u0026amp; \\ sudo apt-get install g++ \u0026amp;\u0026amp; \\ sudo apt-get install gcc \u0026amp;\u0026amp; \\ sudo apt-get install make 磁盘配置 1 sudo lvresize -l +85%FREE /dev/mapper/ubuntu--vg-ubuntu--lv 网络设置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 network: version: 2 ethernets: ens18: dhcp4: no # 关闭IPV4 DHCP dhcp6: no # 关闭IPV6 DHCP addresses: - 192.168.10.33/24 # IP routes: - to: default via: 192.168.10.2 # 网关 nameservers: # DNS addresses: - 114.114.114.114 - 8.8.8.8 网络存储配置 1 2 3 4 5 6 7 8 sudo mount -t cifs //192.168.10.2/kaken /mnt/ndisk # 自动加载 mount sudo vim /etc/fstab //192.168.10.2/kaken /mnt/ndisk cifs guest,uid=1000,gid=1000,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0 sudo mount -t cifs //192.168.10.2/kaken /mnt/ndisk -o guest,uid=$(id -u),gid=$(id -g) Docker 安装配置 参考：Docker官方安装文档\n卸载已存在的 Docker 卸载 Docker Engine, CLI, containerd 和 Docker Compose 包： 1 sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras 删除所有镜像、容器和数据卷： 1 2 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd 移除源列表和密钥： 1 2 sudo rm /etc/apt/sources.list.d/docker.list sudo rm /etc/apt/keyrings/docker.asc 注意: 需要手动删除任何编辑过的配置文件。\n安装 卸载所有包配置 1 2 # uninstall all conflicting packages for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done 使用 apt 安装 添加 Docker 官方 GPG key 1 2 3 4 5 sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc 添加 Docker 源 1 2 3 4 5 echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \\ $(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;${UBUNTU_CODENAME:-$VERSION_CODENAME}\u0026#34;) stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null sudo apt-get update 安装 Docker 包 1 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin hello-world 镜像运行验证 1 sudo docker run hello-world 配置源 + nvidia-container-runtime 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 sudo tee /etc/docker/daemon.json \u0026lt;\u0026lt;-\u0026#39;EOF\u0026#39; { \u0026#34;registry-mirrors\u0026#34;: [ \u0026#34;https://docker.m.daocloud.io\u0026#34;, \u0026#34;https://docker.ducust.site\u0026#34;, \u0026#34;https://ghcr.io\u0026#34;, \u0026#34;http://mirror.azure.cn\u0026#34;, \u0026#34;https://dockerpull.org\u0026#34; ], \u0026#34;runtimes\u0026#34;: { \u0026#34;nvidia\u0026#34;: { \u0026#34;args\u0026#34;: [], \u0026#34;path\u0026#34;: \u0026#34;nvidia-container-runtime\u0026#34; } } } EOF 容器服务安装与网络配置 网络安全配置 在部署容器服务前，建议先配置Docker网络安全策略：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 创建自定义网络 docker network create --driver bridge \\ --subnet=192.168.12.0/24 \\ --gateway=192.168.12.1 \\ base-network docker network create --driver bridge \\ --subnet=192.168.13.0/24 \\ --gateway=192.168.13.1 \\ app-network docker network create --driver bridge \\ --subnet=192.168.14.0/24 \\ --gateway=192.168.14.1 \\ ai-network 基础服务部署 (BASE) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 # 创建基础服务网络 docker network create base-services # 自动更新看门狗 - 限制网络访问 docker run --detach \\ --name watchtower \\ --network base-services \\ --volume /var/run/docker.sock:/var/run/docker.sock \\ --restart always \\ -e WATCHTOWER_CLEANUP=true \\ -e WATCHTOWER_SCHEDULE=\u0026#34;0 0 2 * * *\u0026#34; \\ containrrr/watchtower --interval 1800 --cleanup # PostgreSQL 数据库 - 内网访问 docker run -d \\ --name postgres \\ --network base-services \\ --restart unless-stopped \\ -e POSTGRES_DB=homelab \\ -e POSTGRES_USER=admin \\ -e POSTGRES_PASSWORD=secure_password \\ -v postgres_data:/var/lib/postgresql/data \\ postgres:15-alpine # Redis 缓存 - 内网访问 docker run -d \\ --name redis \\ --network base-services \\ --restart unless-stopped \\ -v redis_data:/data \\ redis:7-alpine redis-server --appendonly yes # 监控系统 Prometheus docker run -d \\ --name prometheus \\ --network base-services \\ --restart unless-stopped \\ -p 9090:9090 \\ -v prometheus_config:/etc/prometheus \\ -v prometheus_data:/prometheus \\ prom/prometheus 应用服务部署 (APP) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 # 创建应用服务网络 docker network create app-services # 自动更新看门狗 docker run --detach \\ --name watchtower-app \\ --network app-services \\ --volume /var/run/docker.sock:/var/run/docker.sock \\ --restart always \\ containrrr/watchtower --interval 1800 --cleanup # DDNS ddns-go 服务 - 安全配置 docker run -d \\ --name ddns-go \\ --restart=always \\ --network app-services \\ -p 9876:9876 \\ -v ~/ddns-go:/root \\ -e DDNS_PROVIDER=cloudflare \\ ghcr.io/jeessy2/ddns-go # 反向代理服务 sudo docker run -d \\ --name zoraxy \\ --restart unless-stopped \\ --network app-services \\ --add-host=host.docker.internal:host-gateway \\ -p 80:80 \\ -p 443:443 \\ -p 8000:8000 \\ -v /home/atovk/zoraxy/config/:/opt/zoraxy/config/ \\ -v /home/atovk/zoraxy/plugin/:/opt/zoraxy/plugin/ \\ -v /var/run/docker.sock:/var/run/docker.sock \\ -v /etc/localtime:/etc/localtime \\ -e FASTGEOIP=\u0026#34;true\u0026#34; \\ zoraxydocker/zoraxy:latest AI服务部署 (AI) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 # 创建AI服务网络 docker network create ai-services # 自动更新看门狗 docker run --detach \\ --name watchtower-ai \\ --network ai-services \\ --volume /var/run/docker.sock:/var/run/docker.sock \\ --restart always \\ containrrr/watchtower --interval 1800 --cleanup # Ollama - GPU支持与安全配置 docker run -d \\ --gpus=all \\ --name ollama \\ --network ai-services \\ --restart unless-stopped \\ -v /mnt/ndisk/.ollama:/root/.ollama \\ -p 11434:11434 \\ -e OLLAMA_HOST=0.0.0.0 \\ ollama/ollama # Jupyter Lab - 安全配置 docker run -d \\ --name jupyter \\ --network ai-services \\ --restart unless-stopped \\ -p 8888:8888 \\ -v jupyter_data:/home/jovyan/work \\ -e JUPYTER_ENABLE_LAB=yes \\ -e JUPYTER_TOKEN=secure_token_here \\ jupyter/tensorflow-notebook:latest # Open WebUI - Ollama前端界面 docker run -d \\ --name open-webui \\ --network ai-services \\ --restart unless-stopped \\ -p 3001:8080 \\ -v open_webui_data:/app/backend/data \\ -e OLLAMA_BASE_URL=http://ollama:11434 \\ ghcr.io/open-webui/open-webui:main # 获取AI模型 - 安全下载 docker exec -it ollama ollama pull qwen2.5:latest docker exec -it ollama ollama pull llama3.2:latest docker exec -it ollama ollama pull nomic-embed-text:latest # 测试API连接 - 内网访问 curl http://localhost:11434/api/chat -d \u0026#39;{ \u0026#34;model\u0026#34;: \u0026#34;qwen2.5\u0026#34;, \u0026#34;messages\u0026#34;: [ { \u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;请介绍一下网络安全的重要性\u0026#34; } ] }\u0026#39; 网络安全监控 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 网络流量监控 docker run -d \\ --name netdata \\ --restart unless-stopped \\ --network host \\ -v /proc:/host/proc:ro \\ -v /sys:/host/sys:ro \\ -v /var/run/docker.sock:/var/run/docker.sock:ro \\ --cap-add SYS_PTRACE \\ --security-opt apparmor=unconfined \\ netdata/netdata # 容器安全扫描 docker run --rm \\ -v /var/run/docker.sock:/var/run/docker.sock \\ aquasec/trivy image --severity HIGH,CRITICAL ollama/ollama 网络安全最佳实践 定期维护任务 1. 安全更新 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 系统更新脚本 #!/bin/bash # update_system.sh # 更新系统包 sudo apt update \u0026amp;\u0026amp; sudo apt upgrade -y # 更新Docker镜像 docker images --format \u0026#34;table {{.Repository}}:{{.Tag}}\u0026#34; | \\ grep -v \u0026#34;REPOSITORY\u0026#34; | \\ xargs -I {} docker pull {} # 清理无用镜像 docker image prune -f # 检查容器健康状态 docker ps --format \u0026#34;table {{.Names}}\\t{{.Status}}\\t{{.Ports}}\u0026#34; 2. 备份策略 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 自动备份脚本 #!/bin/bash # backup_config.sh BACKUP_DIR=\u0026#34;/mnt/ndisk/backups/$(date +%Y-%m-%d)\u0026#34; mkdir -p $BACKUP_DIR # 备份Docker配置 docker run --rm -v docker_volumes:/volumes \\ -v $BACKUP_DIR:/backup alpine \\ tar czf /backup/docker_volumes.tar.gz -C /volumes . # 备份网络配置 cp /etc/netplan/*.yaml $BACKUP_DIR/ cp /etc/docker/daemon.json $BACKUP_DIR/ # 备份PVE配置 cp -r /etc/pve $BACKUP_DIR/ 2\u0026gt;/dev/null || true echo \u0026#34;备份完成: $BACKUP_DIR\u0026#34; 3. 监控告警 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 系统监控脚本 #!/bin/bash # monitor_system.sh # 检查磁盘使用率 DISK_USAGE=$(df / | awk \u0026#39;NR==2 {print $5}\u0026#39; | sed \u0026#39;s/%//\u0026#39;) if [ $DISK_USAGE -gt 80 ]; then echo \u0026#34;警告: 磁盘使用率超过80%: $DISK_USAGE%\u0026#34; fi # 检查内存使用 MEM_USAGE=$(free | awk \u0026#39;NR==2 {printf \u0026#34;%.0f\u0026#34;, $3/$2*100}\u0026#39;) if [ $MEM_USAGE -gt 85 ]; then echo \u0026#34;警告: 内存使用率超过85%: $MEM_USAGE%\u0026#34; fi # 检查容器状态 UNHEALTHY=$(docker ps --filter \u0026#34;health=unhealthy\u0026#34; -q | wc -l) if [ $UNHEALTHY -gt 0 ]; then echo \u0026#34;警告: 有 $UNHEALTHY 个容器状态异常\u0026#34; fi 故障排除指南 网络连接问题 检查网络配置\n1 2 3 4 5 6 7 8 # 检查网络接口 ip addr show # 检查路由表 ip route show # 测试网络连通性 ping -c 3 192.168.10.2 Docker网络问题\n1 2 3 4 5 6 7 8 # 查看Docker网络 docker network ls # 检查容器网络配置 docker inspect \u0026lt;container_name\u0026gt; | grep -A 10 NetworkSettings # 重建Docker网络 docker network prune 容器服务问题 查看容器日志\n1 docker logs -f \u0026lt;container_name\u0026gt; 重启服务\n1 docker restart \u0026lt;container_name\u0026gt; 资源使用检查\n1 docker stats 扩展建议 1. 高级安全配置 部署Web应用防火墙(WAF) 配置入侵检测系统(IDS) 实施零信任网络架构 2. 性能优化 使用CDN加速静态资源 配置数据库读写分离 实施缓存策略优化 3. 可观测性增强 部署APM性能监控 配置分布式链路追踪 实施日志聚合分析 总结 本指南提供了一个完整的家庭实验室网络架构设计方案，重点关注：\n简单性: 清晰的网络分段和标准化的部署流程 安全性: 多层次的安全防护和访问控制 可靠性: 冗余设计和自动化运维 通过遵循这些设计原则和最佳实践，您可以构建一个稳定、安全、易于管理的家庭实验室环境。记住定期备份配置文件、更新系统补丁，并监控系统运行状态，以确保环境的长期稳定运行。\n最后更新: 2025年8月\n","permalink":"https://ohoo.dev/post/homelab/homelab-network-architecture-guide/","summary":"\u003ch2 id=\"项目概述\"\u003e项目概述\u003c/h2\u003e\n\u003cp\u003e本指南详细介绍了基于Proxmox VE (PVE)虚拟化平台的家庭实验室网络架构设计与实施方案，致力于构建一个简单、安全、可靠的网络环境。通过合理的网络分段、安全策略和容器化部署，实现高效的资源管理和服务隔离。\u003c/p\u003e","title":"家庭实验室网络架构设计与搭建指南"},{"content":"1. 网络中心性的重要性 核心问题：如何衡量网络中的中心人物或网红（如网页排名、社交媒体影响力）。 实际案例： Klout网站：通过算法计算用户影响力评分，但因争议（如巴菲特评分仅36）于2018年关闭，反映影响力评估的复杂性。 中国社会信用体系：基于社交媒体行为数据对个人信用评分，影响实际生活（如出行限制）。 2. 度中心性（Degree Centrality） 定义：节点的度数（即连接的边数）直接反映其在网络中的重要性。 入度（In-Degree）：指向该节点的边数，代表声望（如被点赞次数）。 出度（Out-Degree）：该节点指向其他节点的边数，代表合群性（如主动点赞他人）。 归一化处理： 按最大可能度数：度数除以节点总数减一（(n-1)），结果范围为(0 \\sim 1)。 按实际最大度数：度数除以当前图中的最大度数。 按总度数：度数除以总边数的两倍（(2m)）。 3. 有向图与无向图的度中心性 有向图：需区分入度和出度，入度更能反映影响力（如社交网络中被关注数）。 示例：某节点入度3、出度2，归一化后入度中心性为(3/(n-1))。 无向图：度数为无向边数，直接计算归一化值。 示例：某节点度数5，归一化后中心性为(5/(n-1))。 4. 实际案例分析 有向图示例： 节点A入度1、出度3，归一化出度为(3/6 = 0.5)。 节点C入度2、出度3，归一化出度为(3/6 = 0.5)，与A并列第一。 无向图示例： 节点C度数5，归一化中心性为(5/6 \\approx 0.83)，排名第一。 5. 度中心性的局限性 忽略连接质量：仅关注数量，未考虑边的权重或影响力（如PageRank算法通过链接质量排序）。 规模敏感性：不同规模网络的度数绝对值无法直接比较，需依赖归一化。 6. 社交媒体应用 数据收集与商业价值：社交媒体平台通过用户行为数据（如点赞、评论）分析影响力，用于精准营销。 未来方向：需结合其他中心性指标（如介数中心性、特征向量中心性）以更全面评估节点重要性。 总结：度中心性是衡量网络中心性的基础方法，通过节点度数和归一化处理可快速评估影响力。但其局限性需结合其他方法改进，以适应复杂网络场景。\n","permalink":"https://ohoo.dev/post/asu/cse598/network_centrality/","summary":"\u003ch3 id=\"1-网络中心性的重要性\"\u003e\u003cstrong\u003e1. 网络中心性的重要性\u003c/strong\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e核心问题\u003c/strong\u003e：如何衡量网络中的中心人物或网红（如网页排名、社交媒体影响力）。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e实际案例\u003c/strong\u003e：\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eKlout网站\u003c/strong\u003e：通过算法计算用户影响力评分，但因争议（如巴菲特评分仅36）于2018年关闭，反映影响力评估的复杂性。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e中国社会信用体系\u003c/strong\u003e：基于社交媒体行为数据对个人信用评分，影响实际生活（如出行限制）。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"2-度中心性degree-centrality\"\u003e\u003cstrong\u003e2. 度中心性（Degree Centrality）\u003c/strong\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e定义\u003c/strong\u003e：节点的度数（即连接的边数）直接反映其在网络中的重要性。\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e入度（In-Degree）\u003c/strong\u003e：指向该节点的边数，代表声望（如被点赞次数）。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e出度（Out-Degree）\u003c/strong\u003e：该节点指向其他节点的边数，代表合群性（如主动点赞他人）。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e归一化处理\u003c/strong\u003e：\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e按最大可能度数\u003c/strong\u003e：度数除以节点总数减一（(n-1)），结果范围为(0 \\sim 1)。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e按实际最大度数\u003c/strong\u003e：度数除以当前图中的最大度数。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e按总度数\u003c/strong\u003e：度数除以总边数的两倍（(2m)）。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"3-有向图与无向图的度中心性\"\u003e\u003cstrong\u003e3. 有向图与无向图的度中心性\u003c/strong\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e有向图\u003c/strong\u003e：需区分入度和出度，入度更能反映影响力（如社交网络中被关注数）。\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e示例\u003c/strong\u003e：某节点入度3、出度2，归一化后入度中心性为(3/(n-1))。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e无向图\u003c/strong\u003e：度数为无向边数，直接计算归一化值。\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e示例\u003c/strong\u003e：某节点度数5，归一化后中心性为(5/(n-1))。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"4-实际案例分析\"\u003e\u003cstrong\u003e4. 实际案例分析\u003c/strong\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e有向图示例\u003c/strong\u003e：\n\u003cul\u003e\n\u003cli\u003e节点A入度1、出度3，归一化出度为(3/6 = 0.5)。\u003c/li\u003e\n\u003cli\u003e节点C入度2、出度3，归一化出度为(3/6 = 0.5)，与A并列第一。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e无向图示例\u003c/strong\u003e：\n\u003cul\u003e\n\u003cli\u003e节点C度数5，归一化中心性为(5/6 \\approx 0.83)，排名第一。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"5-度中心性的局限性\"\u003e\u003cstrong\u003e5. 度中心性的局限性\u003c/strong\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e忽略连接质量\u003c/strong\u003e：仅关注数量，未考虑边的权重或影响力（如PageRank算法通过链接质量排序）。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e规模敏感性\u003c/strong\u003e：不同规模网络的度数绝对值无法直接比较，需依赖归一化。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"6-社交媒体应用\"\u003e\u003cstrong\u003e6. 社交媒体应用\u003c/strong\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e数据收集与商业价值\u003c/strong\u003e：社交媒体平台通过用户行为数据（如点赞、评论）分析影响力，用于精准营销。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e未来方向\u003c/strong\u003e：需结合其他中心性指标（如介数中心性、特征向量中心性）以更全面评估节点重要性。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e总结\u003c/strong\u003e：度中心性是衡量网络中心性的基础方法，通过节点度数和归一化处理可快速评估影响力。但其局限性需结合其他方法改进，以适应复杂网络场景。\u003c/p\u003e","title":"Network Centrality"},{"content":"Linux Bond技术详解：模式、要求及配置指南 Linux Bond技术是一种将多个物理网络接口绑定为一个逻辑接口的网络虚拟化技术，能够提供网络冗余、负载均衡和带宽叠加等功能。Bond技术通过内核 bonding模块实现，将多个物理网卡虚拟为一个逻辑网卡（如bond0），对外呈现为单一网络接口，具有统一的MAC地址和IP地址。这种技术在生产环境中广泛应用于服务器、存储设备和网络设备，以提高网络连接的可用性和性能。本文将详细解析七种Bond模式的工作原理、适用场景、对交换机的要求以及配置方法。\n一、Bond技术的基本概念与作用 Bond技术的核心是在Linux内核层面创建一个虚拟网络接口，将多个物理网卡（如eth0、eth1）绑定到这个虚拟接口上。通过不同的绑定模式，Bond可以实现高可用性、负载均衡和带宽叠加等功能。当物理网卡出现故障时，Bond能够自动切换到备用网卡，确保网络连接的连续性；在负载均衡模式下，Bond可以将流量分发到多个物理网卡上，提高网络吞吐量；在带宽叠加模式下，Bond可以将多个物理网卡的带宽合并，提供更高的网络传输能力。\nBond技术主要有以下应用场景：\n服务器高可用：通过主备模式（mode=1），确保服务器在网络故障时仍能保持连接，适用于关键业务服务器。 网络负载均衡：通过轮询（mode=0）、XOR哈希（mode=2）或自适应（mode=5/6）模式，将流量分发到多个网卡上，提高网络吞吐量。 带宽叠加：在需要高带宽的应用场景（如大数据传输、虚拟化迁移）中，通过聚合多个网卡的带宽，提供更高的网络传输能力。 容错与冗余：在金融、电信等对网络可靠性要求极高的行业，通过广播模式（mode=3）或主备模式（mode=1），确保网络连接的高可靠性。 二、七种Bond模式的工作原理与特点 Linux Bond技术提供了七种不同的工作模式，每种模式具有不同的流量分发策略和冗余机制。选择合适的Bond模式需要考虑网络需求、交换机兼容性和性能要求。下表详细对比了七种Bond模式的关键特性：\n模式 名称 流量分发策略 冗余机制 交换机要求 带宽叠加 负载均衡 适用场景 0 balance-rr (轮询模式) 按轮询顺序依次使用每个网卡 有 需要 是 是 需要带宽叠加和负载均衡的场景 1 active-backup (主备模式) 仅使用主网卡，备用网卡不活动 高 不需要 否 否 需要高可靠性的服务器 2 balance-xor (异或模式) 基于源MAC和目标MAC的异或结果选择网卡 有 需要 是 是 需要负载均衡的服务器 3 broadcast (广播模式) 所有数据包从所有网卡发送 最高 需要 否 否 对可靠性要求极高的金融行业 4 802.3ad (LACP模式) 基于传输哈希策略选择网卡 有 需要LACP支持 是 是 企业级网络环境，需要标准链路聚合 5 balance-tlb (传输负载均衡) 根据网卡负载动态选择发送网卡 有 不需要 否 是 需要传输方向负载均衡的场景 6 balance-alb (自适应负载均衡) 传输方向基于负载，接收方向通过ARP协商 有 不需要 否 是 需要双向负载均衡的场景 1. balance-rr (轮询模式) balance-rr模式（mode=0）采用轮询策略，依次使用每个绑定的网卡发送数据包。例如，第一个数据包从eth0发送，第二个从eth1发送，第三个再回到eth0，依此类推。这种模式能够实现负载均衡和容错能力，当某个网卡故障时，流量会自动切换到其他可用网卡上。\n优势：\n流量分发均衡，最大化利用带宽 支持带宽叠加，多个网卡的总带宽可被使用 劣势：\n需要交换机支持端口聚合（如port channel） 数据包可能乱序到达，影响TCP性能 配置相对复杂 2. active-backup (主备模式) active-backup模式（mode=1）只有一个网卡处于活动状态，其他网卡作为备用。当主网卡故障时，备用网卡会自动接管，确保网络连接的连续性。这种模式提供高冗余性，但链路利用率较低，只有主网卡在工作。\n优势：\n配置简单，无需交换机特殊支持 冗余性高，故障切换迅速 MAC地址唯一，避免交换机混乱 劣势：\n带宽利用率低，只有主网卡在工作 不支持负载均衡 故障切换时会有短暂中断 3. balance-xor (异或模式) balance-xor模式（mode=2）基于源MAC地址和目标MAC地址的异或结果选择网卡。默认策略是(源MAC XOR 目标MAC) % 奴隶数量，但可以通过xmit_hash_policy选项指定其他策略。这种模式提供负载均衡和容错能力，适用于需要流量分发的场景。\n优势：\n流量分发基于哈希策略，适合特定流量模式 支持负载均衡和带宽叠加 提供冗余机制 劣势：\n需要交换机支持静态端口聚合 不同哈希策略可能影响流量分发效果 配置相对复杂 4. broadcast (广播模式) broadcast模式（mode=3）将所有数据包从所有绑定的网卡上发送。这种模式提供最高的冗余性，但不会提高带宽，反而会增加网络流量。广播模式适用于对可靠性要求极高的场景，如金融交易系统，但需要谨慎使用，因为可能会导致网络拥塞。\n优势：\n最高的冗余性，确保数据不丢失 无需复杂的负载均衡算法 适用于极端可靠性要求的场景 劣势：\n带宽没有提升，反而可能浪费 网络流量增加，可能导致交换机拥塞 配置复杂，需要交换机支持 5. 802.3ad (LACP模式) 802.3ad模式（mode=4）遵循IEEE 802.3ad标准，通过LACP协议与交换机协商动态链路聚合。这种模式需要交换机支持LACP协议，并且所有成员网卡必须工作在相同的速率和双工模式下。LACP模式在企业级网络环境中应用广泛，因为它提供了标准的链路聚合方法。\n优势：\n标准化实现，兼容性好 动态链路聚合，自动适应网络变化 提供负载均衡和冗余能力 支持带宽叠加 劣势：\n需要交换机支持LACP协议 所有成员网卡必须工作在相同速率和双工模式 配置相对复杂 6. balance-tlb (传输负载均衡) balance-tlb模式（mode=5）根据每个网卡的负载情况动态选择发送网卡。当某个网卡负载较高时，Bond驱动会优先使用负载较低的网卡发送数据。这种模式不需要交换机支持，但仅支持传输方向的负载均衡。\n优势：\n无需交换机特殊配置 动态调整发送流量，优化网络性能 提供冗余机制 劣势：\n仅支持传输方向的负载均衡 接收方向的负载均衡需要其他机制 不支持带宽叠加 7. balance-alb (自适应负载均衡) balance-alb模式（mode=6）在balance-tlb的基础上增加了接收负载均衡功能。通过ARP协商机制，Bond驱动可以将不同客户端的流量分配到不同的网卡上。这种模式不需要交换机支持，但实现起来相对复杂。\n优势：\n支持双向负载均衡，传输和接收方向 无需交换机特殊配置 提供冗余机制 动态调整流量分配，优化网络性能 劣势：\n接收负载均衡依赖于ARP协商机制 可能出现\u0026quot;一忙多闲\u0026quot;的情况 不支持带宽叠加 与某些网络设备可能存在兼容性问题 三、各模式对交换机的要求与兼容性 Bond技术的某些模式需要交换机端进行相应的配置才能正常工作。选择Bond模式时，必须考虑交换机的兼容性和配置要求，否则可能导致网络性能下降或连接中断。\n1. 需要交换机配置的模式 balance-rr（mode=0）、balance-xor（mode=2）、broadcast（mode=3）和802.3ad（mode=4）这四种模式需要交换机端进行相应的配置。这些模式通过在交换机上配置端口聚合，确保来自同一逻辑接口的数据包能够被正确处理。\nbalance-rr（mode=0）：需要交换机配置静态端口聚合（如port channel），否则数据包可能乱序到达，影响TCP性能。交换机端口应设置为相同速率和双工模式。\nbalance-xor（mode=2）：需要交换机配置静态端口聚合，并且可能需要设置特定的哈希策略（如基于源MAC或目标MAC）。不同交换机厂商可能有不同的配置方式。\nbroadcast（mode=3）：需要交换机配置端口聚合，避免广播风暴。交换机端口应设置为相同速率和双工模式。\n802.3ad（mode=4）：需要交换机支持LACP协议，并且配置为LACP模式。所有成员网卡必须工作在相同的速率和双工模式下。这是企业级网络中最常用的Bond模式之一。\n2. 无需交换机配置的模式 active-backup（mode=1）、balance-tlb（mode=5）和balance-alb（mode=6）这三种模式不需要交换机端进行特殊配置。这些模式通过软件实现冗余和负载均衡，对交换机的依赖较低，适合简单网络环境。\nactive-backup（mode=1）：仅需交换机识别单个MAC地址，无需端口聚合。这是最简单的Bond模式，适用于只需要冗余的场景。\nbalance-tlb（mode=5）：通过软件实现传输方向的负载均衡，根据网卡当前负载动态调整发送流量。无需交换机支持，但仅支持传输方向的负载均衡。\nbalance-alb（mode=6）：通过软件实现传输和接收方向的负载均衡，通过ARP协商机制将不同客户端的流量分配到不同网卡上。无需交换机支持，但实现机制相对复杂。\n3. 不同交换机厂商的配置差异 不同厂商的交换机对Bond模式的支持和配置方式有所不同：\nCisco交换机：使用EtherChannel技术实现端口聚合，配置命令包括channel-group和port-channel load-balance等。\n华为交换机：使用Link Aggregation Group（LAG）技术，配置命令包括link聚合组和端口加入聚合组等。\nJuniper交换机：使用LACP协议实现动态链路聚合，配置命令包括lacp和aggregation group等。\nH3C交换机：使用Link Aggregation技术，配置命令包括link聚合和端口加入聚合等。\n配置交换机端口聚合时，必须确保聚合组的配置与Bond模式相匹配。例如，当使用balance-rr模式时，交换机端口聚合组也应配置为轮询模式；当使用802.3ad模式时，交换机端口聚合组应配置为LACP模式。\n四、通用Bond配置步骤与方法 配置Bond需要根据不同的Linux发行版和网络管理工具选择合适的配置方法。主流Linux发行版（如RHEL/CentOS、Ubuntu）提供了多种Bond配置方式，包括nmcli命令、传统配置文件和Ubuntu的Netplan配置。\n1. 配置前的准备工作 在配置Bond之前，需要完成以下准备工作：\n确认系统内核支持bonding模块：\n1 2 3 4 1lsmod | grep bonding 2# 或 3modinfo bonding 如果输出显示bonding模块信息，则系统支持Bond技术。\n确认已安装必要的网络管理工具：\nRHEL/CentOS：NetworkManager或network-scripts Ubuntu：netplan或network-manager 确认物理网卡已正确识别并工作：\n1 2 3 4 1ip addr show 2# 或 3nmcli device status 2. nmcli配置方法（适用于RHEL/CentOS 7+） nmcli是Red Hat系列Linux发行版的网络管理工具，提供了一种动态配置Bond的方法：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 创建Bond主接口 nmcli connection add type bond ifname bond0 mode active-backup # 添加从接口到Bond nmcli connection add type bond-slave ifname eth0 master bond0 nmcli connection add type bond-slave ifname eth1 master bond0 # 配置IP地址和网关 nmcli connection modify bond0 ipv4.addresses \u0026#39;192.168.1.10/24\u0026#39; ipv4.gateway \u0026#39;192.168.1.1\u0026#39; ipv4.method manual # 设置Bond参数（如miimon、primary等） nmcli connection modify bond0 bond.options \u0026#34;miimon=100,primary=eth0\u0026#34; # 启用Bond接口 nmcli connection up bond0 nmcli connection up eth0 nmcli connection up eth1 nmcli方法的优势在于无需重启系统即可生效，适合生产环境。通过miimon参数可以设置链路状态检测间隔（单位：毫秒），primary参数可以指定主网卡，primary_reselect参数可以设置主网卡重新选择策略。\n常用Bond参数说明：\nmiimon：链路监测间隔（毫秒），建议值100-200 downdelay：链路down后延迟时间，建议值200 updelay：链路up后延迟时间，建议值200 primary：指定主网卡（仅适用于active-backup模式） primary_reselect：主网卡重选策略（always/better/failure） xmit_hash_policy：传输哈希策略（用于balance-xor和802.3ad模式） 3. 传统配置文件方法（适用于RHEL/CentOS 6及旧版） 在RHEL/CentOS 6及旧版系统中，通常使用传统的网络配置文件进行Bond配置：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # 创建Bond主接口配置文件 vi /etc/sysconfig/network-scripts/ifcfg-bond0 # 添加以下内容 DEVICE=bond0 BOOTPROTO=static ONBOOT=yes IPADDR=192.168.1.10 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8 BONDING_OPTS=\u0026#34;mode=active-backup miimon=100 primary=eth0\u0026#34; # 创建从接口配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eth0 # 添加以下内容 DEVICE=eth0 BOOTPROTO=none ONBOOT=yes MASTER=bond0 SLAVE=yes 1 2 3 4 5 6 7 8 9 10 # 同样创建ifcfg-eth1文件 vi /etc/sysconfig/network-scripts/ifcfg-eth1 # 添加以下内容 DEVICE=eth1 BOOTPROTO=none ONBOOT=yes MASTER=bond0 SLAVE=yes 1 2 # 重启网络服务 systemctl restart network 传统配置文件方法的优势在于配置稳定，适合需要持久化配置的场景。通过BONDING_OPTS参数可以设置Bond模式、链路检测间隔和主网卡等。\n4. Ubuntu Netplan配置方法（适用于Ubuntu 18.04+） 在Ubuntu 18.04及更高版本中，推荐使用Netplan进行网络配置：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 编辑Netplan配置文件 sudo vi /etc/netplan/01-netcfg.yaml # 添加以下内容 network: version: 2 renderer: networkd bonds: bond0: interfaces: [eth0, eth1] parameters: mode: active-backup miimon: 100 primary: eth0 addresses: [192.168.1.10/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] 1 2 3 # 应用配置 sudo netplan apply Ubuntu Netplan方法的优势在于配置简洁，支持YAML格式。通过parameters字段可以设置Bond模式、链路检测间隔和主网卡等。\n五、各模式的具体配置示例 1. balance-rr（mode=0）配置示例 1 2 3 4 5 6 7 8 9 10 # nmcli配置 nmcli con add type bond ifname bond0 mode balance-rr nmcli con add type bond-slave ifname eth0 master bond0 nmcli con add type bond-slave ifname eth1 master bond0 nmcli con mod bond0 ipv4.addresses \u0026#39;192.168.1.10/24\u0026#39; ipv4.gateway \u0026#39;192.168.1.1\u0026#39; ipv4.method manual nmcli con mod bond0 bond.options \u0026#34;miimon=100\u0026#34; nmcli con up bond0 nmcli con up eth0 nmcli con up eth1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # Ubuntu Netplan配置 network: version: 2 renderer: networkd bonds: bond0: interfaces: [eth0, eth1] parameters: mode: balance-rr miimon: 100 addresses: [192.168.1.10/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] balance-rr模式适合需要最大化带宽利用率的场景，如Web服务器、文件服务器等。但使用该模式时，必须确保交换机端配置了端口聚合，否则可能导致数据包乱序，影响TCP性能。\n2. active-backup（mode=1）配置示例 1 2 3 4 5 6 7 8 9 10 # nmcli配置 nmcli con add type bond ifname bond0 mode active-backup nmcli con add type bond-slave ifname eth0 master bond0 nmcli con add type bond-slave ifname eth1 master bond0 nmcli con mod bond0 ipv4.addresses \u0026#39;192.168.1.10/24\u0026#39; ipv4.gateway \u0026#39;192.168.1.1\u0026#39; ipv4.method manual nmcli con mod bond0 bond.options \u0026#34;miimon=100,primary=eth0\u0026#34; nmcli con up bond0 nmcli con up eth0 nmcli con up eth1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # Ubuntu Netplan配置 network: version: 2 renderer: networkd bonds: bond0: interfaces: [eth0, eth1] parameters: mode: active-backup miimon: 100 primary: eth0 addresses: [192.168.1.10/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] active-backup模式是最简单的Bond模式，适合只需要冗余的场景，如关键业务服务器、数据库服务器等。该模式无需交换机端进行特殊配置，只需确保交换机能够识别Bond的MAC地址即可。\n3. balance-xor（mode=2）配置示例 1 2 3 4 5 6 7 8 9 10 # nmcli配置 nmcli con add type bond ifname bond0 mode balance-xor nmcli con add type bond-slave ifname eth0 master bond0 nmcli con add type bond-slave ifname eth1 master bond0 nmcli con mod bond0 ipv4.addresses \u0026#39;192.168.1.10/24\u0026#39; ipv4.gateway \u0026#39;192.168.1.1\u0026#39; ipv4.method manual nmcli con mod bond0 bond.options \u0026#34;miimon=100,xmit_hash_policy=layer2+3\u0026#34; nmcli con up bond0 nmcli con up eth0 nmcli con up eth1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # Ubuntu Netplan配置 network: version: 2 renderer: networkd bonds: bond0: interfaces: [eth0, eth1] parameters: mode: balance-xor miimon: 100 xmit_hash_policy: layer2+3 addresses: [192.168.1.10/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] balance-xor模式适合需要基于哈希策略进行负载均衡的场景，如Web服务器、应用服务器等。该模式需要交换机端配置端口聚合，并且可能需要设置特定的哈希策略。xmit_hash_policy参数可以设置为以下值：\nlayer2：基于源和目标MAC地址及协议类型 layer2+3：基于源和目标MAC地址及IP地址 layer3+4：基于源和目标IP地址及端口 encap2+3：基于封装后的源和目标MAC地址及IP地址 encap3+4：基于封装后的源和目标IP地址及端口 vlan+srcmac：基于VLAN ID和源MAC地址 4. broadcast（mode=3）配置示例 1 2 3 4 5 6 7 8 9 10 # nmcli配置 nmcli con add type bond ifname bond0 mode broadcast nmcli con add type bond-slave ifname eth0 master bond0 nmcli con add type bond-slave ifname eth1 master bond0 nmcli con mod bond0 ipv4.addresses \u0026#39;192.168.1.10/24\u0026#39; ipv4.gateway \u0026#39;192.168.1.1\u0026#39; ipv4.method manual nmcli con mod bond0 bond.options \u0026#34;miimon=100\u0026#34; nmcli con up bond0 nmcli con up eth0 nmcli con up eth1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # Ubuntu Netplan配置 network: version: 2 renderer: networkd bonds: bond0: interfaces: [eth0, eth1] parameters: mode: broadcast miimon: 100 addresses: [192.168.1.10/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] broadcast模式适用于对可靠性要求极高的场景，如金融交易系统、电信核心设备等。该模式需要交换机端配置端口聚合，并且可能需要限制广播流量，避免网络拥塞。\n5. 802.3ad（mode=4）配置示例 1 2 3 4 5 6 7 8 9 10 # nmcli配置 nmcli con add type bond ifname bond0 mode 802.3ad nmcli con add type bond-slave ifname eth0 master bond0 nmcli con add type bond-slave ifname eth1 master bond0 nmcli con mod bond0 ipv4.addresses \u0026#39;192.168.1.10/24\u0026#39; ipv4.gateway \u0026#39;192.168.1.1\u0026#39; ipv4.method manual nmcli con mod bond0 bond.options \u0026#34;miimon=100\u0026#34; nmcli con up bond0 nmcli con up eth0 nmcli con up eth1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # Ubuntu Netplan配置 network: version: 2 renderer: networkd bonds: bond0: interfaces: [eth0, eth1] parameters: mode: 802.3ad miimon: 100 addresses: [192.168.1.10/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] 802.3ad模式是企业级网络中最常用的Bond模式之一，因为它提供了标准化的链路聚合方法。该模式需要交换机支持LACP协议，并且配置为LACP模式。\n注意事项：\n所有成员网卡必须连接到同一台交换机 交换机端口需要配置为LACP模式 网卡速率和双工模式必须一致 建议配置lacp_rate=fast以加快故障检测 6. balance-tlb（mode=5）配置示例 1 2 3 4 5 6 7 8 9 10 # nmcli配置 nmcli con add type bond ifname bond0 mode balance-tlb nmcli con add type bond-slave ifname eth0 master bond0 nmcli con add type bond-slave ifname eth1 master bond0 nmcli con mod bond0 ipv4.addresses \u0026#39;192.168.1.10/24\u0026#39; ipv4.gateway \u0026#39;192.168.1.1\u0026#39; ipv4.method manual nmcli con mod bond0 bond.options \u0026#34;miimon=100\u0026#34; nmcli con up bond0 nmcli con up eth0 nmcli con up eth1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # Ubuntu Netplan配置 network: version: 2 renderer: networkd bonds: bond0: interfaces: [eth0, eth1] parameters: mode: balance-tlb miimon: 100 addresses: [192.168.1.10/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] balance-tlb模式适合需要传输方向负载均衡的场景，如Web服务器、文件服务器等。该模式不需要交换机端进行特殊配置，但仅支持传输方向的负载均衡，不支持带宽叠加。\n7. balance-alb（mode=6）配置示例 1 2 3 4 5 6 7 8 9 10 # nmcli配置 nmcli con add type bond ifname bond0 mode balance-alb nmcli con add type bond-slave ifname eth0 master bond0 nmcli con add type bond-slave ifname eth1 master bond0 nmcli con mod bond0 ipv4.addresses \u0026#39;192.168.1.10/24\u0026#39; ipv4.gateway \u0026#39;192.168.1.1\u0026#39; ipv4.method manual nmcli con mod bond0 bond.options \u0026#34;miimon=100\u0026#34; nmcli con up bond0 nmcli con up eth0 nmcli con up eth1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # Ubuntu Netplan配置 network: version: 2 renderer: networkd bonds: bond0: interfaces: [eth0, eth1] parameters: mode: balance-alb miimon: 100 addresses: [192.168.1.10/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] balance-alb模式适合需要双向负载均衡的场景，如应用服务器、虚拟化环境等。该模式不需要交换机端进行特殊配置，但通过ARP协商机制实现接收方向的负载均衡，可能在某些网络环境中存在兼容性问题。\n六、Bond配置验证与监控 1. Bond状态检查 配置完成后，需要验证Bond是否正常工作：\n1 2 3 4 5 6 7 8 9 # 查看Bond接口状态 cat /proc/net/bonding/bond0 # 查看网络接口信息 ip addr show bond0 # 查看Bond统计信息 cat /sys/class/net/bond0/bonding/mode cat /sys/class/net/bond0/bonding/slaves 2. 链路状态监控 通过以下命令监控Bond链路状态：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 实时监控Bond状态 watch -n 1 \u0026#34;cat /proc/net/bonding/bond0\u0026#34; # 查看网络流量统计 cat /proc/net/dev | grep bond0 # 使用nmcli查看连接状态 nmcli device status nmcli connection show bond0 # 查看Bond详细状态 cat /sys/class/net/bond0/bonding/active_slave cat /sys/class/net/bond0/bonding/slave_list # 监控网络流量（需要安装iftop） iftop -i bond0 3. 常见问题排查 问题1：Bond接口无法启动 检查bonding模块是否加载：lsmod | grep bonding 检查物理网卡状态：ethtool eth0 检查配置文件语法：nmcli connection show 问题2：性能不如预期 验证交换机端口聚合配置 检查哈希策略设置：cat /sys/class/net/bond0/bonding/xmit_hash_policy 监控各网卡流量分布：iftop -i bond0 问题3：故障切换不及时 调整miimon参数：降低检测间隔（如50ms） 检查网线连接质量 验证交换机端口配置 七、最佳实践建议 1. 模式选择建议 生产服务器：推荐使用active-backup（mode=1）确保稳定性 虚拟化环境：推荐使用802.3ad（mode=4）获得标准化支持 高吞吐量应用：推荐使用balance-rr（mode=0）或balance-xor（mode=2） 简单冗余需求：推荐使用active-backup（mode=1）无需交换机配置 2. 参数优化建议 1 2 # 推荐的Bond参数配置 BONDING_OPTS=\u0026#34;mode=active-backup miimon=100 downdelay=200 updelay=200 primary=eth0 primary_reselect=always\u0026#34; 参数说明：\nmiimon=100：100ms检测间隔，平衡响应速度和系统负载 downdelay=200：200ms故障确认延迟，避免误切换 updelay=200：200ms恢复确认延迟，确保链路稳定 primary_reselect=always：主网卡恢复后立即切回 3. 安全性考虑 定期检查Bond配置的一致性 监控各成员网卡的工作状态 建立链路故障告警机制 制定网络故障应急预案 通过本文的详细介绍，相信您已经掌握了Linux Bond技术的各种模式及其配置方法。选择合适的Bond模式需要综合考虑网络需求、硬件环境和维护成本，建议在生产环境部署前先在测试环境进行充分验证。\n","permalink":"https://ohoo.dev/post/linux/linux_bond_card/","summary":"\u003ch2 id=\"linux-bond技术详解模式要求及配置指南\"\u003eLinux Bond技术详解：模式、要求及配置指南\u003c/h2\u003e\n\u003cp\u003eLinux Bond技术是一种将多个物理网络接口绑定为一个逻辑接口的网络虚拟化技术，能够提供网络冗余、负载均衡和带宽叠加等功能。\u003cstrong\u003eBond技术通过内核 bonding模块实现，将多个物理网卡虚拟为一个逻辑网卡（如bond0），对外呈现为单一网络接口，具有统一的MAC地址和IP地址\u003c/strong\u003e。这种技术在生产环境中广泛应用于服务器、存储设备和网络设备，以提高网络连接的可用性和性能。本文将详细解析七种Bond模式的工作原理、适用场景、对交换机的要求以及配置方法。\u003c/p\u003e","title":"Linux Bond技术详解：7种模式完全指南"},{"content":"AWS Well-Architected Operational Excellence Design Principles | AWS Well-Architected 卓越运营设计原则 概述 | Overview AWS Well-Architected Framework 是亚马逊云服务提供的架构最佳实践指导框架，其中卓越运营（Operational Excellence）是六大支柱之一。本文详细介绍卓越运营的五个核心设计原则。\nWe believe that having Well-Architected workloads that are designed with operations in mind greatly increases the likelihood of business success.\nThe following are the design principles for operational excellence in the cloud:\nPerform operations as code: In the cloud, you can apply the same engineering discipline that you use for application code to your entire environment. You can define your entire workload (applications, infrastructure, etc.) as code and update it with code. You can script your operations procedures and automate their process by launching them in response to events. By performing operations as code, you limit human error and create consistent responses to events. 按代码执行操作： 在云中，您可以将用于应用程序代码的相同工程规则应用于整个环境。您可以将整个工作负载（应用程序、基础设施等）定义为代码，并使用代码对其进行更新。您可以编写操作过程的脚本，并通过启动操作过程来响应事件来自动化其流程。通过将操作作为代码执行，您可以限制人为错误并创建对事件的一致响应。\nMake frequent, small, reversible changes: Design workloads to allow components to be updated regularly to increase the flow of beneficial changes into your workload. Make changes in small increments that can be reversed if they fail to aid in the identification and resolution of issues introduced to your environment (without affecting customers when possible). 进行频繁、小的、可逆的更改： 设计工作负载以允许定期更新组件，以增加对工作负载的有益更改流。以小增量进行更改，如果这些更改无法帮助识别和解决引入环境的问题（尽可能不影响客户），则可以撤消这些更改。\nRefine operations procedures frequently: As you use operations procedures, look for opportunities to improve them. As you evolve your workload, evolve your procedures appropriately. Set up regular game days to review and validate that all procedures are effective and that teams are familiar with them. 经常优化操作程序： 在使用操作过程时，请寻找改进它们的机会。随着工作负载的发展，请适当地改进您的过程。设置定期的演练日，以审查和验证所有程序是否有效，以及团队是否熟悉这些程序。\nAnticipate failure: Perform “pre-mortem” exercises to identify potential sources of failure so that they can be removed or mitigated. Test your failure scenarios and validate your understanding of their impact. Test your response procedures to ensure they are effective and that teams are familiar with their process. Set up regular game days to test workload and team responses to simulated events. 预期故障： 执行“事前分析”练习以识别潜在的故障来源，以便可以消除或减轻它们。测试您的故障场景并验证您对其影响的理解。测试您的响应程序以确保它们有效并且团队熟悉他们的流程。设置定期的比赛日，以测试工作负载和团队对模拟事件的响应。\nLearn from all operational failures: Drive improvement through lessons learned from all operational events and failures. Share what is learned across teams and through the entire organization. 从所有操作失败中吸取教训： 通过从所有运营事件和失败中吸取的经验教训来推动改进。在团队和整个组织之间分享所学到的知识。\n实施建议 | Implementation Recommendations 工具和服务推荐 | Recommended Tools and Services AWS 原生服务 | AWS Native Services AWS CloudFormation: 基础设施即代码模板服务 AWS Systems Manager: 运维自动化和配置管理 AWS CloudWatch: 监控和可观察性平台 AWS X-Ray: 分布式应用程序跟踪 AWS CodePipeline: 持续集成和持续部署 AWS Config: 配置合规性监控 第三方工具集成 | Third-party Tool Integration Terraform: 多云基础设施即代码 Ansible: 配置管理和应用部署 Prometheus + Grafana: 监控和可视化 Jenkins: CI/CD 自动化平台 Slack/Microsoft Teams: 事件通知和协作 成熟度评估模型 | Maturity Assessment Model Level 1: 基础级 | Basic 手动操作为主 基本监控告警 事件响应流程初步建立 Level 2: 发展级 | Developing 部分自动化实施 标准化操作流程 主动监控和预警 Level 3: 定义级 | Defined 广泛的自动化覆盖 持续改进文化 全面的可观察性 Level 4: 管理级 | Managed 高度自动化和自愈能力 预测性分析和智能运维 组织级知识管理 Level 5: 优化级 | Optimizing 完全自主的运营系统 机器学习驱动的优化 行业最佳实践引领 最佳实践案例 | Best Practice Examples 案例1：电商平台双11大促运维 挑战: 处理10倍流量峰值 解决方案: 自动弹性伸缩 + 蓝绿部署 效果: 99.99%可用性，零停机部署 案例2：金融机构监管合规 挑战: 严格的安全和合规要求 解决方案: IaC + 自动化审计 + 不可变基础设施 效果: 100%合规检查通过，50%运维成本降低 案例3：初创公司快速迭代 挑战: 小团队支持快速业务增长 解决方案: 无服务器架构 + 全自动化CI/CD 效果: 开发效率提升300%，运维人力节省80% 度量指标 | Key Metrics 运营效率指标 | Operational Efficiency Metrics 平均恢复时间 (MTTR): 故障恢复的平均时间 平均故障间隔 (MTBF): 系统稳定运行的平均时间 部署频率: 代码发布到生产环境的频率 部署成功率: 成功部署占总部署的比例 变更失败率: 导致服务降级的变更比例 业务影响指标 | Business Impact Metrics 系统可用性: 服务正常运行时间百分比 用户体验指标: 响应时间、错误率等 运营成本: 总体拥有成本(TCO) 创新速度: 新功能上线周期 团队满意度: 开发和运维团队工作满意度 常见挑战与解决方案 | Common Challenges and Solutions 挑战1：组织文化阻力 问题: 传统运维思维抗拒变化 解决方案:\n渐进式变革，从小范围试点开始 提供充分的培训和支持 建立激励机制鼓励采用新实践 挑战2：技能差距 问题: 团队缺乏云原生和自动化技能 解决方案:\n制定系统性培训计划 招聘具备相关技能的人才 与AWS或培训机构合作提供认证课程 挑战3：遗留系统集成 问题: 现有系统难以现代化 解决方案:\n采用绞杀者模式(Strangler Pattern)逐步替换 构建API网关统一接口 实施混合云策略平滑过渡 总结 | Conclusion AWS Well-Architected 卓越运营设计原则为组织提供了系统性的运维现代化指导。通过采用这些原则，企业可以：\n提升运营效率: 自动化减少人工干预，提高响应速度 增强系统可靠性: 预防式运维降低故障概率 加速业务创新: 稳定的基础设施支撑快速迭代 优化成本结构: 精细化管理降低总体拥有成本 培养学习文化: 持续改进促进组织能力提升 成功实施这些原则需要管理层承诺、团队协作和持续投入。建议从小范围试点开始，逐步扩展到整个组织，最终实现运营卓越的目标。\n参考资源 | References AWS Well-Architected Framework 官方文档 AWS Well-Architected 工具 AWS 运营卓越实验室 AWS Systems Manager 最佳实践 AWS CloudFormation 用户指南 相关文章 | Related Articles 家庭实验室网络架构设计与搭建指南 Linux Bond 技术详解：7 种模式完全指南 ","permalink":"https://ohoo.dev/post/aws/aws-well-architected-operational-excellence-design-principles/","summary":"\u003ch2 id=\"aws-well-architected-operational-excellence-design-principles--aws-well-architected-卓越运营设计原则\"\u003e\u003ca href=\"https://catalog.workshops.aws/well-architected-operational-excellence/en-US#aws-well-architected-operational-excellence-design-principles\"\u003eAWS Well-Architected Operational Excellence Design Principles | AWS Well-Architected 卓越运营设计原则\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"概述--overview\"\u003e概述 | Overview\u003c/h3\u003e\n\u003cp\u003eAWS Well-Architected Framework 是亚马逊云服务提供的架构最佳实践指导框架，其中卓越运营（Operational Excellence）是六大支柱之一。本文详细介绍卓越运营的五个核心设计原则。\u003c/p\u003e","title":"AWS Well-Architected Operational Excellence Design Principles | 卓越运营设计原则"},{"content":"开坑新章 ","permalink":"https://ohoo.dev/post/monitor/how-diy-metrics-in-springboot/","summary":"\u003ch2 id=\"开坑新章\"\u003e开坑新章\u003c/h2\u003e","title":"Spring Boot 自定义 Metrics 笔记"},{"content":"分布式系统忠告 Notes on Distributed Systems for Young Bloods January 14, 2013 08:15:00 AM PST\nI’ve been thinking about the lessons distributed systems engineers learn on the job. A great deal of our instruction is through scars made by mistakes made in production traffic. These scars are useful reminders, sure, but it’d be better to have more engineers with the full count of their fingers.\n我一直在思考分布式系统工程师在工作中学到的教训。我们的很多指令都是通过生产过程中的错误造成的伤疤来完成的。当然，这些伤疤是有用的提醒，但最好让更多的工程师全神贯注于他们的手指。\nNew systems engineers will find the Fallacies of Distributed Computing and the CAP theorem as part of their self-education. But these are abstract pieces without the direct, actionable advice the inexperienced engineer needs to start moving1. It’s surprising how little context new engineers are given when they start out.\n新的系统工程师将发现分布式计算的谬误还有CAP定理作为自我教育的一部分。但这些都是抽象的部分，没有经验丰富的工程师开始行动所需的直接、可行的建议1。令人惊讶的是，当新工程师开始工作的时候，他们得到的信息很少。\nBelow is a list of some lessons I’ve learned as a distributed systems engineer that are worth being told to a new engineer. Some are subtle, and some are surprising, but none are controversial. This list is for the new distributed systems engineer to guide their thinking about the field they are taking on. It’s not comprehensive, but it’s a good beginning.\n下面是我作为一名分布式系统工程师所学到的一些经验教训，值得新工程师去学习。有些是微妙的，有些是令人惊讶的，但没有一个是有争议的。这个列表是为了让新的分布式系统工程师指导他们对所从事领域的思考。这并不全面，但这是一个良好的开端。\nThe worst characteristic of this list is that it focuses on technical problems with little discussion of social problems an engineer may run into. Since distributed systems require more machines and more capital, their engineers tend to work with more teams and larger organizations. The social stuff is usually the hardest part of any software developer’s job, and, perhaps, especially so with distributed systems development.\n这个列表最糟糕的特点是它只关注技术问题，而很少讨论工程师可能遇到的社会问题。由于分布式系统需要更多的机器和更多的资金，他们的工程师倾向于与更多的团队和更大的组织合作。社交活动通常是任何软件开发人员工作中最困难的部分，也许，在分布式系统开发中尤其如此。\nOur background, education, and experience bias us towards a technical solution even when a social solution would be more efficient, and more pleasing. Let’s try to correct for that. People are less finicky than computers, even if their interface is a little less standardized.\n我们的背景、教育和经验使我们倾向于技术解决方案，即使社会解决方案更有效、更令人满意。让我们试着纠正一下。人们不像计算机那么挑剔，即使他们的界面不那么标准化。\nAlright, here we go.\n好吧，开始吧。\n# Distributed systems are different because they fail often. When asked what separates distributed systems from other fields of software engineering, the new engineer often cites latency, believing that’s what makes distributed computation hard.\n#分布式系统是不同的，因为它们经常失败。 当被问及是什么将分布式系统与软件工程的其他领域区分开来时，这位新工程师经常引用延迟，认为这是分布式计算困难的原因。\nBut they’re wrong. What sets distributed systems engineering apart is the probability of failure and, worse, the probability of partial failure. If a well-formed mutex unlock fails with an error, we can assume the process is unstable and crash it. But the failure of a distributed mutex’s unlock must be built into the lock protocol.\n但他们错了。使分布式系统工程与众不同的是失败的概率，更糟糕的是部分失效的概率。如果一个格式良好的互斥锁因错误而失败，我们可以假设进程不稳定并使其崩溃。但是分布式互斥锁的解锁失败必须建立在锁协议中。\nSystems engineers that haven’t worked in distributed computation will come up with ideas like “well, it’ll just send the write to both machines” or “it’ll just keep retrying the write until it succeeds”. These engineers haven’t completely accepted (though they usually intellectually recognize) that networked systems fail more than systems that exist on only a single machine and that failures tend to be partial instead of total. One of the writes may succeed while the other fails, and so now how do we get a consistent view of the data? These partial failures are much harder to reason about.\n没有在分布式计算领域工作过的系统工程师会想出这样的想法：“好吧，它只会将写操作发送到两台机器上”或者“它会一直重复写入，直到成功为止”。这些工程师还没有完全接受（尽管他们通常在智力上认识到）联网系统比只存在于一台机器上的系统更容易出故障，而且故障往往是局部的而不是全部的。其中一个写操作可能成功，而另一个写操作失败，那么现在我们如何获得一致的数据视图呢？这些局部故障很难解释。\nSwitches go down, garbage collection pauses make leaders “disappear”, socket writes seem to succeed but have actually failed on the other machine, a slow disk drive on one machine causes a communication protocol in the whole cluster to crawl, and so on. Reading from local memory is simply more stable than reading across a few switches.\n交换机宕机，垃圾收集暂停使引导程序“消失”，套接字写入看似成功，但实际上在另一台计算机上失败，一台计算机上磁盘驱动器速度慢导致整个群集中的通信协议爬行，等等。从本地内存读取比通过几个交换机读取更稳定。\nDesign for failure. #\n为失败而设计。#\n# Writing robust distributed systems costs more than writing robust single-machine systems. Creating a robust distributed solution requires more money than a single-machine solution because there are failures that only occur with many machines. Virtual machine and cloud technology make distributed systems engineering cheaper but not as cheap as being able to design, implement, and test on a computer you already own. And there are failure conditions that are difficult to replicate on a single machine. Whether it’s because they only occur on dataset sizes much larger than can be fit on a shared machine, or in the network conditions found in datacenters, distributed systems tend to need actual, not simulated, distribution to flush out their bugs. Simulation is, of course, very useful. #\n#编写健壮的分布式系统要比编写健壮的单机系统花费更多的钱。 创建一个健壮的分布式解决方案需要比单机解决方案更多的钱，因为有些故障只发生在多台机器上。虚拟机和云技术使分布式系统工程变得更便宜，但不如在已经拥有的计算机上进行设计、实现和测试那样便宜。而且有些故障情况很难在一台机器上重现。无论是因为它们只出现在比共享计算机大得多的数据集上，还是在数据中心的网络条件下，分布式系统往往需要实际的而不是模拟的分布来清除它们的错误。当然，模拟是非常有用的。#\n# Robust, open source distributed systems are much less common than robust, single-machine systems. The cost of running many machines for long periods of time is a burden on open source communities. Hobbyists and dilettantes are the engines of open source software and they do not have the financial resources available to explore or fix many of the problems a distributed system will have. Hobbyists write open source code for fun in their free time and with machines they already own. It’s much harder to find open source developers who are willing to spin up, maintain, and pay for a bunch of machines.\n#健壮的、开源的分布式系统比健壮的单机系统要少得多。 长时间运行许多机器的成本是开源社区的负担。业余爱好者和业余爱好者是开源软件的引擎，他们没有足够的财力来探索或解决分布式系统将面临的许多问题。业余爱好者在空闲时间和他们已经拥有的机器上写开源代码是为了好玩。很难找到愿意启动、维护和购买一堆机器的开源开发人员。\nSome of this slack has been taken up by engineers working for corporate entities. However, the priorities of their organization may not be in line with the priorities of your organization.\n这些松懈的部分工作已经被为企业实体工作的工程师所弥补。但是，他们组织的优先级可能与您组织的优先级不一致。\nWhile some in the open source community are aware of this problem, it’s not yet solved. This is hard. #\n虽然开源社区的一些人意识到了这个问题，但它还没有得到解决。这很难。#\n# Coordination is very hard. Avoid coordinating machines wherever possible. This is often described as “horizontal scalability”. The real trick of horizontal scalability is independence – being able to get data to machines such that communication and consensus between those machines is kept to a minimum. Every time two machines have to agree on something, the service becomes harder to implement. Information has an upper limit to the speed it can travel, and networked communication is flakier than you think, and your idea of what constitutes consensus is probably wrong. Learning about the Two Generals and Byzantine Generals problems is useful here. (Oh, and Paxos really is very hard to implement; that’s not grumpy old engineers thinking they know better than you.) #\n#协调非常困难。 尽可能避免协调机器。这通常被描述为“水平可伸缩性”。横向可伸缩性的真正诀窍在于独立性——能够将数据传输到机器上，从而将这些机器之间的通信和一致性保持在最低限度。每当两台机器必须就某件事达成一致时，服务就变得更难实现。信息的传播速度有一个上限，网络通信比你想象的要脆弱，你对什么是共识的想法可能是错误的。了解两位将军和拜占庭将军问题在这里很有用。（哦，而且Paxos真的很难实现；这不是那些脾气暴躁的老工程师，他们认为自己比你更懂。）#\n# If you can fit your problem in memory, it’s probably trivial. To a distributed systems engineer, problems that are local to one machine are easy. Figuring out how to process data quickly is harder when the data is a few switches away instead of a few pointer dereferences away. In a distributed system, the well-worn efficiency tricks documented since the beginning of computer science no longer apply. Plenty of literature and implementations are available for algorithms that run on a single machine because the majority of computation has been done on singular, uncoordinated machines. Significantly fewer exist for distributed systems. #\n#如果您可以将问题存储在内存中，那么它可能是微不足道的。 对于分布式系统工程师来说，一台机器上的本地问题很容易解决。当数据间的一些指针引用被一些交换机替代时，要想快速处理数据就比较困难了。在分布式系统中，自计算机科学诞生以来记录在案的效率技巧不再适用。在一台机器上运行的算法有大量的文献和实现，因为大多数计算都是在单一的、不协调的机器上完成的。对于分布式系统，存在的数量要少得多。#\n# “It’s slow” is the hardest problem you’ll ever debug. “It’s slow” might mean one or more of the number of systems involved in performing a user request is slow. It might mean one or more of the parts of a pipeline of transformations across many machines is slow. “It’s slow” is hard, in part, because the problem statement doesn’t provide many clues to the location of the flaw. Partial failures, ones that don’t show up on the graphs you usually look up, are lurking in a dark corner. And, until the degradation becomes very obvious, you won’t receive as many resources (time, money, and tooling) to solve it. Dapper and Zipkin were built for a reason. #\n#“它很慢”是您调试过的最难的问题。 “它很慢”可能意味着执行用户请求所涉及的一个或多个系统速度较慢。这可能意味着跨越许多机器的传输管道中的一个或多个部分是缓慢的。“它很慢”很难，部分原因是问题陈述没有提供很多关于缺陷位置的线索。部分失败，那些在你通常查找的图表中没有出现的故障，正潜伏在一个黑暗的角落里。而且，在退化变得非常明显之前，您不会得到足够多的资源（时间、资金和工具）来解决它。潇洒还有Zipkin是有原因的。#\n# Implement backpressure throughout your system. Backpressure is the signaling of failure from a serving system to the requesting system and how the requesting system handles those failures to prevent overloading itself and the serving system. Designing for backpressure means bounding resource use during times of overload and times of system failure. This is one of the basic building blocks of creating a robust distributed system.\n#在整个系统中实施反压。 反压是从服务系统向请求系统发出故障信号，以及请求系统如何处理这些故障，以防止自身和服务系统过载。设计反压意味着在过载和系统故障时限制资源使用。这是创建一个健壮的分布式系统的基本构件之一。\nImplementations of backpressure usually involve either dropping new messages on the floor, or shipping errors back to users (and incrementing a metric in both cases) when a resource becomes limited or failures occur. Timeouts and exponential back-offs on connections and requests to other systems are also essential.\n反压的实现通常包括在资源受限或发生故障时向用户发送新消息，或者将错误发送回用户（在这两种情况下都增加一个度量）。与其他系统的连接和请求的超时和指数后退也很重要。\nWithout backpressure mechanisms in place, cascading failure or unintentional message loss become likely. When a system is not able to handle the failures of another, it tends to emit failures to another system that depends on it. #\n如果没有反压机制，级联故障或意外的消息丢失就很可能发生。当一个系统不能处理另一个系统的故障时，它往往会向依赖它的另一个系统发出故障。#\n# Find ways to be partially available. Partial availability is being able to return some results even when parts of your system is failing.\nSearch is an ideal case to explore here. Search systems trade-off between how good their results are and how long they will keep a user waiting. A typical search system sets a time limit on how long it will search its documents, and, if that time limit expires before all of its documents are searched, it will return whatever results it has gathered. This makes search easier to scale in the face of intermittent slowdowns, and errors because those failures are treated the same as not being able to search all of their documents. The system allows for partial results to be returned to the user and its resilience is increased.\nAnd consider a private messaging feature in a web application. At some point, no matter what you do, enough storage machines for private messaging will be down at the same time that your users will notice. So what kind of partial failure do we want in this system?\nThis takes some thought. People are generally more okay with private messaging being down for them (and maybe some other users) than they are with all users having some of their messages go missing. If the service is overloaded or one of its machines are down, failing out just a small fraction of the userbase is preferable to missing data for a larger fraction. And, on top of that choice, we probably don’t want an unrelated feature, like public image upload, to be affected just because private messaging is having a problem. How much work are we willing to do to keep those failure domains separate?\nBeing able to recognize these kinds of trade-offs in partial availability is good to have in your toolbox. #\n#**找到使部分可用的方法。**部分可用性可以在系统的某些部分发生故障时返回一些结果。\n在这里，搜索是一个理想的探索案例。搜索系统在搜索结果的好坏和用户等待的时间之间进行权衡。一个典型的搜索系统设置了一个搜索文档的时间限制，如果这个时间限制在搜索所有文档之前过期，它将返回它收集到的任何结果。这使得搜索更容易在面对间歇性的减速和错误时进行扩展，因为这些失败被视为无法搜索所有文档。该系统允许将部分结果返回给用户，并提高其弹性。\n并考虑web应用程序中的私有消息传递功能。在某个时刻，无论你做什么，足够多的存储机器将关闭，同时你的用户会注意到。那么在这个系统中我们想要什么样的局部失效呢？\n这需要一些思考。一般来说，人们对自己（也许还有其他一些用户）的私人信息服务瘫痪比对所有用户的部分信息丢失更放心。如果服务超载或其中一台机器宕机，仅仅是一小部分用户群的故障比更大一部分用户的数据丢失要好。而且，在这个选择之上，我们可能不希望一个不相关的功能，比如公共图片上传，仅仅因为私人消息出现问题而受到影响。我们愿意做多少工作来保持这些故障域的分离？\n# Metrics are the only way to get your job done. Exposing metrics (such as latency percentiles, increasing counters on certain actions, rates of change) is the only way to cross the gap from what you believe your system does in production and what it actually is doing. Knowing how the system’s behavior on day 20 is different from its behavior on day 15 is the difference between successful engineering and failed shamanism. Of course, metrics are necessary to understand problems and behavior, but they are not sufficient to know what to do next.\nA diversion into logging. Log files are good to have, but they tend to lie. For example, it’s very common for the logging of a few error classes to take up a large proportion of a space in a log file but, in actuality, occur in a very low proportion of requests. Because logging successes is redundant in most cases (and would blow out the disk in most cases) and because engineers often guess wrong on which kinds of error classes are useful to see, log files get filled up with all sorts of odd bits and bobs. Prefer logging as if someone who has not seen the code will be reading the logs.\nI’ve seen a good number of outages extended by another engineer (or myself) over-emphasizing something odd we saw in the log without first checking it against the metrics. I’ve also seen another engineer (or myself) Sherlock-Holmes’ing an entire set of failed behaviors from a handful of log lines. But note: a) we remember those successes because they are so very rare and b) you’re not Sherlock unless the metrics or the experiments back up the story. #\n# 指标是完成你的工作的唯一方法。 暴露指标（如延迟百分比，增加某些动作的计数器，变化率）是跨越你相信你的系统在生产中做的事情和它实际做的事情之间的差距的唯一方法。了解系统在第20天的行为与第15天的行为有何不同，是成功的工程和失败的萨满之间的区别。当然，指标对于了解问题和行为是必要的，但它们不足以知道下一步该怎么做。\n转入日志记录。日志文件是好东西，但它们往往会说谎。例如，记录一些错误类的日志在日志文件中占据了很大的空间，但实际发生在请求中的比例很低，这是非常常见的。因为记录成功率在大多数情况下是多余的（而且在大多数情况下会炸掉磁盘），而且工程师经常猜错哪种错误类是有用的，所以日志文件会被各种奇奇怪怪的零碎东西填满。更喜欢把日志记录成一个没有看过代码的人在阅读日志。\n我见过不少中断是由另一个工程师（或我自己）过度强调我们在日志中看到的一些奇怪的东西，而没有先对照指标检查。我也见过另一位工程师（或我自己）从少量的日志行中找出一整套失败的行为。但是请注意：a)我们记住这些成功的案例，因为它们非常罕见；b)如果没有指标或实验支持，你就不是夏洛克(大侦探)。#\n# Use percentiles, not averages. Percentiles (50th, 99th, 99.9th, 99.99th) are more accurate and informative than averages in the vast majority of distributed systems. Using a mean assumes that the metric under evaluation follows a bell curve but, in practice, this describes very few metrics an engineer cares about. “Average latency” is a commonly reported metric, but I’ve never once seen a distributed system whose latency followed a bell curve. If the metric doesn’t follow a bell curve, the average is meaningless and leads to incorrect decisions and understanding. Avoid the trap by talking in percentiles. Default to percentiles, and you’ll better understand how users really see your system. #\n#使用百分位数，而不是平均值。 在绝大多数分布式系统中，百分数（第50、99、99.9、99.99）比平均数更准确，信息量更大。使用平均值是假设被评估的度量遵循一条钟形曲线，但实际上，这描述的是工程师关心的极少数度量。\u0026ldquo;平均延迟 \u0026ldquo;是一个普遍报道的度量，但我从来没有见过一个分布式系统的延迟遵循钟形曲线。如果指标不遵循钟形曲线，那么平均数就没有意义，会导致错误的决策和理解。通过用百分数说话来避免这个陷阱。默认为百分数，你就能更好地理解用户对你的系统的真实看法。#\n# Learn to estimate your capacity. You’ll learn how many seconds are in a day because of this. Knowing how many machines you need to perform a task is the difference between a long-lasting system, and one that needs to be replaced 3 months into its job. Or, worse, needs to be replaced before you finish productionizing it.\nConsider tweets. How many tweet ids can you fit in memory on a common machine? Well, a typical machine at the end of 2012 has 24 GB of memory, you’ll need an overhead of 4-5 GB for the OS, another couple, at least, to handle requests, and a tweet id is 8 bytes. This is the kind of back of the envelope calculation you’ll find yourself doing. Jeff Dean’s Numbers Everyone Should Know slide is a good expectation-setter. #\n# 学会估算你的产能。 你会因此知道一天有多少秒。知道你需要多少台机器来完成一个任务，是一个长期生产系统和一个在工作三个月后就需要更换的系统之间的区别。或者，更糟糕的是，在你完成生产化之前就需要更换。\n考虑一下推特。在一台普通的机器上，你能在内存中容纳多少个tweet id？好吧，2012年底一台典型的机器有24GB的内存，你需要4-5GB的开销给操作系统，另外至少需要几个，来处理请求，而一个tweet id是8个字节。这就是你会发现自己要做的那种 \u0026ldquo;信封后面的计算\u0026rdquo;。Jeff Dean的每个人都应该知道的数字 幻灯片是一个很好的期望设定者。#\n# Feature flags are how infrastructure is rolled out. “Feature flags” are a common way product engineers roll out new features in a system. Feature flags are typically associated with frontend A/B testing where they are used to show a new design or feature to only some of the userbase. But they are a powerful way of replacing infrastructure as well.\nToo many projects have failed because they went for the “big cutover” or a series of “big cutovers” that were then forced into rollbacks by bugs found too late. By using feature flags instead, you’ll gain confidence in your project and mitigate the costs of failure.\nSuppose you’re going from a single database to a service that hides the details of a new storage solution. Using a feature flag, you can slowly ramp up writes to the new service in parallel to the writes to the old database to make sure its write path is correct and fast enough. After the write path is at 100% and backfilling into the service’s datastore is complete, you can use a separate feature flag to start reading from the service, without using the data in user responses, to check for performance problems. Another feature flag can be used to perform comparison checks on read of the data from the old system and the new one. And one final flag can be used to slowly ramp up the “real” reads from the new system.\nBy breaking up the deployment into multiple steps and affording yourself quick and partial reactions with feature flags, you make it easier to find bugs and performance problems as they occur during ramp up instead of at a “big bang” release time. If an issue occurs, you can just tamp the feature flag setting back down to a lower (perhaps, zero) setting immediately. Adjusting the rates lets you debug and experiment at different amounts of traffic knowing that any problem you hit isn’t a total disaster. With feature flags, you can also choose other migration strategies, like moving requests over on a per-user basis, that provide better insight into the new system. And when your new service is still being prototyped, you can use flags at a low setting to have your new system consume fewer resources.\nNow, feature flags sound like a terrible mess of conditionals to a classically trained developer or a new engineer with well-intentioned training. And the use of feature flags means accepting that having multiple versions of infrastructure and data is a norm, not an rarity. This is a deep lesson. What works well for single-machine systems sometimes falters in the face of distributed problems.\nFeature flags are best understood as a trade-off, trading local complexity (in the code, in one system) for global simplicity and resilience. #\n# 功能标志是基础设施推出的方式。 \u0026ldquo;功能标志 \u0026ldquo;是产品工程师在系统中推出新功能的一种常见方式。功能标志通常与前端A/B测试相关联，它们被用来只向部分用户群展示新的设计或功能。但它们也是替换基础架构的一种有力方式。\n太多的项目都失败了，因为他们去做 \u0026ldquo;大切入 \u0026ldquo;或一系列的 \u0026ldquo;大切入\u0026rdquo;，然后因为发现的bug太晚而被迫回滚。通过使用功能标志来代替，你将获得对项目的信心，并减轻失败的代价。\n假设你要从一个单一的数据库到一个隐藏新存储解决方案细节的服务。使用一个功能标志，你可以慢慢地加大对新服务的写入，与对旧数据库的写入并行，以确保其写入路径正确且足够快。在写入路径达到100%，并完成对服务的数据存储的回填后，您可以使用一个单独的特征标志开始从服务中读取数据，而不使用用户响应中的数据，以检查性能问题。另一个特征标志可以用来对从旧系统和新系统读取的数据进行对比检查。而最后一个标志可以用来慢慢加大新系统的 \u0026ldquo;真实 \u0026ldquo;读取量。\n通过将部署分为多个步骤，并通过功能标志让自己快速和部分地做出反应，你可以更容易地在升级过程中发现错误和性能问题，而不是在 \u0026ldquo;大爆炸 \u0026ldquo;的发布时间。如果出现问题，你可以立即将功能标志设置夯实到一个较低的（也许是零）设置。调整速率可以让你在不同的流量下进行调试和实验，知道你遇到的任何问题都不会是一场灾难。有了功能标志，你还可以选择其他迁移策略，比如在每个用户的基础上移动请求，以便更好地了解新系统。当你的新服务还在原型阶段时，你可以使用低设置的标志来让你的新系统消耗更少的资源。\n现在，对于一个受过经典训练的开发人员或一个受过良好培训的新工程师来说，功能标志听起来像是一团糟糕的条件。而使用功能标志意味着接受拥有多个版本的基础架构和数据是一种常态，而不是稀奇。这是一个深刻的教训。对于单台机器系统来说行之有效的东西，在面对分布式问题时，有时会摇摇欲坠。\n特征标志最好被理解为一种交易，用局部的复杂性（在代码中，在一个系统中）换取全局的简单性和弹性。#\n# Choose id spaces wisely. The space of ids you choose for your system will shape your system.\nThe more ids required to get to a piece of data, the more options you have in partitioning the data. The fewer ids required to get a piece of data, the easier it is to consume your system’s output.\nConsider version 1 of the Twitter API. All operations to get, create, and delete tweets were done with respect to a single numeric id for each tweet. The tweet id is a simple 64-bit number that is not connected to any other piece of data. As the number of tweets goes up, it becomes clear that creating user tweet timelines and the timeline of other user’s subscriptions may be efficiently constructed if all of the tweets by the same user were stored on the same machine.\nBut the public API requires every tweet be addressable by just the tweet id. To partition tweets by user, a lookup service would have to be constructed. One that knows what user owns which tweet id. Doable, if necessary, but with a non-trivial cost.\nAn alternative API could have required the user id in any tweet look up and, initially, simply used the tweet id for storage until user-partitioned storage came online. Another alternative would have included the user id in the tweet id itself at the cost of tweet ids no longer being k-sortable and numeric.\nWatch out for what kind of information you encode in your ids, explicitly and implicitly. Clients may use the structure of your ids to de-anonymize private data, crawl your system in unexpected ways (auto-incrementing ids are a typical sore point), or perform a host of other attacks. #\n# 明智地选择id含义。 你为系统选择的id含义将塑造你的系统。\n获取一段数据所需的id越多，你在分割数据时的选择就越多。获取一段数据所需的id越少，你的系统的输出就越容易被消耗。\n考虑一下Twitter API的第1版。所有获取、创建和删除推文的操作都是针对每条推文的一个数字id来完成的。tweet id是一个简单的64位数字，与任何其他数据无关。随着推文数量的增加，很明显，如果同一用户的所有推文都存储在同一台机器上，那么创建用户的推文时间轴和其他用户订阅的时间轴可能会被高效地构建。\n但公共API要求每条推文都只需通过推文id即可寻址。为了按用户来划分tweet，必须构建一个查找服务。一个知道哪个用户拥有哪个tweet id的服务。如果有必要的话，是可以做到的，但成本不高。\n一个替代的API可以在任何tweet查询中要求用户id，并且，最初，简单地使用tweet id进行存储，直到用户/分区存储上线。另一个替代方案是将用户id包含在tweet id本身中，代价是tweet id不再是k/sortable和数字的。\n注意你在你的id中编码了什么样的信息，显性的和隐性的。客户端可能会使用你的id的结构去匿名化私人数据，以意想不到的方式抓取你的系统（自动递增的id是一个典型的痛点），或者执行一系列其他攻击。#\n# Exploit data-locality. The closer the processing and caching of your data is kept to its persistent storage, the more efficient your processing, and the easier it will be to keep your caching consistent and fast. Networks have more failures and more latency than pointer dereferences and fread(3).\nOf course, data-locality means being nearby in space, but it also means nearby in time. If multiple users are making the same expensive request at nearly the same time, perhaps their requests can be joined into one. If multiple instances of requests for the same kind of data are made near to one another, they could be joined into one larger request. Doing so often affords lower communication overheard and easier fault management. #\n# 利用数据的位置性。 数据的处理和缓存越接近它的持久性存储，你的处理效率就越高，也就越容易保持缓存的一致性和快速性。网络比指针取消引用和fread(3)有更多的故障和更多的延迟。\n当然，数据/位置性意味着在空间上靠近，但也意味着在时间上靠近。如果多个用户几乎在同一时间发出同一个昂贵的请求，也许他们的请求可以合并成一个。如果对同一种数据的多个请求实例彼此靠近，那么可以将它们合并成一个更大的请求。这样做通常可以降低通信的杂音和更容易的故障管理。#\n# Writing cached data back to persistent storage is bad. This happens in more systems than you’d think. Especially ones originally designed by people less experienced in distributed systems. Many systems you’ll inherit will have this flaw. If the implementers talk about “Russian-doll caching”, you have a large chance of hitting highly visible bugs. This entry could have been left out of the list, but I have a special hate in my heart for it. A common presentation of this flaw is user information (e.g. screennames, emails, and hashed passwords) mysteriously reverting to a previous value. #\n# 将缓存数据写回持久化存储是糟糕的。 这种情况发生在比你想象的更多的系统中。尤其是最初由在分布式系统方面经验不足的人设计的。你将继承的许多系统都会有这个缺陷。如果实现者谈论的是 “俄罗斯套娃缓存\u0026rdquo;，你就有很大的机会碰到高度可见的bug。这个条目本来可以不列入列表，但我心里特别恨它。这个缺陷常见的表现形式是用户信息（如网名、邮箱和密码哈希）神秘地恢复到以前的值。#\n# Computers can do more than you think they can. In the field today, there’s plenty of misinformation about what a machine is capable of from practitioners that do not have a great deal of experience.\nAt the end of 2012, a light web server had 6 or more processors, 24 GB of memory and more disk space than you can use. A relatively complex CRUD application in a modern language runtime on a single machine is trivially capable of doing thousands of requests per second within a few hundred milliseconds. And that’s a deep lower bound. In terms of operational ability, hundreds of requests per second per machine is not something to brag about in most cases.\nGreater performance is not hard to come by, especially if you are willing to profile your application and introduce efficiencies based on your measurements. #\n# 计算机能做的事情比你想象的要多。 在今天的领域里，没有太多经验的实践者对一台机器的能力有很多误解。\n在2012年底，一台轻量级的Web服务器有6个以上的处理器，24GB的内存，磁盘空间比你能用的多。一个相对复杂的CRUD应用在现代语言运行时的单机上，在几百毫秒内，每秒可以做上千个请求，这是微不足道的。而这是一个很深的下限。就运行能力而言，在大多数情况下，每台机器每秒发出数百个请求并不是什么值得吹嘘的事情。\n更高的性能并不难实现，特别是如果你愿意根据你的测量结果对你的应用进行剖析并改进效率。#\n# Use the CAP theorem to critique systems. The CAP theorem isn’t something you can build a system out of. It’s not a theorem you can take as a first principle and derive a working system from. It’s much too general in its purview, and the space of possible solutions too broad.\nHowever, it is well-suited for critiquing a distributed system design, and understanding what trade-offs need to be made. Taking a system design and iterating through the constraints CAP puts on its subsystems will leave you with a better design at the end. For homework, apply the CAP theorem’s constraints to a real world implementation of Russian-doll caching.\nOne last note: Out of C, A, and P, you can’t choose CA. #\n# 利用CAP定理来批判系统。 CAP定理不是你可以用来构建系统的的东西。它不是一个你可以把它作为第一原则并从中推导出一个工作系统的定理。它的范围过于笼统，可能的解决方案空间也太广了。\n但是，它非常适合对分布式系统设计进行评判，并了解需要做出哪些权衡。将一个系统设计，通过CAP对其子系统的迭代进行约束，最终会让你得到一个更好的设计。作业家庭作业，将CAP定理的约束条件应用到现实世界的俄罗斯套娃缓存实现中。\n最后说明一下：在C、A、P中，你不能选择CA。#\n# Extract services. “Service” here means “a distributed system that incorporates higher-level logic than a storage system and typically has a request-response style API”. Be on the lookout for code changes that would be easier to do if the code existed in a separate service instead of in your system.\nAn extracted service provides the benefits of encapsulation typically associated with creating libraries. However, extracting out a service improves on creating libraries by allowing for changes to be deployed faster and easier than upgrading the libraries in its client systems. (Of course, if the extracted service is hard to deploy, the client systems are the ones that become easier to deploy.) This ease is owed to the fewer code and operational dependencies in the smaller, extracted service and the strict boundary it creates makes it harder to “take shortcuts” that a library allows for. These shortcuts almost always make it harder to migrate the internals or the client systems to new versions.\nThe coordination costs of using a service is also much lower than a shared library when there are multiple client systems. Upgrading a library, even with no API changes needed, requires coordinating deploys of each client system. This gets harder when data corruption is possible if the deploys are performed out of order (and it’s harder to predict that it will happen). Upgrading a library also has a higher social coordination cost than deploying a service if the client systems have different maintainers. Getting others aware of and willing to upgrade is surprisingly difficult because their priorities may not align with yours.\nThe canonical service use case is to hide a storage layer that will be undergoing changes. The extracted service has an API that is more convenient, and reduced in surface area compared to the storage layer it fronts. By extracting a service, the client systems don’t have to know about the complexities of the slow migration to a new storage system or format and only the new service has to be evaluated for bugs that will certainly be found with the new storage layout.\nThere are a great deal of operational and social issues to consider when doing this. I cannot do them justice here. Another article will have to be written. #\nMuch love to my reviewers Bill de hÓra, Coda Hale, JD Maturen, Micaela McDonald, and Ted Nyman. Your insight and care was invaluable.\nUpdate (2016-08-15): I’ve added permalinks for each section and cleaned up some text in the sections on coordination, data-locality, feature flags, and backpressure.\n# 拆分服务。 \u0026ldquo;服务 \u0026ldquo;在这里指的是一个分布式系统，它包含了比存储系统更高层次的逻辑，通常有一个请求/响应式的API\u0026rdquo;。要注意代码的变化，如果代码存在于一个单独的服务中，而不是在你的系统中，就会更容易做到。\n拆分出来的服务提供了通常与创建库相关的封装的好处。然而，拆分出来的服务在创建库的基础上进行了改进，允许比升级其客户端系统中的库更快、更容易地部署更改。(当然，如果拆分出来的服务很难部署，那么客户端系统才会变得更容易部署)。这种轻松归功于较小的、拆分的服务中较少的代码和操作依赖性，而且它所建立的严格边界使得库所允许的 \u0026ldquo;走捷径 \u0026ldquo;变得更加困难。这些捷径几乎总是使内部或客户端系统更难迁移到新版本。\n当有多个客户端系统时，使用服务的协调成本也比共享库低很多。升级一个库，即使不需要更改API，也需要协调每个客户端系统的部署。如果不按顺序进行部署，就有可能发生数据损坏（而且更难预测会发生），这就更难了。如果客户端系统有不同的维护者，升级一个库的社会协调成本也比部署一个服务高。让其他人意识到并愿意升级是出乎意料的困难，因为他们的优先级可能与你的不一致。\n规范的服务用例是隐藏一个将进行更改的存储层。拆分的服务有一个更方便的API，与它前面的存储层相比，表面积减少了。通过拆分服务，客户系统不必知道缓慢迁移到新的存储系统或格式的复杂情况，只需要评估新的服务是否有bug，而新的存储布局一定会有bug。\n在做这件事的时候，有大量的运营和社会问题需要考虑。我在这里无法对它们进行公正的评价。还得再写一篇文章。#\n非常感谢我的审稿人Bill de hÓra、Coda Hale、JD Maturen、Micaela McDonald和Ted Nyman。您的洞察力和关怀是无价的。\n更新（2016/08/15）。我为每一节添加了链接，并清理了关于协调、数据/地点性、特征标志和反压的部分文字。\nOf course, Rotem-Gal-Oz’s take on the fallacies is very good. ↩︎ ","permalink":"https://ohoo.dev/post/distributed-systems/notes-on-distributed-systems-for-young-bloods/","summary":"\u003ch3 id=\"分布式系统忠告\"\u003e分布式系统忠告\u003c/h3\u003e\n\u003ch3 id=\"notes-on-distributed-systems-for-young-bloods\"\u003e\u003ca href=\"https://www.somethingsimilar.com/2013/01/14/notes-on-distributed-systems-for-young-bloods/\" title=\"Permalink to Notes on Distributed Systems for Young Bloods\"\u003eNotes on Distributed Systems for Young Bloods\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eJanuary 14, 2013 08:15:00 AM PST\u003c/p\u003e\n\u003cp\u003eI’ve been thinking about the lessons distributed systems engineers learn on the job. A great deal of our instruction is through scars made by mistakes made in production traffic. These scars are useful reminders, sure, but it’d be better to have more engineers with the full count of their fingers.\u003c/p\u003e\n\u003cp\u003e我一直在思考分布式系统工程师在工作中学到的教训。我们的很多指令都是通过生产过程中的错误造成的伤疤来完成的。当然，这些伤疤是有用的提醒，但最好让更多的工程师全神贯注于他们的手指。\u003c/p\u003e","title":"Notes on Distributed Systems for Young Bloods - 分布式系统忠告"},{"content":" this change for china mainland docker users.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # create docker user config dir sudo mkdir -p /etc/docker # touch docker config file sudo tee /etc/docker/daemon.json \u0026lt;\u0026lt;-\u0026#39;EOF\u0026#39; { \u0026#34;registry-mirrors\u0026#34;: [ \u0026#34;https://1nj0zren.mirror.aliyuncs.com\u0026#34;, \u0026#34;https://docker.mirrors.ustc.edu.cn\u0026#34;, \u0026#34;http://f1361db2.m.daocloud.io\u0026#34;, \u0026#34;https://registry.docker-cn.com\u0026#34; ] } EOF # reload and restart docker sudo systemctl daemon-reload sudo systemctl restart docker ","permalink":"https://ohoo.dev/post/linux/change_docker_image_mirror_service/","summary":"\u003cblockquote\u003e\n\u003cp\u003ethis change for china mainland docker users.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# create docker user config dir\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo mkdir -p /etc/docker\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# touch docker config file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo tee /etc/docker/daemon.json \u003cspan class=\"s\"\u003e\u0026lt;\u0026lt;-\u0026#39;EOF\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e    \u0026#34;registry-mirrors\u0026#34;: [\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e        \u0026#34;https://1nj0zren.mirror.aliyuncs.com\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e        \u0026#34;https://docker.mirrors.ustc.edu.cn\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e        \u0026#34;http://f1361db2.m.daocloud.io\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e        \u0026#34;https://registry.docker-cn.com\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e    ]\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eEOF\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# reload and restart docker\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl daemon-reload\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl restart docker\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"Docker 镜像加速配置 / Change Docker image mirror service"},{"content":"docker office rootless doc\nrootless principle\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # using office rootless shell script curl -sSL https://get.docker.com/rootless | sh # generally will be notice create `/etc/subuid` \u0026amp; `/etc/subgid` sudo touch /etc/subuid sudo touch /etc/subgid # edit touch file echo \u0026#34;`whoami`:`id -u`:65536\u0026#34; \u0026gt;\u0026gt; /etc/subuid echo \u0026#34;`whoami`:`id -u`:65536\u0026#34; \u0026gt;\u0026gt; /etc/subgid # reusing office rootless shell script curl -sSL https://get.docker.com/rootless | sh # --user opt service systemctl --user (start|stop|restart) docker # success to rootless docker docker ps ","permalink":"https://ohoo.dev/post/linux/docker_rootless/","summary":"\u003cp\u003e\u003ca href=\"https://docs.docker.com/engine/security/rootless/\"\u003edocker office rootless doc\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://medium.com/@tonistiigi/experimenting-with-rootless-docker-416c9ad8c0d6\"\u003erootless principle\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# using office rootless shell script\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -sSL https://get.docker.com/rootless \u003cspan class=\"p\"\u003e|\u003c/span\u003e sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# generally will be notice create `/etc/subuid` \u0026amp; `/etc/subgid`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo touch /etc/subuid\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo touch /etc/subgid\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# edit touch file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;`whoami`:`id -u`:65536\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; /etc/subuid\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;`whoami`:`id -u`:65536\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; /etc/subgid\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# reusing office rootless shell script\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -sSL https://get.docker.com/rootless \u003cspan class=\"p\"\u003e|\u003c/span\u003e sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# --user opt service\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esystemctl --user \u003cspan class=\"o\"\u003e(\u003c/span\u003estart\u003cspan class=\"p\"\u003e|\u003c/span\u003estop\u003cspan class=\"p\"\u003e|\u003c/span\u003erestart\u003cspan class=\"o\"\u003e)\u003c/span\u003e docker\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# success to rootless docker\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker ps\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"Docker Rootless 安装笔记"},{"content":" in manjaro linux ,install mysql is so eazy!! follow down step by step.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # arch linux auto install mysql sudo pacman -S mysql # random password sudo mysqld --initialize --user=mysql --basedir=/usr --datadir=/var/lib/mysql # empty password sudo mysqld --initialize-insecure --user=mysql --basedir=/usr --datadir=/var/lib/mysql # auto start service sudo systemctl enable mysqld.service sudo systemctl daemon-reload sudo systemctl start mysqld.service # login local mysql server mysql -u root -p error 1 2 ignore... ","permalink":"https://ohoo.dev/post/mysql/manjaro_install_mysql8/","summary":"\u003cblockquote\u003e\n\u003cp\u003ein manjaro linux ,install mysql is so eazy!! follow down step by step.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# arch linux auto install mysql\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo pacman -S mysql\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# random password\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo mysqld --initialize --user\u003cspan class=\"o\"\u003e=\u003c/span\u003emysql --basedir\u003cspan class=\"o\"\u003e=\u003c/span\u003e/usr --datadir\u003cspan class=\"o\"\u003e=\u003c/span\u003e/var/lib/mysql\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# empty password\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo mysqld --initialize-insecure --user\u003cspan class=\"o\"\u003e=\u003c/span\u003emysql --basedir\u003cspan class=\"o\"\u003e=\u003c/span\u003e/usr --datadir\u003cspan class=\"o\"\u003e=\u003c/span\u003e/var/lib/mysql\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# auto start service\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl \u003cspan class=\"nb\"\u003eenable\u003c/span\u003e mysqld.service\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl daemon-reload\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl start mysqld.service\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# login local mysql server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emysql -u root -p\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"error\"\u003eerror\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eignore...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"Manjaro Linux 安装 MySQL 8"},{"content":" 人性的弱点 戴尔.卡内基 著；以下是本书的部分目录及语录节选。\n与人相处的基本技巧 Fundamental Techniques in Handling People 1 如欲采蜜，勿蹴蜂房 批评不但不会改变事实，反而会招致愤恨。 因批评而引起的羞忿，常常使雇员、亲人和朋友的情绪大为低落，并且对应该矫正的现实状况，一点好处也没有。 尽量去了解别人，而不要用责骂的方式；尽量设身处地去想——他们为什么要这样做。这比起批评责怪要有益、有趣得多，而且让人心生同情、忍耐和仁慈。 2 真诚地赞赏他人 天底下只有一种方法可以促使他人去做任何事——给他想要的东西。 在你每天的生活之旅中，别忘了为人间留下一点赞美的温馨，这一点小火花会燃起友谊的火焰。 爱默生说：“我遇见的每一个人，或多或少是我的老师，因为我从他们身上学到了东西。” 3 激发他人的强烈需求 天底下只有一种方法可以影响他人，就是提出他们的需要，并且让他们知道怎样去获得。 成功的人际关系在于你捕捉对方观点的能力；还有，看一件事须兼顾你和对方的不同角度。 能设身处地为他人着想，了解别人心里想些什么的人，永远不用担心未来。 平安快乐的要诀 Secrets to Be Happy and Ease 4 保持自我本色 一般人的心智能力使用率不超过10％，大部分人不太了解自己还有什么才能。 一个人最糟的是不能成为自己，并且在身体与心灵中保持自我。 你在这个世界上每天都是一个崭新的自我，为此而高兴吧！善用你的天赋。 一个人总有一天会明白，嫉妒是无用的，而模仿他人无异于自杀。 5 改变不良的工作习惯 人不会因为过度劳累而死，却会放荡和忧烦而去。 没有人能永远按照事情的轻重程度去做事。但按部就班地做事，总比想到什么就做什么要好得多。 不要忘记，快乐并非取决于你是什么人，或你拥有什么，它完全来自于你的思想。 6 学会放松，解除疲劳 辛勤工作很少会导致疲劳，尤其是那种经过休息或睡眠之后都不能解除的疲劳。 一个令人吃惊的可悲事实是，无数不会浪费金钱的人，却在鲁鲁莽莽地虚掷浪费自己的精力。 紧张是一种习惯，放松也是一种习惯。 7 倦怠导致身体的疲劳 我们的疲劳往往不是由工作引起，而是由于忧烦、挫折和不满等。 每天时时跟自己交谈，可以引导自己思考什么是勇气和幸福，什么是平安和力量；每天跟自己谈些需要感谢的事，这样，你的心灵就会海阔天空，快乐欢畅。 8 活在今天的方格中 你所认为的，并非真正的你；反倒是你怎么想，你就是什么样的人。 行动似乎跟着感觉走，其实行动与感觉是并行的，如果意志控制行动，也就能间接控制感觉。 只要将一个人内心的态度由恐惧转为奋斗，就能克服任何障碍。 9 不要对敌人心存报复 即使我们没办法爱我们的敌人，起码也应该多爱自己一点。我们应该不让敌人控制我们的心情、健康和容貌。 要想真正宽恕忘却我们的敌人，最有效的办法还是诉诸比我们更强大的力量。如果我们可以忘记一切，侮辱也就无足轻重了。 永远不要对敌人心存报复，那样对自己的伤害将大于对别人的伤害。 10 不要指望别人感激你 忘记感谢乃是人的天性，如果我们一直期望别人感恩，多半是自寻烦恼。 要追求真正的快乐，就必须抛弃别人会不会感激的念头，只享受付出的快乐。 与其担心他人不知感恩，不如不予预期。 11 盘算你所得到的恩惠 世上最好的医生是饮食有度、保持平安愉悦的心情。 人生有两项主要目标，第一，拥有你所向往的；第二，享受它们。只有具有智慧的人才能做到第二点。 想想自己拥有老天赐予的恩惠，你就不会再有忧虑了。 12 将不利因素转化为成功因子 有两个人从铁窗朝外望去，一个人看到的是满地的泥泞，另一个却看到满天的繁星。 真正的快乐不见得是愉悦的，它多半是一种胜利。 人生最重要的不是以你的所得投资，任何人都可以这样做。真正重要的是如何从损失中获利。这才需要智慧，才能显示出人的上智下愚。 13 每天尽力取悦他人 每天想到一个人，并努力使他开心，这样就能保证你在14天内治好忧郁病。 许多病人医学上找不到任何病因，他们只是找不到生命的目标，而且自怜。 对别人好不是一种责任，它是一种享受，因为它能增进你的健康与快乐。你对别人好的时候，也就是对自己最好的时候。 一个人想得到人生快乐，就不能只想到自己，而应为他人着想，因为快乐来自于你为别人、别人为你。 14 批评他人是一种自我满足 如果你被人批评，那是因为批评你能给他一种满足感。这也说明你是有成就的，而且引人注意。 小人常为伟人的缺点或过失而得意。 不合理的批评往往是一种掩饰了的赞美。 15 不让批评之箭中伤你 只要相信自己做的对，就不要在意别人怎么说。 林肯说：“只要我不对任何攻讦作出反应，这件事就会到此为止。” 凡事尽力而为，然后避开他人的批评之箭。 16 学会自我批评 每个人一天起码有5分钟不够聪明，智慧似乎也有无力感。 一般人常因他人的批评而愤怒，有智慧的人却想办法从中学习。 与其等待敌人来攻击我们或我们所做的工作，倒不如自己动手。 敌人对我们的看法比我们自己的观点可能更接近事实。 如何使人喜欢你 The Ways to Make People Like You 17 学会真诚地关心他人 凡不关心别人的人，必会在有生之年遭受重大的困难，并且大大伤害到其他人。也就是这种人，导致了人类的种种错失。 关心他人与其他人际关系的原则一样，必须出于真诚。不仅付出关心的人应该这样，接受关心的人也理当如此。 18 不要忘记微笑 行为胜于言论，对人微笑就是向他人表明：“我喜欢你，你使我快乐，我喜欢见你。” 世上人人都在寻求快乐，但只有一个确实有效的方法，那就是控制你的思想。快乐不在乎外界的情况，而是依靠内心的情况。 行动好像是跟随感觉走的。其实不是如此，行动是与感觉并行的。我们能使直接受意志支配的行动有规律，也能间接地使不直接受意志制约的支配有规律。 19 千万别忘记他人的姓名 一种最简单、最明显、最重要的获得好感的办法，那就是记住他人的姓名，使他人感觉对于别人很重要。 记忆姓名的能力在事业与交际上的重要性，和在政治上差不多同等重要。 多数人不记得姓名，只因为他们没有下必要的功夫与精力去记。他们给自己找借口：他们太忙。 20 学会倾听他人讲话 始终挑剔的人，甚至最激烈的批评者，常会在一个有忍耐和同情心的静听者面前软化降服。 所以如果你希望成为一个善于谈话的人，那就先做一个注意静听的人。 21 迎合他人的兴趣 与人沟通的诀窍就是：谈论他人最为愉悦的事情。 如果你要使人喜欢你，如果你想让他人对你产生兴趣，你必须注意的一点是：谈论别人感兴趣的话题。 22 让他人感到自己重要 现实生活中有些人之所以会出现交际的障碍，就是因为他们不懂得或者忘记了一个重要原则——让他人感到自己重要。 人类本质里最深层的驱动力就是希望具有重要性。 你要别人怎么待你，就得先怎样待别人。 如何赢得他人的赞同 23 不要争论不休 天下只有一种方法能得到辩论的最大利益——那就是避免辩论。 如果你辩论、争强、反对，你或许有时获得胜利；但这种胜利是空洞的，因为你永远得不到对方的好感了。 凡决意成功的人，不能费时于个人的成见，更不能费时去承受结果，包括他无法控制自己的脾气，丧失自制。 24 尊重他人的意见 你永远不会因为认错而引来麻烦。只有如此才能平息争论，引导对方也能同你一样公正宽大，甚至也承认他或许错了。 别与顾客、配偶或敌人发生冲突。别指责他们的错误，别惹他们动怒，如果非得与人发生对立，也得运用一点技巧。 25 如果错了，当即承认 假如我们知道自己势必要遭到责备时，我们首先应自己责备自己，这样岂不比让别人责备好得多么？ 任何愚蠢的人都会尽力为自己的错误进行辩护——而且多数愚蠢的人都会这样去做，他承认自己的错误，感觉有别于他人，并给人一种尊贵高尚的感觉。 用争夺的方法，你永远得不到满足，但用让步的方法，你可能得到比你所期望的更多。 26 友善地对待他人 假如人心不平，对你印象恶劣，你就是用尽所有基督理论也很难使他们信服于你。 如果你想赢得人心，首先要让他人相信你是最真诚的朋友。 一滴蜂蜜要比一加仑的胆汁招引更多苍蝇。 27 让对方开口说“是” 当你与别人交谈的时候，不要先讨论你不同意的事，要先强调，而且不停地强调——你所同意的事。 懂得说话技巧的人，会在一开始就得到许多“是”的答复。 “是”的反应其实是一种很简单的技术，却为大多数人所忽略。 28 给他人说话的机会 如果你不同意他人的意见，你或许想阻止他，但最好不要这样，这样做没有什么效果。 如果你要树敌人，就胜过你的朋友；但如果你要得到朋友，那就让你的朋友胜过你。 最纯粹的快乐，是我们从别人的困难中所得到的快乐。 29 别将自己的意见强加于人 没有人喜欢接受推销，或被人强迫去做一件事。我们都喜欢按照自己的意愿购买东西，或照自己的意思行动，我们喜欢别人征询我们的愿望、需求和意见。 江海之所以能为百谷之王，是因为懂得身处低下，方能成为百谷之王。 30 善于从他人角度考虑问题 对方为什么会有那样的思想和行为，其中自有一定的原因。探寻出其中隐藏的原因来，你便得到了了解他人行动或人格的钥匙。 永远按照对方的观点去想，由他人的立场去看事，一如由你自己的一样，这或许不难成为影响你终身事业的一个关键因素。 31 同情对方的意愿 有这么一句神奇的妙语，它可以阻止人们辩论，消除他人产生的厌恶感，并给他人留下一个良好的印象。这句话就是：“我一点也不奇怪你有这种感觉。如果我是你，也会与你的感觉一样。” 人类普遍地追求同情。儿童迫切地显示他的伤害；或甚至故意割伤或打伤，以收获大量的同情。 32 激发他人高尚的动机 每个人的行事都有两个好理由：一是看起来很好；一是的确很好。 我们很难找到一个放之四海皆有效的法则，任何事情都会有一些例外。 如果没有迹象显示顾客有问题，最好要相信他们是诚心诚意愿意付清账款的。 33 戏剧性地表现自己的意图 这是一个充满戏剧性的时代，仅靠一点点语言的叙述是不够的。真理需要我们使之更生动、更有趣、更加戏剧化，你必须恰当运用表演的艺术。 34 让他人不断面临挑战 要做成事的办法，是激起竞争，不是勾心斗角的竞争，而是相互取胜的欲望。 取胜的欲望！挑战！激发！激发他人产生一种向上的精神——一种确实有效的方法！ 提出一个挑战，那是任何成功者都喜爱的一种竞技，一种表现自己的机会；那是证明自身价值、争强斗胜的机会。 如何更好说服他人 How to Change People Without Giving Offense 35 称赞并欣赏他人 当我们听到他人对自己的优点加以称赞以后，再去听一些不愉快的话，自然觉得好受一些。 如果你想说服他人，应该首先从称赞与真诚地欣赏开始。 36 间接委婉地指出他人的错误 有许多人在真诚的赞美之后，喜欢拐弯抹角地加上“但是”两个字，然后开始一连串地批评。 间接提出别人的错失，要比直接说出口来得温和，且不会引起别人的强烈反感。 37 不要总是责怪他人 听别人数说我们的错误很难，但假如对方谦卑地自称他们也并非完美，我们就比较容易接受了。 承认一个人本身的错误，就算你还没有改正过来，也可以帮助改善行为。 38 没有人喜欢受人指使 不教他人做什么，而让他人自己去做，自己在错误中学习。这种办法容易让一个人改正错误，保持个人的尊严，给他一种自重感，他就会与你保持合作，而不是背叛。 无礼的命令只会导致长久的怨仇——即使这个命令可以用来改正他人明显的错误。 39 保全他人的面子 保留他人的面子！这是一个何等重要的问题！而我们却很少会考虑到这个问题。 纵使别人犯错，而我们是对的，如果没有为别人保留面子，就会毁了一个人。 40 激励他人获得成功 假如你我要激励我们所接触的人，认识他们所具有的宝藏，我们所能做的比实际上改变的人还多。我们真能改变他们。 与我们本来应有的成就相比较，我们不过是半醒着。我们现在只利用我们身心资源的一小部分。 41 学会给人“戴高帽” 如果你要在某方面改进一个人，就要做得好像那种特点已经是他的显著特性之一。 差不多每一个人——富人、穷人、乞丐、盗贼——保全所赐予他的这诚实的名誉。 如果他得到你的尊重，并且你对他的某种能力表示认可，他就很容易受到引导。 42 鼓励更易使人改正错误 如果你告诉自己的孩子，丈夫，或他人，他在某件事上真是愚笨，他对某事没有天赋，或者他做的都错了……那么你就差不多消除了他要作出改进的各种动力。 宽容他人，鼓励他人，使事情好像容易去做，使对方知道你相信他有能力去做，他对这事有尚未发掘的才干——他为了要争胜就会终夜练习。 43 学会给他人授权 永远使对方乐于做你所提议的事。 获得权威，这是人类的一种天性。 让家庭幸福快乐 Ways to Make Your Family Happy 44 切勿喋喋不休 在所有一切烈火中，地狱魔鬼所发明的狞恶的毁灭爱情的计划，喋喋不休是最致命的。它像毒蛇的毒汁一样，永远侵蚀着人们的生命。 要想赢得女人的心，并愿意永远不辞辛劳地取悦自己，最好、最有用、也最不会失败的方法，便是时时全心全意地感谢她、赞美她。 45 不要试图改造对方 英国伟大的政治家狄斯瑞利说过：“我一生或许会犯许多错误，但我永远在打算为爱情而结婚。” 与人交往，第一件应学的事情就是不要干涉他们自己快乐的特殊方法，如果那些方法不激烈地与我们相冲突的话。 46 不要批评对方 在所有婚姻中，有50％以上是失败的。 使许多罗曼之梦撞击离婚礁石的一个原因，就是因为批评——无用的，令人心碎的批评 47 真诚地欣赏对方 男性对于女性追求美观及装束得体的努力应表示欣赏。所有的男人都忘了，如果他们曾有过觉察的话，将知道女性是如何注重自己的衣着。 对很多男人来讲，他们也许想不起自己5年前穿的什么衣服，什么衬衫，他们也丝毫没有意思去记住它们，但女人则不同。 48 注重生活中的小事 女人对生日及纪念日很重视，这永远是一种女性的神秘。 终究，婚姻就是一串琐事。忽视这一事实，将造成家庭生活的灾难。 在很多婚姻破裂的事件中，并非所有的家庭都是因为一些重大的事件而过不下去，相反，大多数人往往是由于一些小小的事情。 49 家庭内部也应有礼 无礼，这是侵蚀爱情的祸水。 惟一真实地对我们说出刻薄、侮辱、伤感情的话的人，都是我们自家的人。 婚姻幸福的普通人，比幽居的天才快乐得多。 50 如何与女性相处 今日的婚姻是否美满，要看双方的心理是否成熟。也就是说，他们是否了解自己、了解自己与对方的关系，并且愿意彼此分担责任，以增进对方的快乐与福利。 婚姻是我们是否成熟的最好试金石。你若不想关心别人，最好是自己独处。 51 如何与男性相处 要想当好听众，首先要注意听讲。眼睛不要四处张望，或显出烦躁不安的样子。 许多男性都把女性形容得唠叨不休，认为她们话讲得过多。他们真正的意思是：根本找不到机会可让自己也发表一些长篇大论。 52 不要做婚姻的文盲 所有婚姻的专家，都同意性的配合是绝对的必需。 “性”，众所公认的是生活中最重要的问题。无疑的，那也是造成男女快乐破裂原因的东西。 快乐的婚姻，很少是机会的产物，他们如建筑物似的，必需有理智的用心去设计。 如何是你变得更加成熟 How to Make Yourself Mature 53 不要光踢椅子 一个人迈向成熟的第一步应该是敢于承担责任。我们生活于世，就要面对生命中的许多责任。 对那些不成熟的人来说，他们永远都可以找到一些理由，以解脱他们自身的某些缺点或不幸。 把人的生活改造得更美好才重要，而不是整日沉溺在自怜的深渊。 54 困难并不意味着不幸 对喜欢规避责任的人来说，困难则成了最好的挡箭牌。 假如每个人成天都认为环境不好，当然就会把自己的过失诿诸“缺陷”或种种其他原因。 不成熟的人随时可以把自己与众不同的地方看成是缺陷、是障碍，然后期望自己能受到特别的待遇。成熟的人则不然。 55 摆脱生活中的不幸 要想摆脱不幸的阴影，最好的一种方法便是提升我们自己去帮助别人。 不幸遭遇并非就是世界末日。有时候，它还是促使我们采取行动的催化剂，对改善状况大有必要。 生命并不是一帆风顺的幸福之旅，而是时时摆动在幸与不幸、沉与浮、光明与黑暗之间的模式里。 56 拥有自己的信仰 我们必须信仰某些事物。但是，假如我们没有就此信仰去采取行动，一切仍然无用。只有信心而没有作为，是无济于事的。 人不是因为没有信心而跌倒，而是因为不能把信念化成行动，并且不顾一切地坚持到底。 57 你是独一无二的 每个人的生活遭遇都是独一无二的。尽管构成人体的基本因素相同，但我们每个人的生命都很奇妙地自成一格，绝不与人雷同。 心灵的成熟过程，是持续不断的自我发现、自我探寻的过程。除非我们先了解自己，否则我们很难去了解别人。 兴奋的品质是我们工作能否成功的极重要因素，因为情绪的动力是促成我们向前进的力量。 58 学会喜欢你自己 成熟的人会适度地忍耐自己，正如他适度地忍耐别人一样。他不会因自己的一些弱点而感到活得很痛苦。 不喜欢自己的人，表现在外的症状之一便是过度自我挑剔。 独处对我们的心灵运动十分有益处，就好像新鲜空气对我们的身体极有帮助一样。 59 不要盲从因袭 要想成为真正的“人”，必须先是个不盲从因袭的人。你心灵的完整性是不可侵犯的。 年轻人或涉世未深的人，常常会害怕自己与众不同，无论是穿着、行动、言谈或思考模式，都尽量与自己所属的圈子认同。 60 不要令人生厌 假如预防是最好的治疗，那么，在治疗疾病之前，我们须得先诊断出该疾病的原因来。 言语乏味的人不但不了解自己、不喜欢自己，甚至也不能保持自己的自然天性。 人若是心灵成熟，或心智继续成长，就能与人讨论任何事情而不致引人生厌。 61 为什么别人要喜欢你 赢得别人注意的最好方法，是不要去担心结果如何，或在意别人是否喜欢我们。只要我们开始采取行动，努力去实践那些必须完成的事项即可。 得到友谊的最佳方法，是必须注重施予，而不是获得——但应该是亲自赢取得来，而不是靠一时的吸引或哄骗。 爱是人类能够进步的基础，也是我们与他人交往的桥梁，更是衡量一个人是否成熟的依据。 走出孤独忧虑的人生 Perfect Ways to Conquer Worry 62 孤独是现代人的通病 许多寂寞孤独的人之所以会如此，是因为他们不了解爱和友谊并非是从天而降的礼物。一个人要想得到他人的欢迎，或被人接纳，一定要付出许多努力和代价。 我们若想克服孤寂，就必须远离自怜的阴影，勇敢走入充满光亮的人群。我们要去认识人，去结交新的朋友。 63 孤独是现代人的通病 许多寂寞孤独的人之所以会如此，是因为他们不了解爱和友谊并非是从天而降的礼物。一个人要想得到他人的欢迎，或被人接纳，一定要付出许多努力和代价。 我们若想克服孤寂，就必须远离自怜的阴影，勇敢走入充满光亮的人群。我们要去认识人，去结交新的朋友。 64 消除忧虑的灵丹妙药 能接受既成事实，这是克服随之而来的任何不幸的第一步。 能接受最坏的情况，就能在心理上让你发挥出新的能力。 忧虑最大的坏处就是摧毁我们集中精神的能力，一旦忧虑产生，我们的思想就会到处乱转，从而丧失作出决定的能力。 65 运用亚里士多德法则 如果我们将忧虑的时间，用来寻找解决问题的答案，那忧虑就会在我们智慧的光芒下消失。 一旦作出决定，当天就要付诸行动，同时要完全不理会责任问题，也不必担心后果。 66 将忧虑减半的四个步骤 究竟出了什么问题？ 问题的起因是什么？ 你能找到哪些解决办法？ 你决定用哪种办法？ 67 让忙碌消除你的忧虑 工作——让你忙着——是精神疾病最好的治疗剂。 忧虑最能伤害你的时候，不是在你有行动的时候，而是在一天的工作做完了之后。 要是我们为什么事情担心的话，让我们记住，我们可以把工作当做很好的古老治疗法！ 68 生活在今天的密封舱里 我们首要去做的事情不是去观望遥远的将来，而是去做手边的清晰之事。 为明日作好准备的最佳办法就是集中你所有的智慧、热忱，把今天的工作做得尽善尽美。 一个好想法与坏想法的差别是，好想法考虑到原因和结果，从而产生一个符合逻辑、富有建设性的计划；而坏想法通常会导致一个人的紧张和精神崩溃。 69 不要因小事而垂头丧气 我们通常都能很勇敢地面对生活里那些大的危机，却被那些小事情搞得垂头丧气。 大多数时间里，要想克服因为一些小事情引起的困扰，只要把自己的看法和重点转移一下就可以了。你就会找到一个新的、使你开心一点的想法。 70 计算事情发生的概率 我们所担心的事情中，有99％根本就不会发生。 如果我们根据概率法则考虑一下我们的忧虑是否值得，并真正做到长时间内不再忧虑，90％的忧虑就可能消除。 71 适应不可避免的事实 事情既然如此，就不会另有他样。 我们所有迟早要学到的东西，就是必须接受和适应那些不可避免的事实。 快乐之道无他——我们的意志力所不及的事情，不要去忧虑。 72 让忧虑“到此为止” 学会对自己说：“这件事情只值得我担一点点心，没有必要去操更多的心。” 林肯认为：“一个人实在没有时间把他的半辈子花在争吵上，要是那个人不再攻击我，我就不会记他的仇。” 获得心理平静的最大秘密之一，就是要有正确的价值观念。 73 不要试着去锯木屑 惟一可以使过去的错误具有价值的方法，就是冷静地分析我们过去的错误，并从错误中得到教训，然后再把错误忘掉。 当你开始为那些已经做完或过去的事忧虑的时候，你不过是在锯一些木屑。 聪明的人永远不会坐在那里为他们的损失而悲伤，却会很高兴地想办法来弥补他们的创伤。 必要因为工作和金钱烦恼 Don\u0026rsquo;t Worry About Your Workand Money 74 一生最重要的决定 当你到了18岁时，你可能面临着两个重大的决定：你将如何谋生？你选择一个什么样的人生伴侣？ 一个人只要无限热爱自己的工作，他就可能获得成功。 选择一个合适的工作，这对你的健康十分重要。 让我们为那些找到自己心爱工作的人祝福，他们无须祈求其他幸福了。 75 70％的烦恼与金钱有关 人类70％的烦恼都跟金钱有关，而人们在处理金钱时，却往往意外地盲目。 令多数人感到烦恼的，并不是他们没有足够的钱，而是不知道如何支配手中已有的钱。 即使我们拥有整个世界，我们一天也只能吃三餐，一次也只能睡一张床——即使一个挖水沟的人也能做到这一点，也许他们比洛克菲勒吃得更津津有味，睡得更安稳。如果我懂得如何解决每个人的财务烦恼，我就 76 夫妻间的职业冲突 最适合某个人的工作，或能够使他感到快乐的工作，并不一定就会使他富有或过上好日子。 疑虑是我们心中的叛逆者，由于害怕去追求，将会使我们失去我们通常能够赢得的东西。 上帝的确偏爱勇敢和坚强的心灵。 77 不要入不敷出 没有计划地花钱，就等于让肉贩、服装商、家具店……都来分享你的收入。 有计划的，或是有预算的花费，可以保证你和家人能够从你的收入里得到公平的分享。 预算是一张蓝图、一个经过计划的方法，用以帮助你从你的收入中得到更大的好处。 防止疲劳，永葆活力 Prevent Fatigueand Worry and Keep Your Energy High 78 保持每日多清醒一小时 防止疲劳和忧虑的第一条规则是，经常休息，在你感到疲倦以前就休息。 爱迪生认为他无穷的精力和耐力，都来自他能随时想睡就睡的习惯。 休息并不是绝对什么事都不做，休息就是“修补”。 在你感到疲劳之前先休息，这样你每天清醒的时间，就可以多增加一小时。 79 说出你的心事卡 只要一个病人能够说话——单单说出来，就能够解除他心中的忧虑。 不要为别人的缺点过于操心。 今晚上床之前，先安排好明天工作的程序。 80 不再为失眠而忧虑 为失眠症而忧虑，对你伤害的程度，远远超过失眠症本身。 治疗失眠症的最好办法，就是使你自己的体力劳动到疲倦的程度。 ","permalink":"https://ohoo.dev/post/readbook/%E4%BA%BA%E6%80%A7%E7%9A%84%E5%BC%B1%E7%82%B9/","summary":"\u003cblockquote\u003e\n\u003cp\u003e人性的弱点 戴尔.卡内基 著；以下是本书的部分目录及语录节选。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"与人相处的基本技巧-fundamental-techniques-in-handling-people\"\u003e与人相处的基本技巧 Fundamental Techniques in Handling People\u003c/h2\u003e\n\u003ch3 id=\"1-如欲采蜜勿蹴蜂房\"\u003e1 如欲采蜜，勿蹴蜂房\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e批评不但不会改变事实，反而会招致愤恨。\u003c/li\u003e\n\u003cli\u003e因批评而引起的羞忿，常常使雇员、亲人和朋友的情绪大为低落，并且对应该矫正的现实状况，一点好处也没有。\u003c/li\u003e\n\u003cli\u003e尽量去了解别人，而不要用责骂的方式；尽量设身处地去想——他们为什么要这样做。这比起批评责怪要有益、有趣得多，而且让人心生同情、忍耐和仁慈。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"2-真诚地赞赏他人\"\u003e2 真诚地赞赏他人\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e天底下只有一种方法可以促使他人去做任何事——给他想要的东西。\u003c/li\u003e\n\u003cli\u003e在你每天的生活之旅中，别忘了为人间留下一点赞美的温馨，这一点小火花会燃起友谊的火焰。\u003c/li\u003e\n\u003cli\u003e爱默生说：“我遇见的每一个人，或多或少是我的老师，因为我从他们身上学到了东西。”\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"3-激发他人的强烈需求\"\u003e3 激发他人的强烈需求\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e天底下只有一种方法可以影响他人，就是提出他们的需要，并且让他们知道怎样去获得。\u003c/li\u003e\n\u003cli\u003e成功的人际关系在于你捕捉对方观点的能力；还有，看一件事须兼顾你和对方的不同角度。\u003c/li\u003e\n\u003cli\u003e能设身处地为他人着想，了解别人心里想些什么的人，永远不用担心未来。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"平安快乐的要诀-secrets-to-be-happy-and-ease\"\u003e平安快乐的要诀 Secrets to Be Happy and Ease\u003c/h2\u003e\n\u003ch3 id=\"4-保持自我本色\"\u003e4 保持自我本色\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e一般人的心智能力使用率不超过10％，大部分人不太了解自己还有什么才能。\u003c/li\u003e\n\u003cli\u003e一个人最糟的是不能成为自己，并且在身体与心灵中保持自我。\u003c/li\u003e\n\u003cli\u003e你在这个世界上每天都是一个崭新的自我，为此而高兴吧！善用你的天赋。\u003c/li\u003e\n\u003cli\u003e一个人总有一天会明白，嫉妒是无用的，而模仿他人无异于自杀。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"5-改变不良的工作习惯\"\u003e5 改变不良的工作习惯\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e人不会因为过度劳累而死，却会放荡和忧烦而去。\u003c/li\u003e\n\u003cli\u003e没有人能永远按照事情的轻重程度去做事。但按部就班地做事，总比想到什么就做什么要好得多。\u003c/li\u003e\n\u003cli\u003e不要忘记，快乐并非取决于你是什么人，或你拥有什么，它完全来自于你的思想。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"6-学会放松解除疲劳\"\u003e6 学会放松，解除疲劳\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e辛勤工作很少会导致疲劳，尤其是那种经过休息或睡眠之后都不能解除的疲劳。\u003c/li\u003e\n\u003cli\u003e一个令人吃惊的可悲事实是，无数不会浪费金钱的人，却在鲁鲁莽莽地虚掷浪费自己的精力。\u003c/li\u003e\n\u003cli\u003e紧张是一种习惯，放松也是一种习惯。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"7-倦怠导致身体的疲劳\"\u003e7 倦怠导致身体的疲劳\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e我们的疲劳往往不是由工作引起，而是由于忧烦、挫折和不满等。\u003c/li\u003e\n\u003cli\u003e每天时时跟自己交谈，可以引导自己思考什么是勇气和幸福，什么是平安和力量；每天跟自己谈些需要感谢的事，这样，你的心灵就会海阔天空，快乐欢畅。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"8-活在今天的方格中\"\u003e8 活在今天的方格中\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e你所认为的，并非真正的你；反倒是你怎么想，你就是什么样的人。\u003c/li\u003e\n\u003cli\u003e行动似乎跟着感觉走，其实行动与感觉是并行的，如果意志控制行动，也就能间接控制感觉。\u003c/li\u003e\n\u003cli\u003e只要将一个人内心的态度由恐惧转为奋斗，就能克服任何障碍。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"9-不要对敌人心存报复\"\u003e9 不要对敌人心存报复\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e即使我们没办法爱我们的敌人，起码也应该多爱自己一点。我们应该不让敌人控制我们的心情、健康和容貌。\u003c/li\u003e\n\u003cli\u003e要想真正宽恕忘却我们的敌人，最有效的办法还是诉诸比我们更强大的力量。如果我们可以忘记一切，侮辱也就无足轻重了。\u003c/li\u003e\n\u003cli\u003e永远不要对敌人心存报复，那样对自己的伤害将大于对别人的伤害。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"10-不要指望别人感激你\"\u003e10 不要指望别人感激你\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e忘记感谢乃是人的天性，如果我们一直期望别人感恩，多半是自寻烦恼。\u003c/li\u003e\n\u003cli\u003e要追求真正的快乐，就必须抛弃别人会不会感激的念头，只享受付出的快乐。\u003c/li\u003e\n\u003cli\u003e与其担心他人不知感恩，不如不予预期。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"11-盘算你所得到的恩惠\"\u003e11 盘算你所得到的恩惠\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e世上最好的医生是饮食有度、保持平安愉悦的心情。\u003c/li\u003e\n\u003cli\u003e人生有两项主要目标，第一，拥有你所向往的；第二，享受它们。只有具有智慧的人才能做到第二点。\u003c/li\u003e\n\u003cli\u003e想想自己拥有老天赐予的恩惠，你就不会再有忧虑了。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"12-将不利因素转化为成功因子\"\u003e12 将不利因素转化为成功因子\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e有两个人从铁窗朝外望去，一个人看到的是满地的泥泞，另一个却看到满天的繁星。\u003c/li\u003e\n\u003cli\u003e真正的快乐不见得是愉悦的，它多半是一种胜利。\u003c/li\u003e\n\u003cli\u003e人生最重要的不是以你的所得投资，任何人都可以这样做。真正重要的是如何从损失中获利。这才需要智慧，才能显示出人的上智下愚。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"13-每天尽力取悦他人\"\u003e13 每天尽力取悦他人\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e每天想到一个人，并努力使他开心，这样就能保证你在14天内治好忧郁病。\u003c/li\u003e\n\u003cli\u003e许多病人医学上找不到任何病因，他们只是找不到生命的目标，而且自怜。\u003c/li\u003e\n\u003cli\u003e对别人好不是一种责任，它是一种享受，因为它能增进你的健康与快乐。你对别人好的时候，也就是对自己最好的时候。\u003c/li\u003e\n\u003cli\u003e一个人想得到人生快乐，就不能只想到自己，而应为他人着想，因为快乐来自于你为别人、别人为你。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"14-批评他人是一种自我满足\"\u003e14 批评他人是一种自我满足\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e如果你被人批评，那是因为批评你能给他一种满足感。这也说明你是有成就的，而且引人注意。\u003c/li\u003e\n\u003cli\u003e小人常为伟人的缺点或过失而得意。\u003c/li\u003e\n\u003cli\u003e不合理的批评往往是一种掩饰了的赞美。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"15-不让批评之箭中伤你\"\u003e15 不让批评之箭中伤你\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e只要相信自己做的对，就不要在意别人怎么说。\u003c/li\u003e\n\u003cli\u003e林肯说：“只要我不对任何攻讦作出反应，这件事就会到此为止。”\u003c/li\u003e\n\u003cli\u003e凡事尽力而为，然后避开他人的批评之箭。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"16-学会自我批评\"\u003e16 学会自我批评\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e每个人一天起码有5分钟不够聪明，智慧似乎也有无力感。\u003c/li\u003e\n\u003cli\u003e一般人常因他人的批评而愤怒，有智慧的人却想办法从中学习。\u003c/li\u003e\n\u003cli\u003e与其等待敌人来攻击我们或我们所做的工作，倒不如自己动手。\u003c/li\u003e\n\u003cli\u003e敌人对我们的看法比我们自己的观点可能更接近事实。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"如何使人喜欢你-the-ways-to-make-people-like-you\"\u003e如何使人喜欢你 The Ways to Make People Like You\u003c/h2\u003e\n\u003ch3 id=\"17-学会真诚地关心他人\"\u003e17 学会真诚地关心他人\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e凡不关心别人的人，必会在有生之年遭受重大的困难，并且大大伤害到其他人。也就是这种人，导致了人类的种种错失。\u003c/li\u003e\n\u003cli\u003e关心他人与其他人际关系的原则一样，必须出于真诚。不仅付出关心的人应该这样，接受关心的人也理当如此。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"18-不要忘记微笑\"\u003e18 不要忘记微笑\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e行为胜于言论，对人微笑就是向他人表明：“我喜欢你，你使我快乐，我喜欢见你。”\u003c/li\u003e\n\u003cli\u003e世上人人都在寻求快乐，但只有一个确实有效的方法，那就是控制你的思想。快乐不在乎外界的情况，而是依靠内心的情况。\u003c/li\u003e\n\u003cli\u003e行动好像是跟随感觉走的。其实不是如此，行动是与感觉并行的。我们能使直接受意志支配的行动有规律，也能间接地使不直接受意志制约的支配有规律。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"19-千万别忘记他人的姓名\"\u003e19 千万别忘记他人的姓名\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e一种最简单、最明显、最重要的获得好感的办法，那就是记住他人的姓名，使他人感觉对于别人很重要。\u003c/li\u003e\n\u003cli\u003e记忆姓名的能力在事业与交际上的重要性，和在政治上差不多同等重要。\u003c/li\u003e\n\u003cli\u003e多数人不记得姓名，只因为他们没有下必要的功夫与精力去记。他们给自己找借口：他们太忙。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"20-学会倾听他人讲话\"\u003e20 学会倾听他人讲话\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e始终挑剔的人，甚至最激烈的批评者，常会在一个有忍耐和同情心的静听者面前软化降服。\u003c/li\u003e\n\u003cli\u003e所以如果你希望成为一个善于谈话的人，那就先做一个注意静听的人。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"21-迎合他人的兴趣\"\u003e21 迎合他人的兴趣\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e与人沟通的诀窍就是：谈论他人最为愉悦的事情。\u003c/li\u003e\n\u003cli\u003e如果你要使人喜欢你，如果你想让他人对你产生兴趣，你必须注意的一点是：谈论别人感兴趣的话题。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"22-让他人感到自己重要\"\u003e22 让他人感到自己重要\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e现实生活中有些人之所以会出现交际的障碍，就是因为他们不懂得或者忘记了一个重要原则——让他人感到自己重要。\u003c/li\u003e\n\u003cli\u003e人类本质里最深层的驱动力就是希望具有重要性。\u003c/li\u003e\n\u003cli\u003e你要别人怎么待你，就得先怎样待别人。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"如何赢得他人的赞同\"\u003e如何赢得他人的赞同\u003c/h2\u003e\n\u003ch3 id=\"23-不要争论不休\"\u003e23 不要争论不休\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e天下只有一种方法能得到辩论的最大利益——那就是避免辩论。\u003c/li\u003e\n\u003cli\u003e如果你辩论、争强、反对，你或许有时获得胜利；但这种胜利是空洞的，因为你永远得不到对方的好感了。\u003c/li\u003e\n\u003cli\u003e凡决意成功的人，不能费时于个人的成见，更不能费时去承受结果，包括他无法控制自己的脾气，丧失自制。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"24-尊重他人的意见\"\u003e24 尊重他人的意见\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e你永远不会因为认错而引来麻烦。只有如此才能平息争论，引导对方也能同你一样公正宽大，甚至也承认他或许错了。\u003c/li\u003e\n\u003cli\u003e别与顾客、配偶或敌人发生冲突。别指责他们的错误，别惹他们动怒，如果非得与人发生对立，也得运用一点技巧。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"25-如果错了当即承认\"\u003e25 如果错了，当即承认\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e假如我们知道自己势必要遭到责备时，我们首先应自己责备自己，这样岂不比让别人责备好得多么？\u003c/li\u003e\n\u003cli\u003e任何愚蠢的人都会尽力为自己的错误进行辩护——而且多数愚蠢的人都会这样去做，他承认自己的错误，感觉有别于他人，并给人一种尊贵高尚的感觉。\u003c/li\u003e\n\u003cli\u003e用争夺的方法，你永远得不到满足，但用让步的方法，你可能得到比你所期望的更多。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"26-友善地对待他人\"\u003e26 友善地对待他人\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e假如人心不平，对你印象恶劣，你就是用尽所有基督理论也很难使他们信服于你。\u003c/li\u003e\n\u003cli\u003e如果你想赢得人心，首先要让他人相信你是最真诚的朋友。\u003c/li\u003e\n\u003cli\u003e一滴蜂蜜要比一加仑的胆汁招引更多苍蝇。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"27-让对方开口说是\"\u003e27 让对方开口说“是”\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e当你与别人交谈的时候，不要先讨论你不同意的事，要先强调，而且不停地强调——你所同意的事。\u003c/li\u003e\n\u003cli\u003e懂得说话技巧的人，会在一开始就得到许多“是”的答复。\u003c/li\u003e\n\u003cli\u003e“是”的反应其实是一种很简单的技术，却为大多数人所忽略。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"28-给他人说话的机会\"\u003e28 给他人说话的机会\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e如果你不同意他人的意见，你或许想阻止他，但最好不要这样，这样做没有什么效果。\u003c/li\u003e\n\u003cli\u003e如果你要树敌人，就胜过你的朋友；但如果你要得到朋友，那就让你的朋友胜过你。\u003c/li\u003e\n\u003cli\u003e最纯粹的快乐，是我们从别人的困难中所得到的快乐。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"29-别将自己的意见强加于人\"\u003e29 别将自己的意见强加于人\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e没有人喜欢接受推销，或被人强迫去做一件事。我们都喜欢按照自己的意愿购买东西，或照自己的意思行动，我们喜欢别人征询我们的愿望、需求和意见。\u003c/li\u003e\n\u003cli\u003e江海之所以能为百谷之王，是因为懂得身处低下，方能成为百谷之王。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"30-善于从他人角度考虑问题\"\u003e30 善于从他人角度考虑问题\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e对方为什么会有那样的思想和行为，其中自有一定的原因。探寻出其中隐藏的原因来，你便得到了了解他人行动或人格的钥匙。\u003c/li\u003e\n\u003cli\u003e永远按照对方的观点去想，由他人的立场去看事，一如由你自己的一样，这或许不难成为影响你终身事业的一个关键因素。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"31-同情对方的意愿\"\u003e31 同情对方的意愿\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e有这么一句神奇的妙语，它可以阻止人们辩论，消除他人产生的厌恶感，并给他人留下一个良好的印象。这句话就是：“我一点也不奇怪你有这种感觉。如果我是你，也会与你的感觉一样。”\u003c/li\u003e\n\u003cli\u003e人类普遍地追求同情。儿童迫切地显示他的伤害；或甚至故意割伤或打伤，以收获大量的同情。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"32-激发他人高尚的动机\"\u003e32 激发他人高尚的动机\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e每个人的行事都有两个好理由：一是看起来很好；一是的确很好。\u003c/li\u003e\n\u003cli\u003e我们很难找到一个放之四海皆有效的法则，任何事情都会有一些例外。\u003c/li\u003e\n\u003cli\u003e如果没有迹象显示顾客有问题，最好要相信他们是诚心诚意愿意付清账款的。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"33-戏剧性地表现自己的意图\"\u003e33 戏剧性地表现自己的意图\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e这是一个充满戏剧性的时代，仅靠一点点语言的叙述是不够的。真理需要我们使之更生动、更有趣、更加戏剧化，你必须恰当运用表演的艺术。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"34-让他人不断面临挑战\"\u003e34 让他人不断面临挑战\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e要做成事的办法，是激起竞争，不是勾心斗角的竞争，而是相互取胜的欲望。\u003c/li\u003e\n\u003cli\u003e取胜的欲望！挑战！激发！激发他人产生一种向上的精神——一种确实有效的方法！\u003c/li\u003e\n\u003cli\u003e提出一个挑战，那是任何成功者都喜爱的一种竞技，一种表现自己的机会；那是证明自身价值、争强斗胜的机会。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"如何更好说服他人-how--to-change-people-without-giving-offense\"\u003e如何更好说服他人 How  to Change People Without Giving Offense\u003c/h2\u003e\n\u003ch3 id=\"35-称赞并欣赏他人\"\u003e35 称赞并欣赏他人\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e当我们听到他人对自己的优点加以称赞以后，再去听一些不愉快的话，自然觉得好受一些。\u003c/li\u003e\n\u003cli\u003e如果你想说服他人，应该首先从称赞与真诚地欣赏开始。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"36-间接委婉地指出他人的错误\"\u003e36 间接委婉地指出他人的错误\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e有许多人在真诚的赞美之后，喜欢拐弯抹角地加上“但是”两个字，然后开始一连串地批评。\u003c/li\u003e\n\u003cli\u003e间接提出别人的错失，要比直接说出口来得温和，且不会引起别人的强烈反感。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"37-不要总是责怪他人\"\u003e37 不要总是责怪他人\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e听别人数说我们的错误很难，但假如对方谦卑地自称他们也并非完美，我们就比较容易接受了。\u003c/li\u003e\n\u003cli\u003e承认一个人本身的错误，就算你还没有改正过来，也可以帮助改善行为。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"38-没有人喜欢受人指使\"\u003e38 没有人喜欢受人指使\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e不教他人做什么，而让他人自己去做，自己在错误中学习。这种办法容易让一个人改正错误，保持个人的尊严，给他一种自重感，他就会与你保持合作，而不是背叛。\u003c/li\u003e\n\u003cli\u003e无礼的命令只会导致长久的怨仇——即使这个命令可以用来改正他人明显的错误。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"39-保全他人的面子\"\u003e39 保全他人的面子\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e保留他人的面子！这是一个何等重要的问题！而我们却很少会考虑到这个问题。\u003c/li\u003e\n\u003cli\u003e纵使别人犯错，而我们是对的，如果没有为别人保留面子，就会毁了一个人。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"40-激励他人获得成功\"\u003e40 激励他人获得成功\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e假如你我要激励我们所接触的人，认识他们所具有的宝藏，我们所能做的比实际上改变的人还多。我们真能改变他们。\u003c/li\u003e\n\u003cli\u003e与我们本来应有的成就相比较，我们不过是半醒着。我们现在只利用我们身心资源的一小部分。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"41-学会给人戴高帽\"\u003e41 学会给人“戴高帽”\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e如果你要在某方面改进一个人，就要做得好像那种特点已经是他的显著特性之一。\u003c/li\u003e\n\u003cli\u003e差不多每一个人——富人、穷人、乞丐、盗贼——保全所赐予他的这诚实的名誉。\u003c/li\u003e\n\u003cli\u003e如果他得到你的尊重，并且你对他的某种能力表示认可，他就很容易受到引导。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"42-鼓励更易使人改正错误\"\u003e42 鼓励更易使人改正错误\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e如果你告诉自己的孩子，丈夫，或他人，他在某件事上真是愚笨，他对某事没有天赋，或者他做的都错了……那么你就差不多消除了他要作出改进的各种动力。\u003c/li\u003e\n\u003cli\u003e宽容他人，鼓励他人，使事情好像容易去做，使对方知道你相信他有能力去做，他对这事有尚未发掘的才干——他为了要争胜就会终夜练习。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"43-学会给他人授权\"\u003e43 学会给他人授权\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e永远使对方乐于做你所提议的事。\u003c/li\u003e\n\u003cli\u003e获得权威，这是人类的一种天性。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"让家庭幸福快乐-ways-to-make-your-family-happy\"\u003e让家庭幸福快乐 Ways to Make Your Family Happy\u003c/h2\u003e\n\u003ch3 id=\"44-切勿喋喋不休\"\u003e44 切勿喋喋不休\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e在所有一切烈火中，地狱魔鬼所发明的狞恶的毁灭爱情的计划，喋喋不休是最致命的。它像毒蛇的毒汁一样，永远侵蚀着人们的生命。\u003c/li\u003e\n\u003cli\u003e要想赢得女人的心，并愿意永远不辞辛劳地取悦自己，最好、最有用、也最不会失败的方法，便是时时全心全意地感谢她、赞美她。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"45-不要试图改造对方\"\u003e45 不要试图改造对方\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e英国伟大的政治家狄斯瑞利说过：“我一生或许会犯许多错误，但我永远在打算为爱情而结婚。”\u003c/li\u003e\n\u003cli\u003e与人交往，第一件应学的事情就是不要干涉他们自己快乐的特殊方法，如果那些方法不激烈地与我们相冲突的话。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"46-不要批评对方\"\u003e46 不要批评对方\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e在所有婚姻中，有50％以上是失败的。\u003c/li\u003e\n\u003cli\u003e使许多罗曼之梦撞击离婚礁石的一个原因，就是因为批评——无用的，令人心碎的批评\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"47-真诚地欣赏对方\"\u003e47 真诚地欣赏对方\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e男性对于女性追求美观及装束得体的努力应表示欣赏。所有的男人都忘了，如果他们曾有过觉察的话，将知道女性是如何注重自己的衣着。\u003c/li\u003e\n\u003cli\u003e对很多男人来讲，他们也许想不起自己5年前穿的什么衣服，什么衬衫，他们也丝毫没有意思去记住它们，但女人则不同。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"48-注重生活中的小事\"\u003e48 注重生活中的小事\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e女人对生日及纪念日很重视，这永远是一种女性的神秘。\u003c/li\u003e\n\u003cli\u003e终究，婚姻就是一串琐事。忽视这一事实，将造成家庭生活的灾难。\u003c/li\u003e\n\u003cli\u003e在很多婚姻破裂的事件中，并非所有的家庭都是因为一些重大的事件而过不下去，相反，大多数人往往是由于一些小小的事情。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"49-家庭内部也应有礼\"\u003e49 家庭内部也应有礼\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e无礼，这是侵蚀爱情的祸水。\u003c/li\u003e\n\u003cli\u003e惟一真实地对我们说出刻薄、侮辱、伤感情的话的人，都是我们自家的人。\u003c/li\u003e\n\u003cli\u003e婚姻幸福的普通人，比幽居的天才快乐得多。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"50-如何与女性相处\"\u003e50 如何与女性相处\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e今日的婚姻是否美满，要看双方的心理是否成熟。也就是说，他们是否了解自己、了解自己与对方的关系，并且愿意彼此分担责任，以增进对方的快乐与福利。\u003c/li\u003e\n\u003cli\u003e婚姻是我们是否成熟的最好试金石。你若不想关心别人，最好是自己独处。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"51-如何与男性相处\"\u003e51 如何与男性相处\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e要想当好听众，首先要注意听讲。眼睛不要四处张望，或显出烦躁不安的样子。\u003c/li\u003e\n\u003cli\u003e许多男性都把女性形容得唠叨不休，认为她们话讲得过多。他们真正的意思是：根本找不到机会可让自己也发表一些长篇大论。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"52-不要做婚姻的文盲\"\u003e52 不要做婚姻的文盲\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e所有婚姻的专家，都同意性的配合是绝对的必需。\u003c/li\u003e\n\u003cli\u003e“性”，众所公认的是生活中最重要的问题。无疑的，那也是造成男女快乐破裂原因的东西。\u003c/li\u003e\n\u003cli\u003e快乐的婚姻，很少是机会的产物，他们如建筑物似的，必需有理智的用心去设计。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"如何是你变得更加成熟-how-to-make-yourself-mature\"\u003e如何是你变得更加成熟 How to Make Yourself Mature\u003c/h2\u003e\n\u003ch3 id=\"53-不要光踢椅子\"\u003e53 不要光踢椅子\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e一个人迈向成熟的第一步应该是敢于承担责任。我们生活于世，就要面对生命中的许多责任。\u003c/li\u003e\n\u003cli\u003e对那些不成熟的人来说，他们永远都可以找到一些理由，以解脱他们自身的某些缺点或不幸。\u003c/li\u003e\n\u003cli\u003e把人的生活改造得更美好才重要，而不是整日沉溺在自怜的深渊。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"54-困难并不意味着不幸\"\u003e54 困难并不意味着不幸\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e对喜欢规避责任的人来说，困难则成了最好的挡箭牌。\u003c/li\u003e\n\u003cli\u003e假如每个人成天都认为环境不好，当然就会把自己的过失诿诸“缺陷”或种种其他原因。\u003c/li\u003e\n\u003cli\u003e不成熟的人随时可以把自己与众不同的地方看成是缺陷、是障碍，然后期望自己能受到特别的待遇。成熟的人则不然。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"55-摆脱生活中的不幸\"\u003e55 摆脱生活中的不幸\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e要想摆脱不幸的阴影，最好的一种方法便是提升我们自己去帮助别人。\u003c/li\u003e\n\u003cli\u003e不幸遭遇并非就是世界末日。有时候，它还是促使我们采取行动的催化剂，对改善状况大有必要。\u003c/li\u003e\n\u003cli\u003e生命并不是一帆风顺的幸福之旅，而是时时摆动在幸与不幸、沉与浮、光明与黑暗之间的模式里。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"56--拥有自己的信仰\"\u003e56  拥有自己的信仰\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e我们必须信仰某些事物。但是，假如我们没有就此信仰去采取行动，一切仍然无用。只有信心而没有作为，是无济于事的。\u003c/li\u003e\n\u003cli\u003e人不是因为没有信心而跌倒，而是因为不能把信念化成行动，并且不顾一切地坚持到底。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"57-你是独一无二的\"\u003e57 你是独一无二的\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e每个人的生活遭遇都是独一无二的。尽管构成人体的基本因素相同，但我们每个人的生命都很奇妙地自成一格，绝不与人雷同。\u003c/li\u003e\n\u003cli\u003e心灵的成熟过程，是持续不断的自我发现、自我探寻的过程。除非我们先了解自己，否则我们很难去了解别人。\u003c/li\u003e\n\u003cli\u003e兴奋的品质是我们工作能否成功的极重要因素，因为情绪的动力是促成我们向前进的力量。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"58-学会喜欢你自己\"\u003e58 学会喜欢你自己\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e成熟的人会适度地忍耐自己，正如他适度地忍耐别人一样。他不会因自己的一些弱点而感到活得很痛苦。\u003c/li\u003e\n\u003cli\u003e不喜欢自己的人，表现在外的症状之一便是过度自我挑剔。\u003c/li\u003e\n\u003cli\u003e独处对我们的心灵运动十分有益处，就好像新鲜空气对我们的身体极有帮助一样。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"59-不要盲从因袭\"\u003e59 不要盲从因袭\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e要想成为真正的“人”，必须先是个不盲从因袭的人。你心灵的完整性是不可侵犯的。\u003c/li\u003e\n\u003cli\u003e年轻人或涉世未深的人，常常会害怕自己与众不同，无论是穿着、行动、言谈或思考模式，都尽量与自己所属的圈子认同。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"60-不要令人生厌\"\u003e60 不要令人生厌\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e假如预防是最好的治疗，那么，在治疗疾病之前，我们须得先诊断出该疾病的原因来。\u003c/li\u003e\n\u003cli\u003e言语乏味的人不但不了解自己、不喜欢自己，甚至也不能保持自己的自然天性。\u003c/li\u003e\n\u003cli\u003e人若是心灵成熟，或心智继续成长，就能与人讨论任何事情而不致引人生厌。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"61-为什么别人要喜欢你\"\u003e61 为什么别人要喜欢你\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e赢得别人注意的最好方法，是不要去担心结果如何，或在意别人是否喜欢我们。只要我们开始采取行动，努力去实践那些必须完成的事项即可。\u003c/li\u003e\n\u003cli\u003e得到友谊的最佳方法，是必须注重施予，而不是获得——但应该是亲自赢取得来，而不是靠一时的吸引或哄骗。\u003c/li\u003e\n\u003cli\u003e爱是人类能够进步的基础，也是我们与他人交往的桥梁，更是衡量一个人是否成熟的依据。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"走出孤独忧虑的人生-perfect-ways-to-conquer-worry\"\u003e走出孤独忧虑的人生 Perfect Ways to Conquer Worry\u003c/h2\u003e\n\u003ch3 id=\"62-孤独是现代人的通病\"\u003e62 孤独是现代人的通病\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e许多寂寞孤独的人之所以会如此，是因为他们不了解爱和友谊并非是从天而降的礼物。一个人要想得到他人的欢迎，或被人接纳，一定要付出许多努力和代价。\u003c/li\u003e\n\u003cli\u003e我们若想克服孤寂，就必须远离自怜的阴影，勇敢走入充满光亮的人群。我们要去认识人，去结交新的朋友。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"63-孤独是现代人的通病\"\u003e63 孤独是现代人的通病\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e许多寂寞孤独的人之所以会如此，是因为他们不了解爱和友谊并非是从天而降的礼物。一个人要想得到他人的欢迎，或被人接纳，一定要付出许多努力和代价。\u003c/li\u003e\n\u003cli\u003e我们若想克服孤寂，就必须远离自怜的阴影，勇敢走入充满光亮的人群。我们要去认识人，去结交新的朋友。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"64-消除忧虑的灵丹妙药\"\u003e64 消除忧虑的灵丹妙药\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e能接受既成事实，这是克服随之而来的任何不幸的第一步。\u003c/li\u003e\n\u003cli\u003e能接受最坏的情况，就能在心理上让你发挥出新的能力。\u003c/li\u003e\n\u003cli\u003e忧虑最大的坏处就是摧毁我们集中精神的能力，一旦忧虑产生，我们的思想就会到处乱转，从而丧失作出决定的能力。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"65-运用亚里士多德法则\"\u003e65 运用亚里士多德法则\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e如果我们将忧虑的时间，用来寻找解决问题的答案，那忧虑就会在我们智慧的光芒下消失。\u003c/li\u003e\n\u003cli\u003e一旦作出决定，当天就要付诸行动，同时要完全不理会责任问题，也不必担心后果。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"66-将忧虑减半的四个步骤\"\u003e66 将忧虑减半的四个步骤\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e究竟出了什么问题？\u003c/li\u003e\n\u003cli\u003e问题的起因是什么？\u003c/li\u003e\n\u003cli\u003e你能找到哪些解决办法？\u003c/li\u003e\n\u003cli\u003e你决定用哪种办法？\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"67-让忙碌消除你的忧虑\"\u003e67 让忙碌消除你的忧虑\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e工作——让你忙着——是精神疾病最好的治疗剂。\u003c/li\u003e\n\u003cli\u003e忧虑最能伤害你的时候，不是在你有行动的时候，而是在一天的工作做完了之后。\u003c/li\u003e\n\u003cli\u003e要是我们为什么事情担心的话，让我们记住，我们可以把工作当做很好的古老治疗法！\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"68-生活在今天的密封舱里\"\u003e68 生活在今天的密封舱里\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e我们首要去做的事情不是去观望遥远的将来，而是去做手边的清晰之事。\u003c/li\u003e\n\u003cli\u003e为明日作好准备的最佳办法就是集中你所有的智慧、热忱，把今天的工作做得尽善尽美。\u003c/li\u003e\n\u003cli\u003e一个好想法与坏想法的差别是，好想法考虑到原因和结果，从而产生一个符合逻辑、富有建设性的计划；而坏想法通常会导致一个人的紧张和精神崩溃。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"69-不要因小事而垂头丧气\"\u003e69 不要因小事而垂头丧气\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e我们通常都能很勇敢地面对生活里那些大的危机，却被那些小事情搞得垂头丧气。\u003c/li\u003e\n\u003cli\u003e大多数时间里，要想克服因为一些小事情引起的困扰，只要把自己的看法和重点转移一下就可以了。你就会找到一个新的、使你开心一点的想法。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"70-计算事情发生的概率\"\u003e70 计算事情发生的概率\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e我们所担心的事情中，有99％根本就不会发生。\u003c/li\u003e\n\u003cli\u003e如果我们根据概率法则考虑一下我们的忧虑是否值得，并真正做到长时间内不再忧虑，90％的忧虑就可能消除。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"71-适应不可避免的事实\"\u003e71 适应不可避免的事实\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e事情既然如此，就不会另有他样。\u003c/li\u003e\n\u003cli\u003e我们所有迟早要学到的东西，就是必须接受和适应那些不可避免的事实。\u003c/li\u003e\n\u003cli\u003e快乐之道无他——我们的意志力所不及的事情，不要去忧虑。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"72-让忧虑到此为止\"\u003e72 让忧虑“到此为止”\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e学会对自己说：“这件事情只值得我担一点点心，没有必要去操更多的心。”\u003c/li\u003e\n\u003cli\u003e林肯认为：“一个人实在没有时间把他的半辈子花在争吵上，要是那个人不再攻击我，我就不会记他的仇。”\u003c/li\u003e\n\u003cli\u003e获得心理平静的最大秘密之一，就是要有正确的价值观念。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"73-不要试着去锯木屑\"\u003e73 不要试着去锯木屑\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e惟一可以使过去的错误具有价值的方法，就是冷静地分析我们过去的错误，并从错误中得到教训，然后再把错误忘掉。\u003c/li\u003e\n\u003cli\u003e当你开始为那些已经做完或过去的事忧虑的时候，你不过是在锯一些木屑。\u003c/li\u003e\n\u003cli\u003e聪明的人永远不会坐在那里为他们的损失而悲伤，却会很高兴地想办法来弥补他们的创伤。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"必要因为工作和金钱烦恼-dont-worry-about-your-workand-money\"\u003e必要因为工作和金钱烦恼 Don\u0026rsquo;t Worry About Your Workand Money\u003c/h2\u003e\n\u003ch3 id=\"74-一生最重要的决定\"\u003e74 一生最重要的决定\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e当你到了18岁时，你可能面临着两个重大的决定：你将如何谋生？你选择一个什么样的人生伴侣？\u003c/li\u003e\n\u003cli\u003e一个人只要无限热爱自己的工作，他就可能获得成功。\u003c/li\u003e\n\u003cli\u003e选择一个合适的工作，这对你的健康十分重要。\u003c/li\u003e\n\u003cli\u003e让我们为那些找到自己心爱工作的人祝福，他们无须祈求其他幸福了。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"75-70的烦恼与金钱有关\"\u003e75 70％的烦恼与金钱有关\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e人类70％的烦恼都跟金钱有关，而人们在处理金钱时，却往往意外地盲目。\u003c/li\u003e\n\u003cli\u003e令多数人感到烦恼的，并不是他们没有足够的钱，而是不知道如何支配手中已有的钱。\u003c/li\u003e\n\u003cli\u003e即使我们拥有整个世界，我们一天也只能吃三餐，一次也只能睡一张床——即使一个挖水沟的人也能做到这一点，也许他们比洛克菲勒吃得更津津有味，睡得更安稳。如果我懂得如何解决每个人的财务烦恼，我就\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"76-夫妻间的职业冲突\"\u003e76 夫妻间的职业冲突\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e最适合某个人的工作，或能够使他感到快乐的工作，并不一定就会使他富有或过上好日子。\u003c/li\u003e\n\u003cli\u003e疑虑是我们心中的叛逆者，由于害怕去追求，将会使我们失去我们通常能够赢得的东西。\u003c/li\u003e\n\u003cli\u003e上帝的确偏爱勇敢和坚强的心灵。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"77-不要入不敷出\"\u003e77 不要入不敷出\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e没有计划地花钱，就等于让肉贩、服装商、家具店……都来分享你的收入。\u003c/li\u003e\n\u003cli\u003e有计划的，或是有预算的花费，可以保证你和家人能够从你的收入里得到公平的分享。\u003c/li\u003e\n\u003cli\u003e预算是一张蓝图、一个经过计划的方法，用以帮助你从你的收入中得到更大的好处。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"防止疲劳永葆活力-prevent-fatigueand--worry-and-keep-your-energy-high\"\u003e防止疲劳，永葆活力 Prevent Fatigueand  Worry and Keep Your Energy High\u003c/h2\u003e\n\u003ch3 id=\"78-保持每日多清醒一小时\"\u003e78 保持每日多清醒一小时\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e防止疲劳和忧虑的第一条规则是，经常休息，在你感到疲倦以前就休息。\u003c/li\u003e\n\u003cli\u003e爱迪生认为他无穷的精力和耐力，都来自他能随时想睡就睡的习惯。\u003c/li\u003e\n\u003cli\u003e休息并不是绝对什么事都不做，休息就是“修补”。\u003c/li\u003e\n\u003cli\u003e在你感到疲劳之前先休息，这样你每天清醒的时间，就可以多增加一小时。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"79-说出你的心事卡\"\u003e79 说出你的心事卡\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e只要一个病人能够说话——单单说出来，就能够解除他心中的忧虑。\u003c/li\u003e\n\u003cli\u003e不要为别人的缺点过于操心。\u003c/li\u003e\n\u003cli\u003e今晚上床之前，先安排好明天工作的程序。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"80-不再为失眠而忧虑\"\u003e80 不再为失眠而忧虑\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e为失眠症而忧虑，对你伤害的程度，远远超过失眠症本身。\u003c/li\u003e\n\u003cli\u003e治疗失眠症的最好办法，就是使你自己的体力劳动到疲倦的程度。\u003c/li\u003e\n\u003c/ul\u003e","title":"《人性的弱点》"},{"content":" 通过elasticSearch 结合shell 批量删除 ES中大量无效index\n正则获取所有无效index信息到备选删除记录文件中 1 2 # 通过 curl 获取 es 所有index信息，再通过 grep正则过滤出我们要删除的index，awk 只获取index名称 到 index.log 文件中 curl \u0026#34;${server}/_cat/indices\u0026#34; | grep \u0026#39;real_time_sales_temporary_new_2019092408*\u0026#39; | awk \u0026#39;{print $3}\u0026#39; \u0026gt; index.log 完整自动脚本如下 循环我们过滤出得无效index列表，执行 delete 操作\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash # atovk 20190924 # elasticsearch 服务地址 server=\u0026#34;http://10.12.11.1:9346\u0026#34; # 获取 正则查询到的 index real_time_sales_temporary_new_2019092408* curl \u0026#34;${server}/_cat/indices\u0026#34; | grep \u0026#39;real_time_sales_temporary_new_2019092408*\u0026#39; | awk \u0026#39;{print $3}\u0026#39; \u0026gt; index.log # 循环删除相关无效index cat index.log | while read line do echo \u0026#34;${line}\u0026#34; curl -XDELETE \u0026#34;${server}/${line}\u0026#34; done ","permalink":"https://ohoo.dev/post/bigdata/elasticsearch_batch_delete_indexs/","summary":"\u003cblockquote\u003e\n\u003cp\u003e通过elasticSearch 结合shell 批量删除 ES中大量无效index\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"正则获取所有无效index信息到备选删除记录文件中\"\u003e正则获取所有无效index信息到备选删除记录文件中\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 通过 curl 获取 es 所有index信息，再通过 grep正则过滤出我们要删除的index，awk 只获取index名称 到 index.log 文件中\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eserver\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/_cat/indices\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep \u003cspan class=\"s1\"\u003e\u0026#39;real_time_sales_temporary_new_2019092408*\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e awk \u003cspan class=\"s1\"\u003e\u0026#39;{print $3}\u0026#39;\u003c/span\u003e \u0026gt; index.log\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"完整自动脚本如下\"\u003e完整自动脚本如下\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e循环我们过滤出得无效index列表，执行 delete 操作\u003c/p\u003e","title":"批量删除ES中无效的index / Elasticsearch batch delete indexs"},{"content":" 通过定时crontab 调用远程执行sql新建表结构\ncreate_table.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/bash # 生成明天的日期 tomorrow=$(date -d \u0026#34;+1 days\u0026#34; \u0026#34;+%Y%m%d\u0026#34;) echo next date: ${tomorrow} # sql文件脚本中的日期替换为明日的日期 sed -i \u0026#34;s/\\([0-9]\\{8\\}\\)/${tomorrow}/g\u0026#34; /home/crontab/create_table.sql echo `cat /home/crontab/create_table.sql | head -n 1` # 通过执行mysql执行文件中的sql 脚本创建以命题啊日期结尾的表名 mysql -uroot -p123456 -h10.0.56.20 -Dpangu\u0026lt;/home/wangjun/crontab/create_table.sql 加入到 crontab 中每日生成下一日的空表 别忘了给脚本加执行权限\n1 2 3 4 5 6 7 8 9 # 每天一点执行 0 1 * * * sh /home/wangjun/crontab/create_table.sh # 创建 crontab 任务 crontab /home/wangjun/crontab/crontest.cron # 查看crontab 任务 crontab -l ","permalink":"https://ohoo.dev/post/linux/linux_ctontab_timely_operational/","summary":"\u003cblockquote\u003e\n\u003cp\u003e通过定时crontab 调用远程执行sql新建表结构\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"create_tablesh\"\u003ecreate_table.sh\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#!/bin/bash\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 生成明天的日期\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003etomorrow\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003edate -d \u003cspan class=\"s2\"\u003e\u0026#34;+1 days\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;+%Y%m%d\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e next date: \u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003etomorrow\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# sql文件脚本中的日期替换为明日的日期\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esed -i \u003cspan class=\"s2\"\u003e\u0026#34;s/\\([0-9]\\{8\\}\\)/\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003etomorrow\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/g\u0026#34;\u003c/span\u003e /home/crontab/create_table.sql\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"sb\"\u003e`\u003c/span\u003ecat /home/crontab/create_table.sql \u003cspan class=\"p\"\u003e|\u003c/span\u003e head -n 1\u003cspan class=\"sb\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 通过执行mysql执行文件中的sql 脚本创建以命题啊日期结尾的表名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emysql -uroot -p123456 -h10.0.56.20 -Dpangu\u0026lt;/home/wangjun/crontab/create_table.sql\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"加入到-crontab-中每日生成下一日的空表\"\u003e加入到 crontab 中每日生成下一日的空表\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e别忘了给脚本加执行权限\u003c/p\u003e","title":"linux下crontab定时在mysql中生成明日需要使用的空表 / Timely operational on linux crontab"},{"content":" 参考 kudu 官方指导手册\nfuture Fast processing of OLAP workloads.\nOLAP 级数数据处理能力\nIntegration with MapReduce, Spark and other Hadoop ecosystem components.\n可集成大数据常用组建(MR,spark,hive,impala,\u0026hellip;)\nTight integration with Apache Impala, making it a good, mutable alternative to using HDFS with Apache Parquet.\n对impala的完全支持，可作为HDFS存储parquet方案的替代\nStrong but flexible consistency model, allowing you to choose consistency requirements on a per-request basis, including the option for strict-serializable consistency.\n一致性\nStrong performance for running sequential and random workloads simultaneously.\n强悍的并行顺序和随机的工作负载\nEasy to administer and manage.\n易维护\nHigh availability.\n高可用\nStructured data model.\n机构化数据模型\nKudu Impala 集成使用特性 CREATE/ALTER/DROP TABLE INSERT UPDATE/DELETE 表名称变更 主键列修改 重命名,增加,删除 非主键列 添加删除range分区 Kudu 表设计 列尽量使用明确的类型，不要单一string类型\nkudu 对字段有存储优化，无脑string导致kudu存储优化无效\n主键\n主键必须在建标时指定，可以是一个字段，也可以是多个字段组合 单一字段时不适合将主键字段设计得过大，否则批量复制表时导致插入删除数据时性能降低（主键缓存过大，磁盘询盘频繁）\n主键字段中不能有空字符串，布尔，浮点型类型等 分区\nkudu的 tablet是数据行在分区中存储的位置（tablet与partition一一对应）\nkudu 没有默认分区，如果不指定就会写到一个tablet中\n建标必须指定分区，否则表性能无法保证\nhash 分区\n通过指定一个或多个字段进行hash分桶，判断数据分区位置(默认情况下，使用 PARTITION BY HASH 时，整个主键是散列的)\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 create table kudu_test.real_time_sales_temporary_kuduc ( sdt String, shopId String, updateTime String, serialId String, sheetId String, goodsId String, key_by String, timeFrame String, regionId String, regionName String, shopName String, serviceRegionId String, serviceRegionName String, shopBelongId String, shopBelongName String, primary key(sdt,shopId,updatetime,serialId,sheetid) ) PARTITION by hash(sdt,shopId) partitions 32 COMMENT \u0026#39;销售流水表C\u0026#39; STORED AS kudu; 范围分区\n通过指定数据字段的值范围，判断数据分区位置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 CREATE TABLE cust_behavior_table ( id BIGINT, sku STRING, salary STRING, edu_level INT, usergender STRING, group STRING, city STRING, postcode STRING, last_purchase_price FLOAT, last_purchase_date BIGINT, category STRING, rating INT, fulfilled_date BIGINT, PRIMARY KEY (id, sku) ) PARTITION BY RANGE (sku) ( PARTITION VALUES \u0026lt; ‘g’, PARTITION ‘g’ \u0026lt;= VALUES \u0026lt; ‘o’, PARTITION ‘o’ \u0026lt;= VALUES \u0026lt; ‘u’, PARTITION ‘u’ \u0026lt;= VALUES ) STORED AS KUDU TBLPROPERTIES( ‘kudu.table_name’ = ‘cust_behavior_1 ‘,’kudu.master_addresses’ = ‘hadoop5:7051’); 混合分区（hash + range）\n在hash分区下产生range分区，分区数量是 hash分区 * range分区 数量 Partitioning Strategies\nStrategy Writes Reads Tablet Growth range(time) ✗ - all writes go to latest partition ✓ - time-bounded scans can be pruned ✓ - new tablets can be added for future time periods hash(host, metric) ✓ - writes are spread evenly among tablets ✓ - scans on specific hosts and metrics can be pruned ✗ - tablets could grow too large 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 CREATE TABLE cust_behavior_1 ( id BIGINT, sku STRING, salary STRING, edu_level INT, usergender STRING, group STRING, city STRING, postcode STRING, last_purchase_price FLOAT, last_purchase_date BIGINT, category STRING, rating INT, fulfilled_date BIGINT, PRIMARY KEY (id, sku) ) PARTITION BY HASH (id) PARTITIONS 4, RANGE (sku) ( PARTITION VALUES \u0026lt; ‘g’, PARTITION ‘g’ \u0026lt;= VALUES \u0026lt; ‘o’, PARTITION ‘o’ \u0026lt;= VALUES \u0026lt; ‘u’, PARTITION ‘u’ \u0026lt;= VALUES ) STORED AS KUDU TBLPROPERTIES( ‘kudu.table_name’ = ‘cust_behavior_1 ‘,’kudu.master_addresses’ = ‘hadoop5:7051’); 混合分区 （hash + hash）\nhash + hash 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 CREATE TABLE cust_behavior_1 ( id BIGINT, sku STRING, salary STRING, edu_level INT, usergender STRING, group STRING, city STRING, postcode STRING, last_purchase_price FLOAT, last_purchase_date BIGINT, category STRING, rating INT, fulfilled_date BIGINT, PRIMARY KEY (id, sku) ) PARTITION BY HASH (id) PARTITIONS 4, HASH (id) PARTITIONS 4 STORED AS KUDU TBLPROPERTIES( ‘kudu.table_name’ = ‘cust_behavior_1 ‘,’kudu.master_addresses’ = ‘hadoop5:7051’); kudu表限制\n表列数别太多\n列数量不要超过300个\n字段内容别太大\n单个字段内容不要超过 64KB\n行数据大小\n理论上 64KB * 300, 建议不要超过这个理论值.\n有效标识\n表列明/字段名 必须为UTF-8格式且大小不能超过256bytes\n主键不可变\nKudu不允许您在创建表后更改行中主键内容\n主键列不允许变更\nKudu不允许您在创建表后更改主键列\n分区可修改，但分区方式不可修改\n除了添加或删除范围分区之外，Kudu不允许您在创建后更改表的分区方式\n表类型不允许变更\nKudu不允许更改列的类型。\n分区拆分合并\n创建表后，无法拆分或合并分区。\n优化\n对于大型表格，如事实表，目标是在集群中拥有核心数量的 tablets 。 对于小型表格（如维度表），目标是足够数量的 tablets ，每个 tablets 的大小至少为 1 GB 。 ","permalink":"https://ohoo.dev/post/bigdata/kudu_table_schema_design/","summary":"\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://kudu.apache.org/docs/schema_design.html\"\u003e参考 kudu 官方指导手册\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"future\"\u003efuture\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFast processing of OLAP workloads.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOLAP 级数数据处理能力\u003c/p\u003e\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIntegration with MapReduce, Spark and other Hadoop ecosystem components.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e可集成大数据常用组建(MR,spark,hive,impala,\u0026hellip;)\u003c/p\u003e\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTight integration with Apache Impala, making it a good, mutable alternative to using HDFS with Apache Parquet.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e对impala的完全支持，可作为HDFS存储parquet方案的替代\u003c/p\u003e","title":"kudu 表设计使用及限制 / Kudu table schema design and limited"},{"content":" OSHI 是用java写的系统监控工具接口，提供主要的监控指标信息，具体接口作用如下：\nmaven 依赖引入 1 2 3 4 5 6 \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;com.github.oshi\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;oshi-core\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;4.0.0\u0026lt;/version\u0026gt; \u0026lt;/dependency\u0026gt; API 操作 1 2 3 4 5 6 7 8 9 // 初始化系统信息对象 SystemInfo systemInfo = new SystemInfo(); // 获取硬件信息 HardwareAbstractionLayer hardware = systemInfo.getHardware(); // 获取操作系统进程相关信息 OperatingSystem operatingSystem = systemInfo.getOperatingSystem(); 操作BIOS系统信息 获取 BIOS 系统信息\n1 2 3 4 5 6 7 8 ComputerSystem computerSystem = hardware.getComputerSystem(); Firmware firmware = computerSystem.getFirmware(); String name = firmware.getName(); String description = firmware.getDescription(); String firmwareManufacturer = firmware.getManufacturer(); String releaseDate = firmware.getReleaseDate(); String firmwareVersion = firmware.getVersion(); 传感器信息 风扇/温度信息\n1 2 3 4 5 Sensors sensors = hardware.getSensors(); int[] sensorsFanSpeeds = sensors.getFanSpeeds(); double sensorsCpuVoltage = sensors.getCpuVoltage(); double sensorsCpuTemperature = sensors.getCpuTemperature(); 内存信息 获取硬件内存信息\n1 2 3 4 5 6 7 GlobalMemory memory = hardware.getMemory(); long memoryTotal = memory.getTotal(); long memoryAvailable = memory.getAvailable(); long memoryPageSize = memory.getPageSize(); VirtualMemory memoryVirtualMemory = memory.getVirtualMemory(); CPU 线程信息 获取机器硬件执行，cpu频率/型号/核心相关信息\n1 2 CentralProcessor processor = hardware.getProcessor(); 显示器信息 显示器相关型号/分辨率之类信息\n1 2 Display[] displays = hardware.getDisplays(); 磁盘信息 当前磁盘的硬件信息，读写状态，分区信息等\n1 2 HWDiskStore[] diskStores = hardware.getDiskStores(); 网卡信息 获取网卡详细信息，mac/ip4/6地址，读写状态，中断/错误等信息\n1 2 NetworkIF[] networkIFs = hardware.getNetworkIFs(); 电源状态 \u0026hellip;\n1 2 PowerSource[] powerSources = hardware.getPowerSources(); 声卡信息 获取名称/描述等\n1 2 SoundCard[] soundCards = hardware.getSoundCards(); USB 信息 获取USB接口信息，可以过滤出正在使用的USB接口，及相关详细信息，true 树形返回\n1 2 UsbDevice[] usbDevices = hardware.getUsbDevices(true); 系统进程相关信息 获取操作系统位数（23/64） 1 2 int bitness = operatingSystem.getBitness(); 获取指定线程下的子线程 传入父进程ID，设置返回进程数量及进程排序方法，返回该父进程下指定数量排序下的子进程数\n1 2 OSProcess[] childProcesses = operatingSystem.getChildProcesses(1, 2, OperatingSystem.ProcessSort.CPU); 获取操作系统类别 linux/MACOS/unix/windows 等\n1 2 String family = operatingSystem.getFamily(); 获取当前系统下所有文件分区信息 获取文件系统分区信息，剩余空间，挂载信息等 系统存储状态\n1 2 3 FileSystem fileSystem = operatingSystem.getFileSystem(); OSFileStore[] fileStores = fileSystem.getFileStores(); 系统生产厂家 能获取系统厂商信息\n1 2 String manufacturer = operatingSystem.getManufacturer(); 获取网络参数 系统中网卡信息，dns信息，域名信息，ip4/6信息\n1 2 3 4 5 6 7 8 NetworkParams networkParams = operatingSystem.getNetworkParams(); String[] dnsServers = networkParams.getDnsServers(); String domainName = networkParams.getDomainName(); String hostName = networkParams.getHostName(); String ipv4DefaultGateway = networkParams.getIpv4DefaultGateway(); String ipv6DefaultGateway = networkParams.getIpv6DefaultGateway(); 获取指定进程信息 传入进程号，获取该进程详细信息，所属组/用户/状态等\n1 2 OSProcess process = operatingSystem.getProcess(1121); 获取但前系统中的进程数 获取当前系统中所有进程数\n1 2 int processCount = operatingSystem.getProcessCount(); 根据排序规则 返回指定线程数 根据排序规则 返回指定线程数\n1 2 OSProcess[] processes = operatingSystem.getProcesses(10, OperatingSystem.ProcessSort.CPU); 获取进程ID list内所有近程 返回指定进程ID下所有进程实例\n1 2 List\u0026lt;OSProcess\u0026gt; processList = operatingSystem.getProcesses(new ArrayList\u0026lt;\u0026gt;()); 获取系统内总线程数 获取系统内所有线程句柄数\n1 2 int threadCount = operatingSystem.getThreadCount(); 获取系统启动时间 1 2 long systemBootTime = operatingSystem.getSystemBootTime(); 获取系统版本信息 1 2 OperatingSystemVersion version = operatingSystem.getVersion(); ","permalink":"https://ohoo.dev/post/java/oshi_system_and_hardware_information/","summary":"\u003cblockquote\u003e\n\u003cp\u003eOSHI 是用java写的系统监控工具接口，提供主要的监控指标信息，具体接口作用如下：\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"maven-依赖引入\"\u003emaven 依赖引入\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;groupId\u0026gt;\u003c/span\u003ecom.github.oshi\u003cspan class=\"nt\"\u003e\u0026lt;/groupId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;artifactId\u0026gt;\u003c/span\u003eoshi-core\u003cspan class=\"nt\"\u003e\u0026lt;/artifactId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;version\u0026gt;\u003c/span\u003e4.0.0\u003cspan class=\"nt\"\u003e\u0026lt;/version\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"api-操作\"\u003eAPI 操作\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 初始化系统信息对象\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eSystemInfo\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esystemInfo\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eSystemInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 获取硬件信息\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eHardwareAbstractionLayer\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ehardware\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esystemInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetHardware\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 获取操作系统进程相关信息\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eOperatingSystem\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eoperatingSystem\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esystemInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetOperatingSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"操作bios系统信息\"\u003e操作BIOS系统信息\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cp\u003e获取 BIOS 系统信息\u003c/p\u003e","title":"java通过oshi获取系统和硬件信息 / Oshi get system and hardware information"},{"content":" java语言下 jdbc 各种数据库的链接方式\nmysql/mariadb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 private static Connection getConn() { String driver = \u0026#34;com.mysql.jdbc.Driver\u0026#34;; String url = \u0026#34;jdbc:mysql://localhost:3306/samp_db\u0026#34;; String username = \u0026#34;root\u0026#34;; String password = \u0026#34;\u0026#34;; Connection conn = null; try { Class.forName(driver); //classLoader,加载对应驱动 conn = (Connection) DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } oracle (1)Oracle JDBC Thin using a ServiceName: 1 2 #jdbc:oracle:thin:@//\u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;/\u0026lt;service_name\u0026gt; #Example: jdbc:oracle:thin:@//192.168.2.1:1521/XE (2)Oracle JDBC Thin using an SID: 1 2 #jdbc:oracle:thin:@\u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;:\u0026lt;SID\u0026gt; #Example: jdbc:oracle:thin:@192.168.2.1:1521:X01A (3)Oracle JDBC Thin using a TNSName: 1 2 #jdbc:oracle:thin:@\u0026lt;TNSName\u0026gt; #Example: jdbc:oracle:thin:@GL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // 获得连接对象 private static Connection getConn() { String driver = \u0026#34;oracle.jdbc.driver.OracleDriver\u0026#34;; String url = \u0026#34;jdbc:oracle:thin:@//127.0.0.1:1521/orcl\u0026#34;; String username = \u0026#34;root\u0026#34;; String password = \u0026#34;\u0026#34;; Connection conn = null; try { Class.forName(driver); //classLoader,加载对应驱动 conn = (Connection) DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } sqlserver 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // sqlserver2012 private static Connection getConn() { String driver = \u0026#34;com.microsoft.sqlserver.jdbc.SQLServerDriver\u0026#34;; String url = \u0026#34;jdbc:sqlserver://localhost:1433;DatabaseName=student\u0026#34;; String username = \u0026#34;root\u0026#34;; String password = \u0026#34;\u0026#34;; Connection conn = null; try { Class.forName(driver); //classLoader,加载对应驱动 conn = (Connection) DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } db2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 private static Connection getConn() { String driver = \u0026#34;com.ibm.db2.jcc.DB2Driver\u0026#34;; String url = \u0026#34;jdbc:db2://10.27.70.33:60000/dbtest:currentSchema=db2inst1\u0026#34;; String username = \u0026#34;root\u0026#34;; String password = \u0026#34;\u0026#34;; Connection conn = null; try { Class.forName(driver); //classLoader,加载对应驱动 conn = (Connection) DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } PostgreSQL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 private static Connection getConn() { String driver = \u0026#34;org.postgresql.Driver\u0026#34;; String url = \u0026#34;jdbc:postgresql://127.0.0.1:5432/test\u0026#34;; String username = \u0026#34;root\u0026#34;; String password = \u0026#34;\u0026#34;; Connection conn = null; try { Class.forName(driver); //classLoader,加载对应驱动 conn = (Connection) DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } greenplum 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 private static Connection getConn() { String driver = \u0026#34;com.pivotal.jdbc.GreenplumDriver\u0026#34;; String url = \u0026#34;jdbc:pivotal:greenplum://10.10.10.10:5432;DatabaseName=mfg\u0026#34;; String username = \u0026#34;root\u0026#34;; String password = \u0026#34;\u0026#34;; Connection conn = null; try { Class.forName(driver); //classLoader,加载对应驱动 conn = (Connection) DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } hana 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 private static Connection getConn() { String driver = \u0026#34;com.sap.db.jdbc.Driver\u0026#34;; String url = \u0026#34;jdbc:sap://172.23.1.123:39015\u0026#34;; String username = \u0026#34;root\u0026#34;; String password = \u0026#34;\u0026#34;; Connection conn = null; try { Class.forName(driver); //classLoader,加载对应驱动 conn = (Connection) DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } hive 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 private static Connection getConn() { /** hiveserver org.apache.Hadoop.hive.jdbc.HiveDriver jdbc:hive://localhost:10000/default hiveserver2 org.apache.Hive.jdbc.HiveDriver jdbc:hive2://localhos:10000/default */ String driver = \u0026#34;org.apache.hive.jdbc.HiveDriver\u0026#34;; String url = \u0026#34;jdbc:hive2://localhos:10000/default\u0026#34;; String username = \u0026#34;root\u0026#34;; String password = \u0026#34;\u0026#34;; Connection conn = null; try { Class.forName(driver); //classLoader,加载对应驱动 conn = (Connection) DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } sybase 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 private static Connection getConn() { String Driver = \u0026#34;com.sybase.jdbc3.jdbc.SybDriver\u0026#34;; //数据库驱动 String url = \u0026#34;jdbc:sybase:Tds:192.168.2.103:5000/SXABC\u0026#34;; // 连接的数据库是SXABC String username = \u0026#34;root\u0026#34;; String password = \u0026#34;\u0026#34;; Connection conn = null; try { Class.forName(driver); //classLoader,加载对应驱动 conn = (Connection) DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } ","permalink":"https://ohoo.dev/post/java/java_jdbc_example_holder/","summary":"\u003cblockquote\u003e\n\u003cp\u003ejava语言下 jdbc 各种数据库的链接方式\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"mysqlmariadb\"\u003emysql/mariadb\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egetConn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;com.mysql.jdbc.Driver\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;jdbc:mysql://localhost:3306/samp_db\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;root\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eClass\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eforName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e//classLoader,加载对应驱动\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eClassNotFoundException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"oracle\"\u003eoracle\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e(1)Oracle JDBC Thin using a ServiceName:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    #jdbc:oracle:thin:@//\u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;/\u0026lt;service_name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    #Example: jdbc:oracle:thin:@//192.168.2.1:1521/XE\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e(2)Oracle JDBC Thin using an SID:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    #jdbc:oracle:thin:@\u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;:\u0026lt;SID\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    #Example: jdbc:oracle:thin:@192.168.2.1:1521:X01A\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e(3)Oracle JDBC Thin using a TNSName:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    #jdbc:oracle:thin:@\u0026lt;TNSName\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    #Example: jdbc:oracle:thin:@GL\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 获得连接对象\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egetConn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;oracle.jdbc.driver.OracleDriver\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;jdbc:oracle:thin:@//127.0.0.1:1521/orcl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;root\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eClass\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eforName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e//classLoader,加载对应驱动\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eClassNotFoundException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"sqlserver\"\u003esqlserver\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"c1\"\u003e// sqlserver2012\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egetConn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;com.microsoft.sqlserver.jdbc.SQLServerDriver\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;jdbc:sqlserver://localhost:1433;DatabaseName=student\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;root\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eClass\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eforName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e//classLoader,加载对应驱动\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eClassNotFoundException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"db2\"\u003edb2\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egetConn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;com.ibm.db2.jcc.DB2Driver\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;jdbc:db2://10.27.70.33:60000/dbtest:currentSchema=db2inst1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;root\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eClass\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eforName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e//classLoader,加载对应驱动\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eClassNotFoundException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"postgresql\"\u003ePostgreSQL\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egetConn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;org.postgresql.Driver\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;jdbc:postgresql://127.0.0.1:5432/test\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;root\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eClass\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eforName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e//classLoader,加载对应驱动\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eClassNotFoundException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"greenplum\"\u003egreenplum\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egetConn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;com.pivotal.jdbc.GreenplumDriver\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;jdbc:pivotal:greenplum://10.10.10.10:5432;DatabaseName=mfg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;root\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eClass\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eforName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e//classLoader,加载对应驱动\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eClassNotFoundException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"hana\"\u003ehana\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egetConn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;com.sap.db.jdbc.Driver\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;jdbc:sap://172.23.1.123:39015\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;root\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eClass\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eforName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e//classLoader,加载对应驱动\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eClassNotFoundException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"hive\"\u003ehive\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egetConn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    hiveserver org.apache.Hadoop.hive.jdbc.HiveDriver\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e                    jdbc:hive://localhost:10000/default\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    hiveserver2 org.apache.Hive.jdbc.HiveDriver\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e                    jdbc:hive2://localhos:10000/default\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    */\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;org.apache.hive.jdbc.HiveDriver\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;jdbc:hive2://localhos:10000/default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;root\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eClass\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eforName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e//classLoader,加载对应驱动\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eClassNotFoundException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"sybase\"\u003esybase\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egetConn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDriver\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;com.sybase.jdbc3.jdbc.SybDriver\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e//数据库驱动\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;jdbc:sybase:Tds:192.168.2.103:5000/SXABC\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 连接的数据库是SXABC\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;root\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eClass\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eforName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edriver\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e//classLoader,加载对应驱动\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eClassNotFoundException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"JDBC链接各种数据库的例子 / Java jdbc example holder"},{"content":"基础快捷键 快捷键 功能 Ctrl + a 跳到本行的行首 Ctrl + e 则跳到页尾 Ctrl + u 删除当前光标前面的文字 ctrl + k 删除当前光标后面的文字 Ctrl + w / Alt + d w删除光标前面的单词的字符,d则删除后面的字符 Alt + Backsapce 删除当前光标后面的单词;误删使用Ctrl + y进行恢复, Ctrl + L进行清屏操作 ctrl + a 光标移到行首 ctrl + b 光标左移一个字母 ctrl + c 杀死当前进程 ctrl + d 退出当前 Shell ctrl + e 光标移到行尾 ctrl + h 删除光标前一个字符，同 backspace 键相同 ctrl + k 清除光标后至行尾的内容 ctrl + l 清屏，相当于clear ctrl + r 搜索之前打过的命令.会有一个提示，根据你输入的关键字进行搜索bash的 history 快捷键 快捷键 功能 ctrl + u 清除光标前至行首间的所有内容 ctrl + w 移除光标前的一个单词 ctrl + t 交换光标位置前的两个字符 ctrl + y 粘贴或者恢复上次的删除 ctrl + d 删除光标所在字母; 注意: (backspace及ctrl + h)是删除光标前的字符. ctrl + f 光标右移 ctrl + z 将进程转到后台运行,fg命令恢复.比如top -d1 然后ctrl + z到后台fg重新恢复 esc组合 快捷键 快捷键 功能 esc + d 删除光标后的一个词 esc + f 往右跳一个词 esc + b 往左跳一个词 esc + t 交换光标位置前的两个单词 ","permalink":"https://ohoo.dev/post/linux/linux_teminal_option/","summary":"\u003ch2 id=\"基础快捷键\"\u003e基础快捷键\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eCtrl + a\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e跳到本行的行首\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eCtrl + e\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e则跳到页尾\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eCtrl + u\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删除当前光标前面的文字\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + k\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删除当前光标后面的文字\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eCtrl + w\u003c/code\u003e / \u003ccode\u003eAlt + d\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003ew删除光标前面的单词的字符,d则删除后面的字符\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eAlt + Backsapce\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删除当前光标后面的单词;误删使用\u003ccode\u003eCtrl + y\u003c/code\u003e进行恢复, \u003ccode\u003eCtrl + L\u003c/code\u003e进行清屏操作\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + a\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e光标移到行首\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + b\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e光标左移一个字母\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + c\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e杀死当前进程\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + d\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e退出当前 Shell\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + e\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e光标移到行尾\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + h\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删除光标前一个字符，同 backspace 键相同\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + k\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e清除光标后至行尾的内容\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + l\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e清屏，相当于clear\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + r\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e搜索之前打过的命令.会有一个提示，根据你输入的关键字进行搜索bash的\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"history-快捷键\"\u003ehistory 快捷键\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + u\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e清除光标前至行首间的所有内容\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + w\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e移除光标前的一个单词\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + t\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e交换光标位置前的两个字符\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + y\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e粘贴或者恢复上次的删除\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + d\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删除光标所在字母; 注意: (\u003ccode\u003ebackspace\u003c/code\u003e及\u003ccode\u003ectrl + h\u003c/code\u003e)是删除光标前的字符.\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + f\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e光标右移\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ectrl + z\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e将进程转到后台运行,\u003ccode\u003efg\u003c/code\u003e命令恢复.比如top -d1 然后\u003ccode\u003ectrl + z\u003c/code\u003e到后台\u003ccode\u003efg\u003c/code\u003e重新恢复\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"esc组合-快捷键\"\u003eesc组合 快捷键\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eesc + d\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删除光标后的一个词\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eesc + f\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e往右跳一个词\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eesc + b\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e往左跳一个词\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eesc + t\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e交换光标位置前的两个单词\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"Linux 命令行终端快捷键 / Linux terminal shortcuts"},{"content":" 域名解析类型详解\n1.主机[A]记录 描述: 主机地址记录。在 DNS 域名与 IP 地址之间建立映射关系\n语法: owner class ttl A IP_v4_address\n例子: host1.example.microsoft.com. IN A 127.0.0.1\n2.别名[CNAME] 描述: 用来表示用在该区域中的其它资源记录类型中已指定名称的替补或别名 DNS 域名。\n语法: owner ttl class AFSDB subtype server_host_name\n例子: aliasname.example.microsoft.com. AFSDB 1 truename.example.microsoft.com.\n3.主机信息[HINFO] 描述: 用来说明映射到特定 DNS 主机名的 CPU 类型和操作系统类型的 RFC-1700 保留字符串类型，这个信息可以被应用程序通信协议使用。\n语法: owner ttl class HINFO cpu_type os_type\n例子: my-computer-name.example.microsoft.com. HINFO INTEL-386 WIN32\n4.邮箱[MB] 描述: 用来将指定的域邮箱名映射到这个邮箱的主机的当前区域中的主机地址记录\n语法: owner ttl class MB mailbox_hostname\n例子: mailbox.example.microsoft.com. MB mailhost1.example.microsoft.com\n5.邮箱或通信信息 MINFO 描述: 用来指定负责维护该记录中特定通信名单或邮箱的联系域邮箱名称。同时，还被用来指定接收与该记录中特定通信名单或邮箱有关的错误信息的邮箱\n语法: owner ttl class MINFO responsible_mailbox error_mailbox\n例子: administrator.example.microsoft.com. MINFO resp-mbox.example.microsoft.com err-mbox.example.microsoft.com\n6.邮件交换器 [MX] 描述: 用来向特定邮件交换器提供消息路由，该主机作为指定 DNS 域名的邮件交换器。MX 记录需要一个16-位整数来表示消息路由中的主机优先级，多个邮件交换在消息一中被指定。对于这个记录类型中的每个邮件交换主机，需要一个相应的主机地址类型记录。\n语法: owner ttl class MX preference mail_exchanger_host\n例子: example.microsoft.com. MX 10 mailserver1.example.microsoft.com\n7.指针记录 [PTR] 描述:用来指向域名空间中的某个位置。PTR记录通常在特殊域中来执行地址到名称镜像的反向搜索。每个记录提供要指向域名称空间的某个其它位置的简单数据。\n语法: owner ttl class PTR targeted_domain_name\n例子: 1.0.0.10.in-addr.arpa. PTR host.example.microsoft.com.\n8.服务记录 [SRV] 描述: SRV 资源记录允许管理员使用单一 DNS 域的多个服务器，容易的用管理功能将 TCP/IP 服务从一个主机移到另一个主机，并且将服务提供的程序主机分派为服务的主服务器，将其它的分派为辅助\n语法: service.protocol.name ttl class SRV preference weight port target\n例子: ldap.tcp.ms-dcs SRV 0 0 389 dc1.example.microsoft.com SRV 10 0 389 dc2.example.microsoft.com\n9.已知服务记录 [WKS] 描述: 用来描述一个特定 IP 地址上特定通讯协议支持的 TCP/IP 服务，它提供 TCP 和 UDP 可使用性信息。如果服务器同时支持 TCP 和 UDP 的已知服务，或者有多个支持服务的 IP 地址，多个 WKS 记录会被使用\n语法: owner ttl class WKS address protocol service_list\n例子: example.microsoft.com. WKS 10.0.0.1 TCP ( telnet smtp ftp ) 在\u0026quot;起始颁发机构\u0026quot; SOA 中，记录了这个 Zone 中 DNS 服务器是那一台主机，也记录着负责本 zone 的管理员的邮件地址，如果以后在安装邮件服务器需要修改该信息时，注意将邮件地址中的 \u0026ldquo;@\u0026rdquo; 符改为句点 \u0026ldquo;.\u0026rdquo; ，因为 \u0026ldquo;@\u0026rdquo; 是保留字，代表 zone；另外，要使用域完整名称 FQDN，不要漏掉最后的句点。可以通过 \u0026ldquo;zone→属性→起始颁发机构\u0026quot;对管理员邮件地址进行修改。\n","permalink":"https://ohoo.dev/post/linux/domain_dns_info_detail/","summary":"\u003cblockquote\u003e\n\u003cp\u003e域名解析类型详解\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"1主机a记录\"\u003e1.主机[A]记录\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e描述: 主机地址记录。在 DNS 域名与 IP 地址之间建立映射关系\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e语法:  owner class ttl A IP_v4_address\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e例子: host1.example.microsoft.com. IN A 127.0.0.1\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"2别名cname\"\u003e2.别名[CNAME]\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e描述: 用来表示用在该区域中的其它资源记录类型中已指定名称的替补或别名 DNS 域名。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e语法: owner ttl class AFSDB subtype server_host_name\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e例子: aliasname.example.microsoft.com. AFSDB 1 truename.example.microsoft.com.\u003c/p\u003e","title":"域名解析类型详解 / Domain DNS info detail"},{"content":"Mac OS-[xxx.app已损坏,打不开.你应该将它移到废纸篓] 出现这个问题的解决方法：\n修改系统配置： 1 系统偏好设置... -\u0026gt; 安全性与隐私 -\u0026gt; 修改为任何来源 如果没有这个选项的话（macOS Sierra 10.12）,打开终端，执行: 1 2 3 4 5 # 此命令为 关闭苹果的Gatekeeper, 其实是有被攻击的风险的 # 参考维基百科 https://en.wikipedia.org/wiki/Gatekeeper_(macOS) sudo spctl --master-disable ","permalink":"https://ohoo.dev/post/mac/fix_mac_application_cannot_open/","summary":"\u003ch2 id=\"mac-os-xxxapp已损坏打不开你应该将它移到废纸篓\"\u003eMac OS-[xxx.app已损坏,打不开.你应该将它移到废纸篓]\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e出现这个问题的解决方法：\u003c/p\u003e\u003c/blockquote\u003e\n\u003cul\u003e\n\u003cli\u003e修改系统配置：\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    系统偏好设置... -\u0026gt; 安全性与隐私 -\u0026gt; 修改为任何来源\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e如果没有这个选项的话（macOS Sierra 10.12）,打开终端，执行:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# 此命令为 关闭苹果的Gatekeeper, 其实是有被攻击的风险的\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# 参考维基百科 https://en.wikipedia.org/wiki/Gatekeeper_(macOS)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    sudo spctl --master-disable\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"macOS 无法打开应用程序 / Fix mac application cannot open"},{"content":" 最近读了一些书，读的速度太快，导致前两本读了啥内容也不比较模糊，遂之索性把书单和主要内容记录下来，方便以后回忆和查阅。\n201908 《领导力21法则》 《OKR工作法则》 《斯坦福极简经济学》 《乌合之众》 《人性的弱点》 《JAVA 并发编程的艺术》 2011909 《解读/量化投资》 ","permalink":"https://ohoo.dev/post/books/which_books_have_you_read/","summary":"\u003cblockquote\u003e\n\u003cp\u003e最近读了一些书，读的速度太快，导致前两本读了啥内容也不比较模糊，遂之索性把书单和主要内容记录下来，方便以后回忆和查阅。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"201908\"\u003e201908\u003c/h2\u003e\n\u003ch3 id=\"领导力21法则\"\u003e《领导力21法则》\u003c/h3\u003e\n\u003ch3 id=\"okr工作法则\"\u003e《OKR工作法则》\u003c/h3\u003e\n\u003ch3 id=\"斯坦福极简经济学\"\u003e《斯坦福极简经济学》\u003c/h3\u003e\n\u003ch3 id=\"乌合之众\"\u003e《乌合之众》\u003c/h3\u003e\n\u003ch3 id=\"人性的弱点\"\u003e《人性的弱点》\u003c/h3\u003e\n\u003ch3 id=\"java-并发编程的艺术\"\u003e《JAVA 并发编程的艺术》\u003c/h3\u003e\n\u003ch2 id=\"2011909\"\u003e2011909\u003c/h2\u003e\n\u003ch3 id=\"解读量化投资\"\u003e《解读/量化投资》\u003c/h3\u003e","title":"书单 / Which books have you read ?"},{"content":"VIM 基本速查表 COPY BY vim-keyboard-shortcuts-cheatsheet\n基本操作 快捷键 功能 Esc 从当前模式转换到“普通模式”。所有的键对应到命令。 i “插入模式”用于插入文字。回归按键的本职工作。 : “命令行模式” Vim 希望你输入类似于保存该文档命令的地方。 方向键 快捷键 功能 h 光标向左移动一个字符 j 或 Ctrl + J 光标向下移动一行 k 或 Ctrl + P 光标向上移动一行 l 光标向右移动一个字符 0 （数字 0）移动光标至本行开头 $ 移动光标至本行末尾 ^ 移动光标至本行第一个非空字符处 w 向前移动一个词 （上一个字母和数字组成的词之后） W 向前移动一个词 （以空格分隔的词） 5w 向前移动五个词 b 向后移动一个词 （下一个字母和数字组成的词之前） B 向后移动一个词 （以空格分隔的词） 5b 向后移动五个词 G 移动至文件末尾 gg 移动至文件开头 浏览文档 快捷键 功能 ( 跳转到上一句 ) 跳转到下一句 { 跳转到上一段 } 跳转到下一段 [[ 跳转到上一部分 ]] 跳转到下一部分 [] 跳转到上一部分的末尾 ][ 跳转到上一部分的开头 插入文本 快捷键 功能 a 在光标后插入文本 A 在行末插入文本 i 在光标前插入文本 o （小写字母 o）在光标下方新开一行 O （大写字母 O）在光标上方新开一行 特殊插入 快捷键 功能 :r [filename] 在光标下方插入文件 [filename] 的内容 :r ![command] 执行命令 [command] ，并将输出插入至光标下方 删除文本 快捷键 功能 x 删除光标处字符 dw 删除一个词 d0 删至行首 d$ 删至行末 d) 删至句末 dgg 删至文件开头 dG 删至文件末尾 dd 删除该行 3dd 删除三行 简单替换文本 快捷键 功能 r{text} 将光标处的字符替换成 {text} R 进入覆写模式，输入的字符将替换原有的字符 复制/粘贴文本 快捷键 功能 yy 复制当前行至存储缓冲区 [\u0026quot;x]yy 复制当前行至寄存器 x p 在当前行之后粘贴存储缓冲区中的内容 P 在当前行之前粘贴存储缓冲区中的内容 [\u0026quot;x]p 在当前行之后粘贴寄存器 x 中的内容 [\u0026quot;x]P 在当前行之前粘贴寄存器 x 中的内容 撤销/重做操作 快捷键 功能 u 撤销最后的操作 Ctrl+r 重做最后撤销的操作 搜索和替换 快捷键 功能 /search_text 检索文档，在文档后面的部分搜索 search_text ?search_text 检索文档，在文档前面的部分搜索 search_text n 移动到后一个检索结果 N 移动到前一个检索结果 :%s/original/replacement 检索第一个 “original” 字符串并将其替换成 “replacement” :%s/original/replacement/g 检索并将所有的 “original” 替换为 “replacement” :%s/original/replacement/gc 检索出所有的 “original” 字符串，但在替换成 “replacement” 前，先询问是否替换 书签 快捷键 功能 m {a-zA-Z} 在当前光标位置设置书签，书签名可用一个大小写字母（{a-zA-Z}） :marks 列出所有书签 {a-zA-Z} 跳转到书签 {a-zA-Z} 选择文本 快捷键 功能 v 进入逐字可视模式 V 进入逐行可视模式 Esc 退出可视模式 改动选中文本 快捷键 功能 ~ 切换大小写 d 删除一个词 c 变更 y 复制 \u0026gt; 右移 \u0026lt; 左移 ! 通过外部命令进行过滤 保存并退出 快捷键 功能 :q 退出 Vim，如果文件已被修改，将退出失败 :w 保存文件 :w new_name 用 new_name 作为文件名保存文件 :wq 保存文件并退出 Vim :x 保存文件并退出,文件未变动时,编辑时间不做变更 :q! 退出 Vim，不保存文件改动 ZZ 退出 Vim，如果文件被改动过，保存改动内容 ZQ 与 :q! 相同，退出 Vim，不保存文件改动 ","permalink":"https://ohoo.dev/post/linux/vim-keyboard-shortcuts-cheatsheet/","summary":"\u003ch2 id=\"vim-基本速查表\"\u003eVIM 基本速查表\u003c/h2\u003e\n\u003ch3 id=\"copy-by\"\u003eCOPY BY\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://www.maketecheasier.com/vim-keyboard-shortcuts-cheatsheet/\"\u003evim-keyboard-shortcuts-cheatsheet\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"基本操作\"\u003e基本操作\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eEsc\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e从当前模式转换到“普通模式”。所有的键对应到命令。\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ei\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e“插入模式”用于插入文字。回归按键的本职工作。\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e“命令行模式” Vim 希望你输入类似于保存该文档命令的地方。\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"方向键\"\u003e方向键\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eh\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e光标向左移动一个字符\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ej\u003c/code\u003e 或 \u003ccode\u003eCtrl + J\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e光标向下移动一行\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ek\u003c/code\u003e 或 \u003ccode\u003eCtrl + P\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e光标向上移动一行\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003el\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e光标向右移动一个字符\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e（数字 0）移动光标至本行开头\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e$\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e移动光标至本行末尾\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e^\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e移动光标至本行第一个非空字符处\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ew\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e向前移动一个词 （上一个字母和数字组成的词之后）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eW\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e向前移动一个词 （以空格分隔的词）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e5w\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e向前移动五个词\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eb\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e向后移动一个词 （下一个字母和数字组成的词之前）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eB\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e向后移动一个词 （以空格分隔的词）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e5b\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e向后移动五个词\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eG\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e移动至文件末尾\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003egg\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e移动至文件开头\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"浏览文档\"\u003e浏览文档\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e(\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e跳转到上一句\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e)\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e跳转到下一句\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e{\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e跳转到上一段\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e}\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e跳转到下一段\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e[[\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e跳转到上一部分\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e]]\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e跳转到下一部分\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e跳转到上一部分的末尾\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e][\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e跳转到上一部分的开头\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"插入文本\"\u003e插入文本\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ea\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e在光标后插入文本\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eA\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e在行末插入文本\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ei\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e在光标前插入文本\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eo\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e（小写字母 o）在光标下方新开一行\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eO\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e（大写字母 O）在光标上方新开一行\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"特殊插入\"\u003e特殊插入\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:r [filename]\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e在光标下方插入文件 [filename] 的内容\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:r ![command]\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e执行命令 [command] ，并将输出插入至光标下方\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"删除文本\"\u003e删除文本\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ex\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删除光标处字符\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003edw\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删除一个词\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ed0\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删至行首\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ed$\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删至行末\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ed)\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删至句末\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003edgg\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删至文件开头\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003edG\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删至文件末尾\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003edd\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删除该行\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e3dd\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删除三行\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"简单替换文本\"\u003e简单替换文本\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003er{text}\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e将光标处的字符替换成 {text}\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eR\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e进入覆写模式，输入的字符将替换原有的字符\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"复制粘贴文本\"\u003e复制/粘贴文本\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eyy\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e复制当前行至存储缓冲区\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e[\u0026quot;x]yy\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e复制当前行至寄存器 x\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ep\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e在当前行之后粘贴存储缓冲区中的内容\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eP\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e在当前行之前粘贴存储缓冲区中的内容\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e[\u0026quot;x]p\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e在当前行之后粘贴寄存器 x 中的内容\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e[\u0026quot;x]P\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e在当前行之前粘贴寄存器 x 中的内容\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"撤销重做操作\"\u003e撤销/重做操作\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eu\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e撤销最后的操作\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eCtrl+r\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e重做最后撤销的操作\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"搜索和替换\"\u003e搜索和替换\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e/search_text\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e检索文档，在文档后面的部分搜索 search_text\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e?search_text\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e检索文档，在文档前面的部分搜索 search_text\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003en\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e移动到后一个检索结果\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eN\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e移动到前一个检索结果\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:%s/original/replacement\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e检索第一个 “original” 字符串并将其替换成 “replacement”\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:%s/original/replacement/g\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e检索并将所有的 “original” 替换为 “replacement”\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:%s/original/replacement/gc\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e检索出所有的 “original” 字符串，但在替换成 “replacement” 前，先询问是否替换\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"书签\"\u003e书签\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003em {a-zA-Z}\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e在当前光标位置设置书签，书签名可用一个大小写字母（{a-zA-Z}）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:marks\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e列出所有书签\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e{a-zA-Z}\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e跳转到书签 {a-zA-Z}\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"选择文本\"\u003e选择文本\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ev\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e进入逐字可视模式\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eV\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e进入逐行可视模式\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eEsc\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e退出可视模式\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"改动选中文本\"\u003e改动选中文本\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e~\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e切换大小写\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ed\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e删除一个词\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ec\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e变更\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003ey\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e复制\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e\u0026gt;\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e右移\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e\u0026lt;\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e左移\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e!\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e通过外部命令进行过滤\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"保存并退出\"\u003e保存并退出\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e快捷键\u003c/th\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:q\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e退出 Vim，如果文件已被修改，将退出失败\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:w\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e保存文件\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:w new_name\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e用 new_name 作为文件名保存文件\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:wq\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e保存文件并退出 Vim\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:x\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e保存文件并退出,文件未变动时,编辑时间不做变更\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e:q!\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e退出 Vim，不保存文件改动\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eZZ\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e退出 Vim，如果文件被改动过，保存改动内容\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eZQ\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e与 :q! 相同，退出 Vim，不保存文件改动\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"VIM快捷键 / Vim Keyboard Shortcuts Cheatsheet"},{"content":"批量删除HDFS上无效的临时文件 需求：当前日期下的临时目录不删除（可能存在正在运行的临时文件），通过日期过滤dir将非当前日期的dir进行删除 第一版 由于hdfs删除效率太低，删除一个文件需要 1-2S 完全无法忍受 PB的数据等待删除 1 2 3 4 5 6 7 for line in $(hdfs dfs -ls /user/wangping/_sqoop/ |grep -v `date +%Y-%m-%d`|awk -F \u0026#39; /\u0026#39; \u0026#39;{print $2}\u0026#39;) do dir=/${line} echo \u0026#34;drop sqoop hdfs tmp dir: ${dir}\u0026#34; `hdfs dfs -rm -r ${dir}` done 第二版 中间想一次性加载所有目录一次删除，发现我发遍历初所有待删除目录（太鸡儿多了） 通过批量执行删除脚本，一千为批次的进行删除执行时间依旧一次删除时间为1-3S左右，效率提高不是一个数量级 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 dirs=\u0026#34;\u0026#34; size=0 for line in $(hdfs dfs -ls /user/wangping/_sqoop/ |grep -v `date +%Y-%m-%d`|awk -F \u0026#39; /\u0026#39; \u0026#39;{print $2}\u0026#39;) do let \u0026#34;size++\u0026#34; dir=/${line} echo \u0026#34;drop sqoop hdfs tmp dir: ${size} ${dir}\u0026#34; dirs=${dirs}\u0026#34; \u0026#34;${dir} #echo ${size} if [[ `expr ${size} % 1000` == 0 ]]; then echo \u0026#34;dirs:\u0026#34; ${dirs} hdfs dfs -rm -r ${dirs} dirs=\u0026#34;\u0026#34; fi # `hdfs dfs -rm -r ${dir}` done echo ${dirs} hdfs dfs -rm -r ${dirs} 到此 批量删除的工作告一段落 涨知识： 1，shell 中的计算变量 2，shell 中的自增变量\n","permalink":"https://ohoo.dev/post/bigdata/batch_delete_hdfs_dir/","summary":"\u003ch2 id=\"批量删除hdfs上无效的临时文件\"\u003e批量删除HDFS上无效的临时文件\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003e需求：当前日期下的临时目录不删除（可能存在正在运行的临时文件），通过日期过滤dir将非当前日期的dir进行删除\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"第一版\"\u003e第一版\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e由于hdfs删除效率太低，删除一个文件需要 1-2S 完全无法忍受 PB的数据等待删除\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e line in \u003cspan class=\"k\"\u003e$(\u003c/span\u003ehdfs dfs -ls /user/wangping/_sqoop/ \u003cspan class=\"p\"\u003e|\u003c/span\u003egrep -v \u003cspan class=\"sb\"\u003e`\u003c/span\u003edate +%Y-%m-%d\u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003eawk -F \u003cspan class=\"s1\"\u003e\u0026#39; /\u0026#39;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;{print $2}\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003edir\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e/\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eline\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;drop sqoop hdfs tmp dir: \u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003edir\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"sb\"\u003e`\u003c/span\u003ehdfs dfs -rm -r \u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003edir\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"第二版\"\u003e第二版\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e中间想一次性加载所有目录一次删除，发现我发遍历初所有待删除目录（太鸡儿多了）\n通过批量执行删除脚本，一千为批次的进行删除执行时间依旧一次删除时间为1-3S左右，效率提高不是一个数量级\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003edirs\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003esize\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e line in \u003cspan class=\"k\"\u003e$(\u003c/span\u003ehdfs dfs -ls /user/wangping/_sqoop/ \u003cspan class=\"p\"\u003e|\u003c/span\u003egrep -v \u003cspan class=\"sb\"\u003e`\u003c/span\u003edate +%Y-%m-%d\u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003eawk -F \u003cspan class=\"s1\"\u003e\u0026#39; /\u0026#39;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;{print $2}\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003elet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;size++\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003edir\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e/\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eline\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;drop sqoop hdfs tmp dir: \u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003esize\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003edir\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003edirs\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003edirs\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003edir\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#echo ${size}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"sb\"\u003e`\u003c/span\u003eexpr \u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003esize\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e % 1000\u003cspan class=\"sb\"\u003e`\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dirs:\u0026#34;\u003c/span\u003e \u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003edirs\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        hdfs dfs -rm -r \u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003edirs\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003edirs\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#    `hdfs dfs -rm -r ${dir}`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003edirs\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehdfs dfs -rm -r \u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003edirs\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"到此-批量删除的工作告一段落\"\u003e到此 批量删除的工作告一段落\u003c/h3\u003e\n\u003cp\u003e涨知识：\n1，shell 中的计算变量\n2，shell 中的自增变量\u003c/p\u003e","title":"批量删除HDFS上无效的临时文件 / Batch delete hdfs dir"},{"content":"2019 FLAG 🚩 2018 明明知道自己要干什么，却时而缺乏执行能力，2019强化自我执行能力，学会规划，养成阅读习惯，自我记录与思考；\n考研 这是一年后的又一次尝试，但这次提前准备，结果一定不会差。\n数学是考研的一道大坎了，这势必要啃下来！ 英语语法还是有薄弱的，需要啃一本语法书（需要规划进执行力行动中），单词每周都会背， 但是需要一个检验环节（执行力行动加入单词默写/短文阅读批注行动） 从之前的考试来看，专业的内容多为项目工程的内容，算法大多为基础数据结构和基础排序，虽然不在话下， 但是考虑到工作需要，在准备环节需要适当加强技能巩固； 职业 what i want? 现在的公司肯定不是我想留下来的，其实已经落后了，虽然表面上说是形势原因， 但内心真实的内容是自己在2018年的执行力欠佳的主要原因，2019稳住自己，能战胜自己的人，就没有人能无法超越；\n学会 GOLAN and RUST K8S 精通 算法 100题使用 java/golan 通刷（主要总结算法思想及相关算法适用案例） github 提交（执行力计划，编年史汇结内容感想） 参与一个开源项目开发 软件架构案例学习与思考（两周一次） 学会沟通 做一个有趣的人，干一些有趣的事情；\n","permalink":"https://ohoo.dev/post/summary/2018-summary/","summary":"\u003ch2 id=\"2019-flag-\"\u003e2019 FLAG 🚩\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e2018 明明知道自己要干什么，却时而缺乏执行能力，2019强化自我执行能力，学会规划，养成阅读习惯，自我记录与思考；\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch3 id=\"考研\"\u003e考研\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cp\u003e这是一年后的又一次尝试，但这次提前准备，结果一定不会差。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cul\u003e\n\u003cli\u003e数学是考研的一道大坎了，这势必要啃下来！\u003c/li\u003e\n\u003cli\u003e英语语法还是有薄弱的，需要啃一本语法书（需要规划进执行力行动中），单词每周都会背， 但是需要一个检验环节（执行力行动加入单词默写/短文阅读批注行动）\u003c/li\u003e\n\u003cli\u003e从之前的考试来看，专业的内容多为项目工程的内容，算法大多为基础数据结构和基础排序，虽然不在话下， 但是考虑到工作需要，在准备环节需要适当加强技能巩固；\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"职业\"\u003e职业\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewhat i want?\n现在的公司肯定不是我想留下来的，其实已经落后了，虽然表面上说是形势原因， 但内心真实的内容是自己在2018年的执行力欠佳的主要原因，2019稳住自己，能战胜自己的人，就没有人能无法超越；\u003c/p\u003e","title":"2018 总结"},{"content":"ubuntu18.xx 中修改 mysql 数据库默认字符编码 今天更换meriadb 为mysql 之后发现 springboot jpa存入数据库中的字符是乱码，看了下问题为mysql字符编码不是 utf-8了 ubuntu18 默认mysql配置文件地址 sudo vim /etc/mysql/conf.d/mysql.cnf\n编辑文件内容 1 2 3 4 5 6 7 8 9 10 [mysql] default-character-set=utf8 [client] default-character-set=utf8 [mysqld] collation-server = utf8_unicode_ci init-connect=\u0026#39;SET NAMES utf8\u0026#39; character-set-server = utf8 重启mysql sudo service mysql restart\n注意 如果已经存在的库中乱码，手动重设字符编码/删除重建; ","permalink":"https://ohoo.dev/post/mysql/modify_ubuntu18_mysql_default_character_to_utf8/","summary":"\u003ch2 id=\"ubuntu18xx-中修改-mysql-数据库默认字符编码\"\u003eubuntu18.xx 中修改 mysql 数据库默认字符编码\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e今天更换meriadb 为mysql 之后发现 springboot jpa存入数据库中的字符是乱码，看了下问题为mysql字符编码不是 utf-8了\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ubuntu18-默认mysql配置文件地址\"\u003eubuntu18 默认mysql配置文件地址\u003c/h3\u003e\n\u003cp\u003esudo vim /etc/mysql/conf.d/mysql.cnf\u003c/p\u003e\n\u003ch3 id=\"编辑文件内容\"\u003e编辑文件内容\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003emysql\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edefault-character-set\u003cspan class=\"o\"\u003e=\u003c/span\u003eutf8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003eclient\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edefault-character-set\u003cspan class=\"o\"\u003e=\u003c/span\u003eutf8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003emysqld\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecollation-server \u003cspan class=\"o\"\u003e=\u003c/span\u003e utf8_unicode_ci\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einit-connect\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;SET NAMES utf8\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echaracter-set-server \u003cspan class=\"o\"\u003e=\u003c/span\u003e utf8\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"重启mysql\"\u003e重启mysql\u003c/h3\u003e\n\u003cp\u003esudo service mysql restart\u003c/p\u003e","title":"ubuntu18.xx 中修改 mysql 数据库默认字符编码"},{"content":"解锁正确的缓存姿势 1. 常见概念\n在合理应用缓存前，需要了解缓存领域里相关的几个常用术语：\n1）缓存命中：表示数据能够从缓存中获取，不需要回源；\n2）Cache miss：表示没有命中缓存，如果缓存内存中还有内存空间的话，会将数据加入到缓存中；\n3）存储成本：当没有命中缓存时，回源获取后会将数据放置到存储中，整个将数据放置到存储空间所需要的时间以及空间称之为存储成本；\n4）缓存失效：当源数据发生变更后，意味着缓存中的数据失效；\n5）缓存污染：将不经常访问的数据放置到缓存存储空间中，以至于高频访问的数据无法放置到缓存中；\n6）替代策略：当数据放置到缓存空间时，由于空间不足时，就需要从缓存空间中去除已有的数据，选择去除哪些数据就是由替代策略决定的。常见的替代策略有如下这些：\nLeast-Recently-Used（LRU）\nLeast-Frequently-Used（LFU）\nSIZE\nFirst in First Out（FIFO）\n由于存储空间有限，替代策略要解决的核心问题是尽量保留高频访问的缓存数据，降低缓存污染以提升缓存命中率和整体的缓存效率，难点在于，需要基于数据历史访问情况，以一种合适的对未来访问情况的预估才能找到更佳的策略。 2. 访问缓存场景 分析\n使用缓存通常的操作是，请求先访问缓存数据，如果缓存中不存在的话，就会回源到数据库中然后将数据写入到缓存中；如果存在的话就直接返回数据。从整个过程来看，缓存层就处于数据访问的前置环节，分担数据库在高并发容易出现系统故障的风险，所以在使用过程中需要对缓存层很谨慎的进行分析。在访问缓存数据时，有常见的三大场景：缓存穿透、缓存击穿以及缓存雪崩。\n2.1 缓存穿透\n现象： 每次请求直接穿透缓存层，直接回源到数据库中，给数据库带来了巨大访问压力，甚至宕机。\n原因： 访问数据会先访问缓存，如果数据不存在缓存中才会查询数据库，但是如果查询数据库也查询不出来数据，也是说当前访问数据永远不会写入缓存中。这样就导致了，访问一定不存在的数据，就相当于缓存层形同虚设，每次请求都会到db层，造成数据库负担过大。\n解决方案：\n方案一：采用bloom filter保存缓存过的key，在访问请求到来时可以过滤掉不存在的key，防止这些请求到db层； 方案二：如果db查询不到数据，保存空对象到缓存层，设置较短的失效时间； 方案三：针对业务场景对请求的参数进行有效性校验，防止非法请求击垮db。 2.2 缓存击穿\n现象： 当某一key失效时，造成大量请求到db层，击垮存储层。\n原因： 为了保证缓存数据的时效性，通常会设置一个失效时间，如果是热点key，高并发时会有海量请求直接越过缓存层到数据库，这样就会给数据库造成的负担增大，设置宕机。\n解决方案\n方案一：使用互斥锁，当缓存数据失效时，保证一个请求能够访问到数据库，并更新缓存，其他线程等待并重试； 方案二：缓存数据“永远不过期”，如果缓存数据不设置失效时间的话，就不会存在热点key过期造成了大量请求到数据库。但是，缓存数据就变成“静态数据”，因此当缓存数据快要过期时，采用异步线程的方式提前进行更新缓存数据。 2.3 缓存雪崩\n现象： 多个key失效，造成大量请求到db层，导致db层负担过重甚至宕机。\n原因： 缓存雪崩是指在我们设置缓存时采用了相同的过期时间，导致缓存在某一时刻同时失效，请求全部转发到数据库，最终导致数据库瞬时压力过大而崩溃。\n解决方案：\n方案一：使用互斥锁的方式，保证只有单个线程进行请求能够达到db； 方案二：多每个key的失效时间在基础时间上再加上一个1~5分钟的随机值，这样就能保证大规模key集体失效的概率，并且需要尽量让多个key的失效时间能够均匀分布； 2.4 总结\n缓存穿透、缓存击穿以及缓存雪崩这三个术语很容易弄混，也是读缓存中典型的三个场景问题，做一下简单的总结是很有必要的。缓存穿透强调是获取本不存在的缓存数据，请求必然会越过缓存层直接到达到存储层，很明显这是利用业务规则的漏洞对系统发起攻击，解决方案的核心原则是过滤这些非法业务请求，与是否是热点数据、缓存失效时间等因素没有关系。\n缓存击穿强调的是热点key的失效，导致某一时刻大量请求会直接到db层，解决方案的核心原则是规避数据库的并发操作。缓存雪崩强调的多个key的集体失效，与key是否是热点数据并不是必然的因素，解决方案的核心原则则让key之间的失效时间分布更加均匀，避免集体失效的情况。\n3 数据更新场景分析\n引入缓存后数据会分别存放到缓存以及数据库两个地方，因此数据更新时，需要涉及到这两处地方得更新，并且更新时序的不同会有不同的结果。关于数据更新目前业界已经沉淀了Cache Aside Pattern，Read/Write through等多种方式。\n3.1 Cache Aside Pattern\n这是很通用的更新策略，主要流程如下： 图片来源：\n酷 壳 - CoolShell 1\n缓存更新的套路 | | 酷 壳 - CoolShell 1 看到好些人在写更新缓存数据代码时，先删除缓存，然后再更新数据库，而后续的操作会把数据再装载的缓存中。然而，这个是逻辑是错误的。试想，两个并发操作，一个是更新操作，另一个是查询操作，更新操作删除缓存后，查询操作没有命中缓存，先把老数据读出来后放到缓存中，然后更新操作更新了数据库。于是，在缓存中的数据还是老的数据，导致缓存中的数据是脏的，而且还一直这样脏下去了。 我不知道为什么这么多人用的都是这个逻辑\n主要涉及到如下几点：\n失效：应用程序先从cache取数据，没有得到，则从数据库中取数据，成功后，放到缓存中。\n命中：应用程序从cache中取数据，取到后返回。\n更新：先把数据存到数据库中，成功后，再让缓存失效。\nCache Aside Pattern在数据更新的时候是采用先更新数据库，再失效缓存。为什么需要采用这样的方式来解决数据更新的问题，先假设更新数据库以及缓存都会事务成功，由于某一种更新导致的不一致性在下一章节进行讨论。\n1）为什么不是更新缓存，而是失效（删除）缓存？\n❶ 并发写容易写覆盖造成脏数据问题：当数据发生更新的时候，针对缓存数据可以有两种方式来进行处理分别是更新缓存数据以及失效数据让下一次读请求重新从db中获取数据后重载入缓存中。假设更新缓存数据的话，在并发情况下会存在多线程写缓存造成脏数据的问题，如下图：\n[\nimage1022×688 66.9 KB\n](https://springboot.io/uploads/default/original/1X/8f90f845a889bffb0b5b0951cf9657b2049f1322.png \u0026ldquo;image\u0026rdquo;)\n如上图所示，假设A、B两个线程，A先更新数据库后 B再更新数据库，然后分别进行更新缓存，但是B先更新缓存成功，A后更新缓存成功，这样就导致数据库是最新的数据但是缓存中是旧的脏数据。而如果失效缓存数据的话，可以保证下一次读请求回源到数据库将最新的数据载入到缓存中，避免脏数据的问题。因此，针对数据更新缓存采用失效的方式进行处理，也可以参考这篇文章《Why does Facebook use delete to remove the key-value pair in Memcached instead of updating the Memcached during write request to the backend?》。\n❷ 双写不同数据源容易造成数据不一致：同时写数据库以及缓存数据，任何一个更新失败都会造成数据不一致，由于“物理失败”造成的数据不一致在下一个章节进行阐述。另外事务都成功，无论是先更新缓存还是再更新数据库，还是先更新数据库再更新缓存，这两种情况在并发的情况下也很容易出现双写不成功，操作时序如下图，这种方式不推荐。\n❸ 先更新缓存再更新数据库\n[\nimage1022×744 83.4 KB\n](https://springboot.io/uploads/default/original/1X/9778e8dc1cdc99e3bbc4cd8953b2525c85f75c48.png \u0026ldquo;image\u0026rdquo;)\n❺ 违背数据懒加载，避免不必要的计算消耗：如果有些缓存值是需要经过复杂的计算才能得出，所以如果每次更新数据的时候都更新缓存，但是后续在一段时间内并没有读取该缓存数据，这样就白白浪费了大量的计算性能，完全可以后续由读请求的时候，再去计算即可，这样更符合数据懒加载，降低计算开销。\n2）可能存在的更新时序？\n在确定数据更新后缓存会失效来进行处理的话，针对数据库以及缓存更新时序就存在如下这几种：\n❶ 先失效缓存再更新数据库\n[\nimage1022×734 85.9 KB\n](https://springboot.io/uploads/default/original/1X/f59ec15765825daded7ec8c008e5f9b53182dc8d.png \u0026ldquo;image\u0026rdquo;)\n❷ 假设在并发的情况下，按照这种更新时序会存在什么问题？\n如时序图所示，线程A先失效缓存数据的时候，B线程读请求发现缓存数据为空的话，就会从数据库中读取旧值放入到缓存中，这样就导致后续的读请求读到的都是缓存中的脏数据。针对这样的情况可以采用延时双删的策略来有效避免，伪代码 如下：\ncache.delKey(key);\ndb.update(data);\nThread.sleep(xxx);\ncache.delKey(key);\n主要是在写请求更新完数据库后进行休眠一段时间，然后删除可能由读请求带来的脏数据存入到缓存。另外，数据库如果采用的是主从分离的架构的话，读出来的数据也有可能是主从未同步完成造成的脏数据。这种通过延时双删的方式需要线程休眠，因此很显然会降低系统吞吐量，并不是一种优雅的解决方式，也可以采用异步删除的方式。当然可以设置过期时间，到期后缓存失效载入最新的数据，需要系统能够容忍一段时间的数据不一致。\n❸ 先更新数据库再失效缓存 ：这是推荐的更新数据时采用的方式，实际上这也是可能存在数据不一致的情况，时序图如下：\n[\nimage1022×876 103 KB\n](https://springboot.io/uploads/default/original/1X/c0d00b0c526449cabc5e23b99b51e1fcd7188cf2.png \u0026ldquo;image\u0026rdquo;)\n❹ 假设缓存刚好到期失效时，读请求从db中读取数据，写请求更新完数据后再失效缓存后，读请求将旧数据存入到缓存中，这种情况也会导致脏数据的问题。实际上这种情况发生的概率很低，要发生这种情况的前提条件是写数据库要先于读数据库完成，一般而言读数据库相比于写数据库要耗时更短，这种前提条件成立的概率很低。针对这种”逻辑失败“造成的数据不一致，可以采用上面所说的异步双删的策略以及过期失效的方式来避免。\n可以看出在并发的情况下，如果条件苛刻的话，这两种更新的时序都有可能导致脏数据的情况。只不过在大概率的情况下先更新数据库再失效缓存能够保证数据一致，也是业界推荐的处理方式，包括Facebook的论文《Scaling Memcache at Facebook》也使用了这个策略。当数据发生变更上，需要考虑的是最新的数据放置在哪里？很显然cache aside pattern 选择的是将最新的数据放到了db上（cache asside pattern：缓存靠边站），因为数据不一致的情况大概率会存在，需要根据业务场景选择合适的可信设备存储最新的数据。\n3.2 Write/Read Through\nCache Aside Pattern对db以及缓存的更新逻辑是由调用方自己去控制，很显然这是一个很复杂的过程。Write/Read Through对调用方而言，缓存是作为整个的数据存储，而不用关系缓存后面的db，数据库的更新则是由缓存统一进行管理，对调用方而言只需要和缓存进行交互，整体过程是透明的。\nRead Through：当数据发生更新时，查询缓存时更新缓存，然后由缓存层同步的更新数据库即可，对调用方而言只需要和缓存层交互即可；\nWrite Through：Write Through 套路和Read Through相仿，不过是在更新数据时发生。当有数据更新的时候，如果没有命中缓存，直接更新数据库，然后返回。如果命中了缓存，则更新缓存，然后再由Cache自己同步更新数据库。如下图所示（来源于网络）：\n[\nimage460×620 95 KB\n](https://springboot.io/uploads/default/original/1X/9c5e42bf33aab4b0399247e0611627e3fe018d24.png \u0026ldquo;image\u0026rdquo;)\n3.3 Write Behind Cache Pattern\n这种模式是当数据更新的时候直接更新缓存数据，然后建立异步任务去更新数据库。这种异步方式请求响应会很快，系统的吞吐量会明显提升。但是，因为是异步更新数据库，数据一致性的保障就会变弱，如果更新数据库失败则会永远的造成系统脏数据，需要很精细设计系统重试的策略，另外如果异步服务宕机的话，还要考虑更新的数据如何持久化，服务重启后能够迅速恢复。在更新数据库时，由于并发多任务的存在，还需要考虑并发写是否会造成脏数据的问题，就需要追溯每次更新数据的时序。使用这种模式需要考虑的细节会有很多，设计出一套好的方案是件很不容易的事情。\n3.4 更新策略的思考\n上面这四种更新策略是非常经典的，也是业界经过大规模业务总结下来的经验，如果认真分析这四种更新策略的话，也会是受益匪浅，在更新策略的设计我得理解是主要关注如下两个方面：\n最新的数据应该放置在哪里？\n缓存的存在是为了系统高性能，利用内存的IO读取的高速的特性，来提升系统的性能，提高系统吞吐量，另外，缓存的存在会让一部分读请求不会到达db层，分解了db的压力，毕竟db是最容易出现瓶颈的地方。这是为什么利用缓存的两个重要原因。但是，带来的问题就是，数据会存在在两个地方分别是缓存以及数据库中，当数据更新的时候就需要思考让”正确的数据应该放在哪个最可信的存储介质上“，就需要结合业务性质在两个数据存储介质上进行选择。\nCache Aside Pattern选择先更新数据库，再失效缓存，这样可以保证最新最正确的数据一定会落在数据库中，这样可以保证核心的业务数据在数据库中一定是可信的，但是带来的问题是业务逻辑更复杂，系统处理更新逻辑耗时更长。如果是非核心数据的更新，可以选择write behind cache pattern的方式，只需要更新缓存即可，能够快速的响应。缺点是很容易造成数据不一致，数据库中的数据不一定的就是最可信的数据。所以，不同的更新策略实际上也是将最新的数据优先选择放在哪里更合适以及系统性能的一种权衡，需要结合业务场景做好trade-off。\n4. 数据不一致性\n4.1 数据不一致的原因 由于引入缓存，数据就会分散在两处不同数据源，当数据更新时，实时上很难做到数据一致，除非采用强一致性方案，这里不在进行讨论。在找出合适的解决方案前，需要分析下存在数据不一致的主要原因，才能对症下药：\n1）逻辑失败造成的数据不一致： 在上一章主要分析了更新数据时的四种更新策略，在并发的情况下，无论是先删除缓存还是更新数据库，还是更新数据库再失效缓存，都会数据不一致的情况，主要是因为异步读写请求在并发情况下的操作时序导致的数据不一致，称之为”逻辑失败“。解决这种因为并发时序导致的问题，核心的解决思想是将异步操作进行串行化。\n2）物理失败造成的数据不一致： 在cache aside pattern中先更新数据库再删除缓存以及异步双删策略等等，如果删除缓存失败时都出现数据不一致的情况。但是数据库更新以及缓存操作是没办法放到一个事务中，一般来说，使用缓存是分布式缓存如果缓存服务很耗时，那么将更新数据库以及失效缓存放到一个事务中，就会造成大量的数据库连接挂起，严重的降低系统性能，甚至会因为数据库连接数过多，导致系统崩溃。像这种因为缓存操作失败，导致的数据不一致称之为”物理失败“。大多数情况物理失败的情况会重用重试的方式进行解决。\n4.2 数据一致性的解决方案\n在绝大部分业务场景中，追求的是最终一致性，针对物理失败造成的数据不一致常用的方案有：消费消息异步删除缓存以及订阅Binlog的方式，针对逻辑失败造成的数据不一致常用的方案有：队列异步操作同步化。\n4.2.1 消费消息异步删除缓存\n主要流程如下图所示：\n[\nimage856×658 77.4 KB\n](https://springboot.io/uploads/default/original/1X/21568ed0f6820e9b06af8d38d93573e928fa5b11.png \u0026ldquo;image\u0026rdquo;)\n4.2.2 订阅Binlog\n主要流程如下图所示：\n[\nimage922×916 112 KB\n](https://springboot.io/uploads/default/original/1X/711ac87f1d86a36267d3402094521fb31bf0c2ac.png \u0026ldquo;image\u0026rdquo;)\n4.2.3 利用队列串行化\n在分析cache aside pattern发现在并发的情况下也会存在数据不一致的场景，只不过发生的概率很低，另外如果先删除缓存再更新数据库在并发读写的情况下也会存在数据不一致的情况。类似这种由于并发时序导致的数据不一致的情况，都是因为写请求还没有结束读请求读取的是旧数据，如果读请求在写请求之后处理，即请求的处理能够串行化的话，就能保证读请求读到的是写请求更新的最新的数据。\n将请求进行串行化，最常用的方式是采用队列的方式，一个队列只能对应一个工作线程，更新数据的写请求放置队列中，等待异步处理；读请求如果能从缓存中获取数据，则返回，如果缓存中没有数据，就将读请求放置到队列中，等待写请求数据更新完成。这种方案需要考虑的问题有：\n1）读请求长时间阻塞： 如果队列中挤压了多个写请求，则读请求会存在长时间阻塞的情况，需要设置超时处理策略，一旦超过超时时间，则直接读取数据库返回，避免长时间不响应；另外，在业务中需要进行压测，考虑队列中在峰值情况下会积攒多少写请求，如果过多，需要考虑队列优化的方式和相应的解决方案；\n2）多个队列分散压力： 可以根据数据项通过hash等路由方式，创建多个队列并行执行来提升系统吞吐量；\n3）操作复杂需要考虑全面： 由于采用队列来进行串行化，那么要考虑队列的可用性，队列阻塞以及服务挂掉后的容灾恢复策略是否健壮等等，相对而言整体的方案需要考虑的点会有很多；\n这种方式可以做到数据强一致性，由于串行化系统的吞吐量会下降很多并且操作复杂，毕竟任何方案都会有利弊权衡的过程，需要根据业务场景选择合适的技术方案。针对数据强一致性很有很多方案，但基本上操作设计都很复杂，在大多数业务场景满足数据最终一致性即可。\n当然除了以上这三种通用的方法外，为缓存设置过期时间以及定时全量同步，也是接近最终一致性的最简单以及有效的方式。\n5. 常见的几个场景问题\n在分析数据更新的策略后发现正确使用缓存是一件很不容易的事情，在实际使用缓存时，还会有很多有意思的场景（”坑“），在这里进行一下总结：\n1）过期还是不过期缓存数据： 针对缓存数据是否需要设置过期时间也需要结合场景来进行分析，一些长尾商品，大多数数据在业务中都是读场景更多，并且缓存空间很大的话，就可以考虑不过期数据。那是否就意味着这就是一份静态数据了？当缓存空间已满时，数据会根据淘汰策略移除缓存，另外数据更新时也可以通过Binlog等其他方式进行异步失效缓存。\n如果系统通过消息异步更新操作成本过高或者依赖于外部系统无法进行订阅binlog异步更新的话，就需要来采用过期缓存数据来保障数据最终一致性。\n2）维度化缓存与增量更新 ：如果一个实体包含多个属性，在实体发生变更时，如果将所有的属性全部更新一遍，这个成本就很高，况且只是其中的几个属性发生变化。因此，将多个属性进行各个维度化进行拆解，按照多维度进行缓存，更新时只需要增强更新对应维度即可；\n3）大value： 大value的问题要时刻警惕，可以考虑将value进行压缩，以及缓存时进行拆解，然后在业务服务中进行数据聚合来避免大value的问题；\n4）热点缓存问题： 针对热点数据如果每次都从远程缓存去获取，会给缓存系统带来过多的负载，会导致获取缓存数据响应过慢，可以使用缓存集群，挂载更多的从缓存，读取数据从从缓存中获取。针对热点数据可以使用应用本地缓存来减少对远程缓存的请求负载；\n5）数据预热： 可以预先将数据加载到缓存中，方式缓存数据为空，大量的请求回源到db。如果容量很高可以考虑全量预热，如果容量优先，就只能选择高频热点数据进行数据预热，还需要关注是否有批量操作以及慢sql带来的性能问题，在整个数据预热过程中需要有可靠的监控机制来保障；\n6）非预期热点数据： 针对业务预估不足的热点数据，需要有热点发现系统来统计热点key，实时监控非预期的热点数据，可以将这些key推到本地缓存中，防止预估不足的热点key拖垮远程缓存服务。\n7）缓存实例故障快速恢复： 当某一个缓存实例故障后，缓存一般是采用分片实例存储，假设缓存key路由策略采用的取模机制的话，会导致当前实例的流量迅速到达db层，这种情况可以采用主从机制，当一个实例故障后其他实例可以使用，但是这种方式的问题在于水平扩展不够，如果分片实例上增加一个节点的话，会导致缓存命中率迅速下降。\n如果key路由策略采用的一致性哈希的话，某一个实例节点故障，只会导致哈希环上的部分缓存不命中不会导致大量请求到达db，但是针对热点数据的话，可能会导致改节点负载过高成为系统瓶颈。针对实例故障恢复的方式有：1. 主从机制，对数据进行备份，尽可能保障有可用数据；2. 服务降低，新增缓存实例然后异步线程预热数据；3. 可以先采用一致性哈希路由策略，当出现热点数据时到达某个阈值时降级为取模的策略。\n6. 几个影响因素\n影响缓存整体的性能会有很多大大小小的影响因素，比如语言本身的特性的影响，例如Java需要考虑GC的影响。还需要尽可能的提升缓存命中率等等多个方面，总结下来，核心的几个影响因素如下：\n1）提升缓存命中率：影响缓存命中率的几个因素：\n❶ 业务时效性要求：缓存适合\u0026quot;读多写少\u0026quot;的业务场景，并且业务性质决定了时效性要求，不同的时效性要求决定了缓存的更新策略以及过期时间，对时效性也低的业务越适合使用缓存，并且缓存命中率越高；\n❷ 缓存粒度设计：通常而言，缓存对象粒度越小就越适合使用缓存，不会导致频繁更新导致缓存命中率下降；\n❸ 缓存淘汰策略：如果缓存空间有限，不同的缓存淘汰策略也会影响缓存命中率，如果淘汰的缓存数据后续被大量使用，无疑就会降低缓存命中率；\n❹ 缓存部署方式：在使用分布式缓存时，要做好容量规划以及容灾策略，方式缓存实例故障后造成大规模缓存失效；\n❺ Key路由策略：不同路由策略会在节点实例故障后带来不同的影响，如果采用取模的方式水平扩展时则会降低缓存命中率。通过这些分析，提高缓存命中率没有放之四海而皆准的统一规则，需要从这些角度去思考，尽可能的在高频访问且时效性不是很高的业务数据上使用缓存。\n2）序列化方式：使用远程缓存服务免不了需要经过序列化后在网络中进行数据传输，那么选择不同的序列化方式对缓存性能会有影响。选择序列化方式时需要考虑序列化耗时、序列化后在网络传输中包大小以及序列化的计算开销。\n3）GC影响：采用多级缓存以及大value时会采用应用本地缓存，对于java应用，就需要考虑大对象带来的GC影响。\n4）缓存协议：了解不同的缓存协议的优缺点比如Redis以及Memcached协议，根据业务场景进行选择。\n5）缓存连接池：为提升访问性能，需要合理的设置缓存连接池。\n6）完善的监控平台：需要考虑是否有一套缓存的监控平台，能够追踪缓存使用情况、缓存服务整体的性能以及一些非预期热点数据的发现策略等等，这样才能综合整体的保障缓存服务的可用以及性能。\n7. 多级缓存设计案例\n从用户发出请求到到最底层的数据库实际上会经历很多节点，因此在整个链路上都可以设置缓存，并且按照缓存最近原则将缓存放置在里用户最近的地方提升系统响应的效果最为明显，相应的提升系统吞吐量的效果就越为显著，通过能够大大降低对后端的压力。在整个链路流程里可以添加缓存的地方有：发起请求–\u0026gt;浏览器/客户端缓存–\u0026gt;边缘缓存/CDN–\u0026gt;反向代理（Nginx）缓存–\u0026gt;远程缓存–\u0026gt;进程内缓存–\u0026gt;数据库缓存。服务端多级缓存设计通用的技术方案如下：\n[\nimage1080×1045 183 KB\n](https://springboot.io/uploads/default/original/1X/62c28a656bc43fbf977535e0cb884ed9079acd64.jpeg \u0026ldquo;image\u0026rdquo;)\n主要流程为：\n1）请求先达到Nginx，先读取Nginx本地缓存，如果命中缓存则返回缓存数据。这里的负载均衡路由策略，采用轮询的方式相对而言访问压力分布的更加均衡，一致性哈希方式能够提升缓存命中率，但是同时也会存在单点压力过大的问题，可以考虑使用一致性哈希策略时流量达到一定阈值的时候切换成轮询的方式；\n2）如果没有命中Nginx缓存，则读取分布式缓存，为了高可用以及提升系统吞吐量，一般远程分布式缓存会采用主从结构，这里读取的就是从缓存服务集群数据，如果命中缓存则返回数据；\n3）如果从缓存没有命中缓存，则读取应用本地缓存（堆内/堆外缓存），这里的路由策略同样可以采用轮询或者一致性哈希。如果命中，则返回数据，并回写到Nginx缓存中；为避免由于从缓存服务出现问题，造成过大的流量冲垮数据库，这里可以尝试读取主缓存服务；\n4）如果所有缓存没有命中，则查询数据库并返回数据，并异步回写到主缓存以及应用本地缓存中。主缓存通过主从同步机制同步到从缓存服务集群中。这里会写到主缓存的时候需要考虑多个应用实例在异步写，需要考虑数据是否会乱序的问题。\n另外，对于一些非预期热点数据比如微博中”某某明星结婚“等等热门话题带来的访问流量瞬间冲击到后端，针对以上多级缓存设计，可以通过引入热点发现系统来发现非预期的热点数据，利用flume订阅Nginx日志，然后通过消息进行消费，最后通过storm等实时计算框架进行热点数据的统计，当监控发现到热点数据，将其推送到各个缓存节点上，整体的缓存设计如下：\n[\nimage1080×774 145 KB\n](https://springboot.io/uploads/default/original/1X/497ba489356d01dba6379ad0c4a1878a4fd75482.jpeg \u0026ldquo;image\u0026rdquo;)\n8. 总结\n为了追求高性能，每个开发者最先使用的就是缓存，也在潜意识里将缓存作为了系统性能瓶颈的一剂良药，经过系统化的总结和分析缓存后，就可以发现缓存如果使用不当真的就会事与愿违，成为毒药，并不会系统迭代出那个局部最优解。如果贸然的使用缓存，需要考虑的地方真的很多稍有不注意，反而会让系统投入更多的维护成本，陡增更高的复杂度。那是不是就不使用缓存呢？也不是，缓存在高并发的情况下通过IO高速的缓存获取数据能使得每个请求能够快速响应，并且能够大大提升系统吞吐量以及支撑更高的并发用户数，在现有的高并发大流量的互联网应用中应用缓存的例子太多了，也足以证明缓存在优化系统整体性能是一种行之有效的方案。\n作为开发者不是每个人都有机会和机遇去挑战高并发的互联网架构以及高量级的访问流量和应用规模的，那是不是就意味着这些通用的技术方案就不用深刻分析呢？很显然不是，单从缓存使用中就会发现在高并发下读写带来的数据不一致性分析下来就会有很多并发场景，单线程下都是正常的，但在并发下就会出现很多意想不到的case，而这些分析的思路是最核心的，也是开发者逐渐形成自己的方法论的有效训练途径。在系统化学习每一种技术组件时，业界的通用解决方案都是经过历史经验慢慢沉淀下来的智慧，如同品酒，是需要静下心来好好去品的。\n技术最终是服务于业务价值，而业务规模扩张会反哺技术的创新，要设计出一套适应于业务的合理的技术方案，需要很深的内功，需要既懂技术又要对业务理解十分深刻才行，懂业务而不懂技术，很难知道每种技术方案的局限性，也就是经常所说的PPT架构师，PPT很炫酷，一顿操作猛如虎但是并不是最适合业务的那个解，反而就像是跳梁小丑一样自嗨或者带着功利心去急于变现，只有业务与技术结合能够得到最大价值的那个解就是最合适的方案，需要在优与劣的trade-off上做出权衡。如果很懂技术，但是不懂业务，同样的就是废铜烂铁没办法发挥出功力。在不同的职业生涯阶段，每个人的精力有限，投入技术以及业务的精力分配也是不同的，专注的点会有所不同，就像业务与技术一样，在人生的赛道中在不同阶段也需要迭代出那个最合适的局部最优解，至于什么最合适，答案在每个人心中！\n","permalink":"https://ohoo.dev/post/redis/%E8%A7%A3%E9%94%81%E6%AD%A3%E7%A1%AE%E7%9A%84%E7%BC%93%E5%AD%98%E5%A7%BF%E5%8A%BF/","summary":"\u003ch2 id=\"解锁正确的缓存姿势\"\u003e解锁正确的缓存姿势\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e1. 常见概念\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在合理应用缓存前，需要了解缓存领域里相关的几个常用术语：\u003c/p\u003e\n\u003cp\u003e1）缓存命中：表示数据能够从缓存中获取，不需要回源；\u003c/p\u003e\n\u003cp\u003e2）Cache miss：表示没有命中缓存，如果缓存内存中还有内存空间的话，会将数据加入到缓存中；\u003c/p\u003e","title":"解锁正确的缓存姿势"}]